diff options
Diffstat (limited to 'guest/hals/ril/libril/ril_service.cpp')
-rwxr-xr-x | guest/hals/ril/libril/ril_service.cpp | 9795 |
1 files changed, 0 insertions, 9795 deletions
diff --git a/guest/hals/ril/libril/ril_service.cpp b/guest/hals/ril/libril/ril_service.cpp deleted file mode 100755 index b7b02a6e..00000000 --- a/guest/hals/ril/libril/ril_service.cpp +++ /dev/null @@ -1,9795 +0,0 @@ -/* - * Copyright (c) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "RILC" - -#include <android/hardware/radio/1.5/IRadio.h> -#include <android/hardware/radio/1.5/IRadioResponse.h> -#include <android/hardware/radio/1.5/IRadioIndication.h> -#include <android/hardware/radio/1.5/types.h> - -#include <android/hardware/radio/deprecated/1.0/IOemHook.h> - -#include <hwbinder/IPCThreadState.h> -#include <hwbinder/ProcessState.h> -#include <guest/hals/ril/libril/ril.h> -#include <telephony/ril_mnc.h> -#include <guest/hals/ril/libril/ril_service.h> -#include <hidl/HidlTransportSupport.h> -#include <utils/SystemClock.h> -#include <inttypes.h> - -#define INVALID_HEX_CHAR 16 - -using namespace android::hardware::radio; -using namespace android::hardware::radio::V1_0; -using namespace android::hardware::radio::deprecated::V1_0; -using ::android::hardware::configureRpcThreadpool; -using ::android::hardware::joinRpcThreadpool; -using ::android::hardware::Return; -using ::android::hardware::hidl_bitfield; -using ::android::hardware::hidl_string; -using ::android::hardware::hidl_vec; -using ::android::hardware::hidl_array; -using ::android::hardware::Void; -using android::CommandInfo; -using android::RequestInfo; -using android::requestToString; -using android::sp; - -#define BOOL_TO_INT(x) (x ? 1 : 0) -#define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1) -#define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal) - -#if defined(ANDROID_MULTI_SIM) -#define CALL_ONREQUEST(a, b, c, d, e) \ - s_vendorFunctions->onRequest((a), (b), (c), (d), ((RIL_SOCKET_ID)(e))) -#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest((RIL_SOCKET_ID)(a)) -#else -#define CALL_ONREQUEST(a, b, c, d, e) s_vendorFunctions->onRequest((a), (b), (c), (d)) -#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest() -#endif - -#ifdef OEM_HOOK_DISABLED -constexpr bool kOemHookEnabled = false; -#else -constexpr bool kOemHookEnabled = true; -#endif - -RIL_RadioFunctions *s_vendorFunctions = NULL; -static CommandInfo *s_commands; - -struct RadioImpl_1_5; -struct OemHookImpl; - -#if (SIM_COUNT >= 2) -sp<RadioImpl_1_5> radioService[SIM_COUNT]; -sp<OemHookImpl> oemHookService[SIM_COUNT]; -int64_t nitzTimeReceived[SIM_COUNT]; -// counter used for synchronization. It is incremented every time response callbacks are updated. -volatile int32_t mCounterRadio[SIM_COUNT]; -volatile int32_t mCounterOemHook[SIM_COUNT]; -#else -sp<RadioImpl_1_5> radioService[1]; -sp<OemHookImpl> oemHookService[1]; -int64_t nitzTimeReceived[1]; -// counter used for synchronization. It is incremented every time response callbacks are updated. -volatile int32_t mCounterRadio[1]; -volatile int32_t mCounterOemHook[1]; -#endif - -static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER; - -#if (SIM_COUNT >= 2) -static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER; -#if (SIM_COUNT >= 3) -static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER; -#if (SIM_COUNT >= 4) -static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER; -#endif -#endif -#endif - -void convertRilHardwareConfigListToHal(void *response, size_t responseLen, - hidl_vec<HardwareConfig>& records); - -void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc); - -void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce); - -void convertRilSignalStrengthToHal(void *response, size_t responseLen, - SignalStrength& signalStrength); - -void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, - SetupDataCallResult& dcResult); - -void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, - ::android::hardware::radio::V1_4::SetupDataCallResult& dcResult); - -void convertRilDataCallListToHal(void *response, size_t responseLen, - hidl_vec<SetupDataCallResult>& dcResultList); - -void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records); - -void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType, - RIL_Errno e); - -struct RadioImpl_1_5 : public V1_5::IRadio { - int32_t mSlotId; - sp<IRadioResponse> mRadioResponse; - sp<IRadioIndication> mRadioIndication; - sp<V1_2::IRadioResponse> mRadioResponseV1_2; - sp<V1_2::IRadioIndication> mRadioIndicationV1_2; - sp<V1_3::IRadioResponse> mRadioResponseV1_3; - sp<V1_3::IRadioIndication> mRadioIndicationV1_3; - sp<V1_4::IRadioResponse> mRadioResponseV1_4; - sp<V1_4::IRadioIndication> mRadioIndicationV1_4; - sp<V1_5::IRadioResponse> mRadioResponseV1_5; - sp<V1_5::IRadioIndication> mRadioIndicationV1_5; - - Return<void> setResponseFunctions( - const ::android::sp<IRadioResponse>& radioResponse, - const ::android::sp<IRadioIndication>& radioIndication); - - Return<void> getIccCardStatus(int32_t serial); - - Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin, - const hidl_string& aid); - - Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk, - const hidl_string& pin, const hidl_string& aid); - - Return<void> supplyIccPin2ForApp(int32_t serial, - const hidl_string& pin2, - const hidl_string& aid); - - Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2, - const hidl_string& pin2, const hidl_string& aid); - - Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin, - const hidl_string& newPin, const hidl_string& aid); - - Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2, - const hidl_string& newPin2, const hidl_string& aid); - - Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin); - - Return<void> getCurrentCalls(int32_t serial); - - Return<void> dial(int32_t serial, const Dial& dialInfo); - - Return<void> getImsiForApp(int32_t serial, - const ::android::hardware::hidl_string& aid); - - Return<void> hangup(int32_t serial, int32_t gsmIndex); - - Return<void> hangupWaitingOrBackground(int32_t serial); - - Return<void> hangupForegroundResumeBackground(int32_t serial); - - Return<void> switchWaitingOrHoldingAndActive(int32_t serial); - - Return<void> conference(int32_t serial); - - Return<void> rejectCall(int32_t serial); - - Return<void> getLastCallFailCause(int32_t serial); - - Return<void> getSignalStrength(int32_t serial); - - Return<void> getVoiceRegistrationState(int32_t serial); - - Return<void> getDataRegistrationState(int32_t serial); - - Return<void> getOperator(int32_t serial); - - Return<void> setRadioPower(int32_t serial, bool on); - - Return<void> sendDtmf(int32_t serial, - const ::android::hardware::hidl_string& s); - - Return<void> sendSms(int32_t serial, const GsmSmsMessage& message); - - Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message); - - Return<void> setupDataCall(int32_t serial, - RadioTechnology radioTechnology, - const DataProfileInfo& profileInfo, - bool modemCognitive, - bool roamingAllowed, - bool isRoaming); - - Return<void> iccIOForApp(int32_t serial, - const IccIo& iccIo); - - Return<void> sendUssd(int32_t serial, - const ::android::hardware::hidl_string& ussd); - - Return<void> cancelPendingUssd(int32_t serial); - - Return<void> getClir(int32_t serial); - - Return<void> setClir(int32_t serial, int32_t status); - - Return<void> getCallForwardStatus(int32_t serial, - const CallForwardInfo& callInfo); - - Return<void> setCallForward(int32_t serial, - const CallForwardInfo& callInfo); - - Return<void> getCallWaiting(int32_t serial, int32_t serviceClass); - - Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass); - - Return<void> acknowledgeLastIncomingGsmSms(int32_t serial, - bool success, SmsAcknowledgeFailCause cause); - - Return<void> acceptCall(int32_t serial); - - Return<void> deactivateDataCall(int32_t serial, - int32_t cid, bool reasonRadioShutDown); - - Return<void> getFacilityLockForApp(int32_t serial, - const ::android::hardware::hidl_string& facility, - const ::android::hardware::hidl_string& password, - int32_t serviceClass, - const ::android::hardware::hidl_string& appId); - - Return<void> setFacilityLockForApp(int32_t serial, - const ::android::hardware::hidl_string& facility, - bool lockState, - const ::android::hardware::hidl_string& password, - int32_t serviceClass, - const ::android::hardware::hidl_string& appId); - - Return<void> setBarringPassword(int32_t serial, - const ::android::hardware::hidl_string& facility, - const ::android::hardware::hidl_string& oldPassword, - const ::android::hardware::hidl_string& newPassword); - - Return<void> getNetworkSelectionMode(int32_t serial); - - Return<void> setNetworkSelectionModeAutomatic(int32_t serial); - - Return<void> setNetworkSelectionModeManual(int32_t serial, - const ::android::hardware::hidl_string& operatorNumeric); - - Return<void> getAvailableNetworks(int32_t serial); - - Return<void> startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request); - - Return<void> stopNetworkScan(int32_t serial); - - Return<void> startDtmf(int32_t serial, - const ::android::hardware::hidl_string& s); - - Return<void> stopDtmf(int32_t serial); - - Return<void> getBasebandVersion(int32_t serial); - - Return<void> separateConnection(int32_t serial, int32_t gsmIndex); - - Return<void> setMute(int32_t serial, bool enable); - - Return<void> getMute(int32_t serial); - - Return<void> getClip(int32_t serial); - - Return<void> getDataCallList(int32_t serial); - - Return<void> setSuppServiceNotifications(int32_t serial, bool enable); - - Return<void> writeSmsToSim(int32_t serial, - const SmsWriteArgs& smsWriteArgs); - - Return<void> deleteSmsOnSim(int32_t serial, int32_t index); - - Return<void> setBandMode(int32_t serial, RadioBandMode mode); - - Return<void> getAvailableBandModes(int32_t serial); - - Return<void> sendEnvelope(int32_t serial, - const ::android::hardware::hidl_string& command); - - Return<void> sendTerminalResponseToSim(int32_t serial, - const ::android::hardware::hidl_string& commandResponse); - - Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept); - - Return<void> explicitCallTransfer(int32_t serial); - - Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType); - - Return<void> getPreferredNetworkType(int32_t serial); - - Return<void> getNeighboringCids(int32_t serial); - - Return<void> setLocationUpdates(int32_t serial, bool enable); - - Return<void> setCdmaSubscriptionSource(int32_t serial, - CdmaSubscriptionSource cdmaSub); - - Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type); - - Return<void> getCdmaRoamingPreference(int32_t serial); - - Return<void> setTTYMode(int32_t serial, TtyMode mode); - - Return<void> getTTYMode(int32_t serial); - - Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable); - - Return<void> getPreferredVoicePrivacy(int32_t serial); - - Return<void> sendCDMAFeatureCode(int32_t serial, - const ::android::hardware::hidl_string& featureCode); - - Return<void> sendBurstDtmf(int32_t serial, - const ::android::hardware::hidl_string& dtmf, - int32_t on, - int32_t off); - - Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms); - - Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial, - const CdmaSmsAck& smsAck); - - Return<void> getGsmBroadcastConfig(int32_t serial); - - Return<void> setGsmBroadcastConfig(int32_t serial, - const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo); - - Return<void> setGsmBroadcastActivation(int32_t serial, bool activate); - - Return<void> getCdmaBroadcastConfig(int32_t serial); - - Return<void> setCdmaBroadcastConfig(int32_t serial, - const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo); - - Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate); - - Return<void> getCDMASubscription(int32_t serial); - - Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms); - - Return<void> deleteSmsOnRuim(int32_t serial, int32_t index); - - Return<void> getDeviceIdentity(int32_t serial); - - Return<void> exitEmergencyCallbackMode(int32_t serial); - - Return<void> getSmscAddress(int32_t serial); - - Return<void> setSmscAddress(int32_t serial, - const ::android::hardware::hidl_string& smsc); - - Return<void> reportSmsMemoryStatus(int32_t serial, bool available); - - Return<void> reportStkServiceIsRunning(int32_t serial); - - Return<void> getCdmaSubscriptionSource(int32_t serial); - - Return<void> requestIsimAuthentication(int32_t serial, - const ::android::hardware::hidl_string& challenge); - - Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial, - bool success, - const ::android::hardware::hidl_string& ackPdu); - - Return<void> sendEnvelopeWithStatus(int32_t serial, - const ::android::hardware::hidl_string& contents); - - Return<void> getVoiceRadioTechnology(int32_t serial); - - Return<void> getCellInfoList(int32_t serial); - - Return<void> setCellInfoListRate(int32_t serial, int32_t rate); - - Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo, - bool modemCognitive, bool isRoaming); - - Return<void> getImsRegistrationState(int32_t serial); - - Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message); - - Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message); - - Return<void> iccOpenLogicalChannel(int32_t serial, - const ::android::hardware::hidl_string& aid, int32_t p2); - - Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId); - - Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message); - - Return<void> nvReadItem(int32_t serial, NvItem itemId); - - Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item); - - Return<void> nvWriteCdmaPrl(int32_t serial, - const ::android::hardware::hidl_vec<uint8_t>& prl); - - Return<void> nvResetConfig(int32_t serial, ResetNvType resetType); - - Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub); - - Return<void> setDataAllowed(int32_t serial, bool allow); - - Return<void> getHardwareConfig(int32_t serial); - - Return<void> requestIccSimAuthentication(int32_t serial, - int32_t authContext, - const ::android::hardware::hidl_string& authData, - const ::android::hardware::hidl_string& aid); - - Return<void> setDataProfile(int32_t serial, - const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming); - - Return<void> requestShutdown(int32_t serial); - - Return<void> getRadioCapability(int32_t serial); - - Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc); - - Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode); - - Return<void> stopLceService(int32_t serial); - - Return<void> pullLceData(int32_t serial); - - Return<void> getModemActivityInfo(int32_t serial); - - Return<void> setAllowedCarriers(int32_t serial, - bool allAllowed, - const CarrierRestrictions& carriers); - - Return<void> getAllowedCarriers(int32_t serial); - - Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state); - - Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter); - - Return<void> startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive); - - Return<void> stopKeepalive(int32_t serial, int32_t sessionHandle); - - Return<void> setSimCardPower(int32_t serial, bool powerUp); - Return<void> setSimCardPower_1_1(int32_t serial, - const V1_1::CardPowerState state); - - Return<void> responseAcknowledgement(); - - Return<void> setCarrierInfoForImsiEncryption(int32_t serial, - const V1_1::ImsiEncryptionInfo& message); - - void checkReturnStatus(Return<void>& ret); - - // Methods from ::android::hardware::radio::V1_2::IRadio follow. - Return<void> startNetworkScan_1_2(int32_t serial, - const ::android::hardware::radio::V1_2::NetworkScanRequest& request); - Return<void> setIndicationFilter_1_2(int32_t serial, - hidl_bitfield<::android::hardware::radio::V1_2::IndicationFilter> indicationFilter); - Return<void> setSignalStrengthReportingCriteria(int32_t serial, int32_t hysteresisMs, - int32_t hysteresisDb, const hidl_vec<int32_t>& thresholdsDbm, - ::android::hardware::radio::V1_2::AccessNetwork accessNetwork); - Return<void> setLinkCapacityReportingCriteria(int32_t serial, int32_t hysteresisMs, - int32_t hysteresisDlKbps, int32_t hysteresisUlKbps, - const hidl_vec<int32_t>& thresholdsDownlinkKbps, - const hidl_vec<int32_t>& thresholdsUplinkKbps, - ::android::hardware::radio::V1_2::AccessNetwork accessNetwork); - Return<void> setupDataCall_1_2(int32_t serial, - ::android::hardware::radio::V1_2::AccessNetwork accessNetwork, - const ::android::hardware::radio::V1_0::DataProfileInfo& dataProfileInfo, - bool modemCognitive, bool roamingAllowed, bool isRoaming, - ::android::hardware::radio::V1_2::DataRequestReason reason, - const hidl_vec<hidl_string>& addresses, const hidl_vec<hidl_string>& dnses); - Return<void> deactivateDataCall_1_2(int32_t serial, int32_t cid, - ::android::hardware::radio::V1_2::DataRequestReason reason); - - // Methods from ::android::hardware::radio::V1_3::IRadio follow. - Return<void> setSystemSelectionChannels(int32_t serial, bool specifyChannels, - const hidl_vec<::android::hardware::radio::V1_1::RadioAccessSpecifier>& specifiers); - Return<void> enableModem(int32_t serial, bool on); - Return<void> getModemStackStatus(int32_t serial); - - // Methods from ::android::hardware::radio::V1_4::IRadio follow. - Return<void> setupDataCall_1_4(int32_t serial, - ::android::hardware::radio::V1_4::AccessNetwork accessNetwork, - const ::android::hardware::radio::V1_4::DataProfileInfo& dataProfileInfo, - bool roamingAllowed, ::android::hardware::radio::V1_2::DataRequestReason reason, - const hidl_vec<hidl_string>& addresses, const hidl_vec<hidl_string>& dnses); - Return<void> setInitialAttachApn_1_4(int32_t serial, - const ::android::hardware::radio::V1_4::DataProfileInfo& dataProfileInfo); - Return<void> setDataProfile_1_4(int32_t serial, - const hidl_vec<::android::hardware::radio::V1_4::DataProfileInfo>& profiles); - Return<void> emergencyDial(int32_t serial, - const ::android::hardware::radio::V1_0::Dial& dialInfo, - hidl_bitfield<android::hardware::radio::V1_4::EmergencyServiceCategory> categories, - const hidl_vec<hidl_string>& urns, - ::android::hardware::radio::V1_4::EmergencyCallRouting routing, - bool fromEmergencyDialer, bool isTesting); - Return<void> startNetworkScan_1_4(int32_t serial, - const ::android::hardware::radio::V1_2::NetworkScanRequest& request); - Return<void> getPreferredNetworkTypeBitmap(int32_t serial); - Return<void> setPreferredNetworkTypeBitmap( - int32_t serial, hidl_bitfield<RadioAccessFamily> networkTypeBitmap); - Return<void> setAllowedCarriers_1_4(int32_t serial, - const ::android::hardware::radio::V1_4::CarrierRestrictionsWithPriority& carriers, - ::android::hardware::radio::V1_4::SimLockMultiSimPolicy multiSimPolicy); - Return<void> getAllowedCarriers_1_4(int32_t serial); - Return<void> getSignalStrength_1_4(int32_t serial); - - // Methods from ::android::hardware::radio::V1_5::IRadio follow. - Return<void> setSignalStrengthReportingCriteria_1_5(int32_t serial, - const ::android::hardware::radio::V1_5::SignalThresholdInfo& signalThresholdInfo, - const ::android::hardware::radio::V1_5::AccessNetwork accessNetwork); - Return<void> enableUiccApplications(int32_t serial, bool detach); - Return<void> areUiccApplicationsEnabled(int32_t serial); - Return<void> canToggleUiccApplicationsEnablement(int32_t serial); - Return<void> setSystemSelectionChannels_1_5(int32_t serial, bool specifyChannels, - const hidl_vec<::android::hardware::radio::V1_5::RadioAccessSpecifier>& specifiers); - Return<void> startNetworkScan_1_5(int32_t serial, - const ::android::hardware::radio::V1_5::NetworkScanRequest& request); -}; - -struct OemHookImpl : public IOemHook { - int32_t mSlotId; - sp<IOemHookResponse> mOemHookResponse; - sp<IOemHookIndication> mOemHookIndication; - - Return<void> setResponseFunctions( - const ::android::sp<IOemHookResponse>& oemHookResponse, - const ::android::sp<IOemHookIndication>& oemHookIndication); - - Return<void> sendRequestRaw(int32_t serial, - const ::android::hardware::hidl_vec<uint8_t>& data); - - Return<void> sendRequestStrings(int32_t serial, - const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data); -}; - -void memsetAndFreeStrings(int numPointers, ...) { - va_list ap; - va_start(ap, numPointers); - for (int i = 0; i < numPointers; i++) { - char *ptr = va_arg(ap, char *); - if (ptr) { -#ifdef MEMSET_FREED -#define MAX_STRING_LENGTH 4096 - memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH)); -#endif - free(ptr); - } - } - va_end(ap); -} - -void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) { - pRI->pCI->responseFunction((int) pRI->socket_id, - (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0); -} - -/** - * Copies over src to dest. If memory allocation fails, responseFunction() is called for the - * request with error RIL_E_NO_MEMORY. The size() method is used to determine the size of the - * destination buffer into which the HIDL string is copied. If there is a discrepancy between - * the string length reported by the size() method, and the length of the string returned by - * the c_str() method, the function will return false indicating a failure. - * - * Returns true on success, and false on failure. - */ -bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty) { - size_t len = src.size(); - if (len == 0 && !allowEmpty) { - *dest = NULL; - return true; - } - *dest = (char *) calloc(len + 1, sizeof(char)); - if (*dest == NULL) { - RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return false; - } - if (strlcpy(*dest, src.c_str(), len + 1) >= (len + 1)) { - RLOGE("Copy of the HIDL string has been truncated, as " - "the string length reported by size() does not " - "match the length of string returned by c_str()."); - free(*dest); - *dest = NULL; - sendErrorResponse(pRI, RIL_E_INTERNAL_ERR); - return false; - } - return true; -} - -bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) { - return copyHidlStringToRil(dest, src, pRI, false); -} - -hidl_string convertCharPtrToHidlString(const char *ptr) { - hidl_string ret; - if (ptr != NULL) { - // TODO: replace this with strnlen - ret.setToExternal(ptr, strlen(ptr)); - } - return ret; -} - -bool dispatchVoid(int serial, int slotId, int request) { - RequestInfo *pRI = android::addRequestToList(serial, slotId, request); - if (pRI == NULL) { - return false; - } - CALL_ONREQUEST(request, NULL, 0, pRI, slotId); - return true; -} - -bool dispatchString(int serial, int slotId, int request, const char * str) { - RequestInfo *pRI = android::addRequestToList(serial, slotId, request); - if (pRI == NULL) { - return false; - } - - char *pString; - if (!copyHidlStringToRil(&pString, str, pRI)) { - return false; - } - - CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId); - - memsetAndFreeStrings(1, pString); - return true; -} - -bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, ...) { - RequestInfo *pRI = android::addRequestToList(serial, slotId, request); - if (pRI == NULL) { - return false; - } - - char **pStrings; - pStrings = (char **)calloc(countStrings, sizeof(char *)); - if (pStrings == NULL) { - RLOGE("Memory allocation failed for request %s", requestToString(request)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return false; - } - va_list ap; - va_start(ap, countStrings); - for (int i = 0; i < countStrings; i++) { - const char* str = va_arg(ap, const char *); - if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI, allowEmpty)) { - va_end(ap); - for (int j = 0; j < i; j++) { - memsetAndFreeStrings(1, pStrings[j]); - } - free(pStrings); - return false; - } - } - va_end(ap); - - CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId); - - if (pStrings != NULL) { - for (int i = 0 ; i < countStrings ; i++) { - memsetAndFreeStrings(1, pStrings[i]); - } - -#ifdef MEMSET_FREED - memset(pStrings, 0, countStrings * sizeof(char *)); -#endif - free(pStrings); - } - return true; -} - -bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) { - RequestInfo *pRI = android::addRequestToList(serial, slotId, request); - if (pRI == NULL) { - return false; - } - - int countStrings = data.size(); - char **pStrings; - pStrings = (char **)calloc(countStrings, sizeof(char *)); - if (pStrings == NULL) { - RLOGE("Memory allocation failed for request %s", requestToString(request)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return false; - } - - for (int i = 0; i < countStrings; i++) { - if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) { - for (int j = 0; j < i; j++) { - memsetAndFreeStrings(1, pStrings[j]); - } - free(pStrings); - return false; - } - } - - CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId); - - if (pStrings != NULL) { - for (int i = 0 ; i < countStrings ; i++) { - memsetAndFreeStrings(1, pStrings[i]); - } - -#ifdef MEMSET_FREED - memset(pStrings, 0, countStrings * sizeof(char *)); -#endif - free(pStrings); - } - return true; -} - -bool dispatchInts(int serial, int slotId, int request, int countInts, ...) { - RequestInfo *pRI = android::addRequestToList(serial, slotId, request); - if (pRI == NULL) { - return false; - } - - int *pInts = (int *)calloc(countInts, sizeof(int)); - - if (pInts == NULL) { - RLOGE("Memory allocation failed for request %s", requestToString(request)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return false; - } - va_list ap; - va_start(ap, countInts); - for (int i = 0; i < countInts; i++) { - pInts[i] = va_arg(ap, int); - } - va_end(ap); - - CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId); - - if (pInts != NULL) { -#ifdef MEMSET_FREED - memset(pInts, 0, countInts * sizeof(int)); -#endif - free(pInts); - } - return true; -} - -bool dispatchCallForwardStatus(int serial, int slotId, int request, - const CallForwardInfo& callInfo) { - RequestInfo *pRI = android::addRequestToList(serial, slotId, request); - if (pRI == NULL) { - return false; - } - - RIL_CallForwardInfo cf; - cf.status = (int) callInfo.status; - cf.reason = callInfo.reason; - cf.serviceClass = callInfo.serviceClass; - cf.toa = callInfo.toa; - cf.timeSeconds = callInfo.timeSeconds; - - if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) { - return false; - } - - CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId); - - memsetAndFreeStrings(1, cf.number); - - return true; -} - -bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) { - RequestInfo *pRI = android::addRequestToList(serial, slotId, request); - if (pRI == NULL) { - return false; - } - - const uint8_t *uData = rawBytes.data(); - - CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId); - - return true; -} - -bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) { - RequestInfo *pRI = android::addRequestToList(serial, slotId, request); - if (pRI == NULL) { - return false; - } - - RIL_SIM_APDU apdu = {}; - - apdu.sessionid = message.sessionId; - apdu.cla = message.cla; - apdu.instruction = message.instruction; - apdu.p1 = message.p1; - apdu.p2 = message.p2; - apdu.p3 = message.p3; - - if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) { - return false; - } - - CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId); - - memsetAndFreeStrings(1, apdu.data); - - return true; -} - -void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) { - if (ret.isOk() == false) { - RLOGE("checkReturnStatus: unable to call response/indication callback"); - // Remote process hosting the callbacks must be dead. Reset the callback objects; - // there's no other recovery to be done here. When the client process is back up, it will - // call setResponseFunctions() - - // Caller should already hold rdlock, release that first - // note the current counter to avoid overwriting updates made by another thread before - // write lock is acquired. - int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId]; - pthread_rwlock_t *radioServiceRwlockPtr = radio_1_5::getRadioServiceRwlock(slotId); - int ret = pthread_rwlock_unlock(radioServiceRwlockPtr); - assert(ret == 0); - - // acquire wrlock - ret = pthread_rwlock_wrlock(radioServiceRwlockPtr); - assert(ret == 0); - - // make sure the counter value has not changed - if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) { - if (isRadioService) { - radioService[slotId]->mRadioResponse = NULL; - radioService[slotId]->mRadioIndication = NULL; - radioService[slotId]->mRadioResponseV1_2 = NULL; - radioService[slotId]->mRadioIndicationV1_2 = NULL; - radioService[slotId]->mRadioResponseV1_3 = NULL; - radioService[slotId]->mRadioIndicationV1_3 = NULL; - radioService[slotId]->mRadioResponseV1_4 = NULL; - radioService[slotId]->mRadioIndicationV1_4 = NULL; - radioService[slotId]->mRadioResponseV1_5 = NULL; - radioService[slotId]->mRadioIndicationV1_5 = NULL; - } else { - oemHookService[slotId]->mOemHookResponse = NULL; - oemHookService[slotId]->mOemHookIndication = NULL; - } - isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++; - } else { - RLOGE("checkReturnStatus: not resetting responseFunctions as they likely " - "got updated on another thread"); - } - - // release wrlock - ret = pthread_rwlock_unlock(radioServiceRwlockPtr); - assert(ret == 0); - - // Reacquire rdlock - ret = pthread_rwlock_rdlock(radioServiceRwlockPtr); - assert(ret == 0); - } -} - -void RadioImpl_1_5::checkReturnStatus(Return<void>& ret) { - ::checkReturnStatus(mSlotId, ret, true); -} - -Return<void> RadioImpl_1_5::setResponseFunctions( - const ::android::sp<IRadioResponse>& radioResponseParam, - const ::android::sp<IRadioIndication>& radioIndicationParam) { - RLOGD("setResponseFunctions"); - - pthread_rwlock_t *radioServiceRwlockPtr = radio_1_5::getRadioServiceRwlock(mSlotId); - int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr); - assert(ret == 0); - - mRadioResponse = radioResponseParam; - mRadioIndication = radioIndicationParam; - - mRadioResponseV1_5 = V1_5::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr); - mRadioIndicationV1_5 = V1_5::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr); - if (mRadioResponseV1_5 == nullptr || mRadioIndicationV1_5 == nullptr) { - mRadioResponseV1_5 = nullptr; - mRadioIndicationV1_5 = nullptr; - } - - mRadioResponseV1_4 = V1_4::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr); - mRadioIndicationV1_4 = V1_4::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr); - if (mRadioResponseV1_4 == nullptr || mRadioIndicationV1_4 == nullptr) { - mRadioResponseV1_4 = nullptr; - mRadioIndicationV1_4 = nullptr; - } - - mRadioResponseV1_3 = V1_3::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr); - mRadioIndicationV1_3 = V1_3::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr); - if (mRadioResponseV1_3 == nullptr || mRadioIndicationV1_3 == nullptr) { - mRadioResponseV1_3 = nullptr; - mRadioIndicationV1_3 = nullptr; - } - - mRadioResponseV1_2 = V1_2::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr); - mRadioIndicationV1_2 = V1_2::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr); - if (mRadioResponseV1_2 == nullptr || mRadioIndicationV1_2 == nullptr) { - mRadioResponseV1_2 = nullptr; - mRadioIndicationV1_2 = nullptr; - } - - mCounterRadio[mSlotId]++; - - ret = pthread_rwlock_unlock(radioServiceRwlockPtr); - assert(ret == 0); - - // client is connected. Send initial indications. - android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId); - - return Void(); -} - -Return<void> RadioImpl_1_5::getIccCardStatus(int32_t serial) { -#if VDBG - RLOGD("getIccCardStatus: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS); - return Void(); -} - -Return<void> RadioImpl_1_5::supplyIccPinForApp(int32_t serial, const hidl_string& pin, - const hidl_string& aid) { -#if VDBG - RLOGD("supplyIccPinForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, true, - 2, pin.c_str(), aid.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::supplyIccPukForApp(int32_t serial, const hidl_string& puk, - const hidl_string& pin, const hidl_string& aid) { -#if VDBG - RLOGD("supplyIccPukForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, true, - 3, puk.c_str(), pin.c_str(), aid.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2, - const hidl_string& aid) { -#if VDBG - RLOGD("supplyIccPin2ForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, true, - 2, pin2.c_str(), aid.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2, - const hidl_string& pin2, const hidl_string& aid) { -#if VDBG - RLOGD("supplyIccPuk2ForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, true, - 3, puk2.c_str(), pin2.c_str(), aid.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::changeIccPinForApp(int32_t serial, const hidl_string& oldPin, - const hidl_string& newPin, const hidl_string& aid) { -#if VDBG - RLOGD("changeIccPinForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, true, - 3, oldPin.c_str(), newPin.c_str(), aid.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2, - const hidl_string& newPin2, const hidl_string& aid) { -#if VDBG - RLOGD("changeIccPin2ForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, true, - 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::supplyNetworkDepersonalization(int32_t serial, - const hidl_string& netPin) { -#if VDBG - RLOGD("supplyNetworkDepersonalization: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, true, - 1, netPin.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::getCurrentCalls(int32_t serial) { -#if VDBG - RLOGD("getCurrentCalls: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS); - return Void(); -} - -Return<void> RadioImpl_1_5::dial(int32_t serial, const Dial& dialInfo) { -#if VDBG - RLOGD("dial: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL); - if (pRI == NULL) { - return Void(); - } - RIL_Dial dial = {}; - RIL_UUS_Info uusInfo = {}; - int32_t sizeOfDial = sizeof(dial); - - if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) { - return Void(); - } - dial.clir = (int) dialInfo.clir; - - if (dialInfo.uusInfo.size() != 0) { - uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType; - uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs; - - if (dialInfo.uusInfo[0].uusData.size() == 0) { - uusInfo.uusData = NULL; - uusInfo.uusLength = 0; - } else { - if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) { - memsetAndFreeStrings(1, dial.address); - return Void(); - } - uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size(); - } - - dial.uusInfo = &uusInfo; - } - - CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId); - - memsetAndFreeStrings(2, dial.address, uusInfo.uusData); - - return Void(); -} - -Return<void> RadioImpl_1_5::getImsiForApp(int32_t serial, const hidl_string& aid) { -#if VDBG - RLOGD("getImsiForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, false, - 1, aid.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::hangup(int32_t serial, int32_t gsmIndex) { -#if VDBG - RLOGD("hangup: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex); - return Void(); -} - -Return<void> RadioImpl_1_5::hangupWaitingOrBackground(int32_t serial) { -#if VDBG - RLOGD("hangupWaitingOrBackground: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND); - return Void(); -} - -Return<void> RadioImpl_1_5::hangupForegroundResumeBackground(int32_t serial) { -#if VDBG - RLOGD("hangupForegroundResumeBackground: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND); - return Void(); -} - -Return<void> RadioImpl_1_5::switchWaitingOrHoldingAndActive(int32_t serial) { -#if VDBG - RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE); - return Void(); -} - -Return<void> RadioImpl_1_5::conference(int32_t serial) { -#if VDBG - RLOGD("conference: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE); - return Void(); -} - -Return<void> RadioImpl_1_5::rejectCall(int32_t serial) { -#if VDBG - RLOGD("rejectCall: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB); - return Void(); -} - -Return<void> RadioImpl_1_5::getLastCallFailCause(int32_t serial) { -#if VDBG - RLOGD("getLastCallFailCause: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE); - return Void(); -} - -Return<void> RadioImpl_1_5::getSignalStrength(int32_t serial) { -#if VDBG - RLOGD("getSignalStrength: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH); - return Void(); -} - -Return<void> RadioImpl_1_5::getVoiceRegistrationState(int32_t serial) { -#if VDBG - RLOGD("getVoiceRegistrationState: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE); - return Void(); -} - -Return<void> RadioImpl_1_5::getDataRegistrationState(int32_t serial) { -#if VDBG - RLOGD("getDataRegistrationState: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE); - return Void(); -} - -Return<void> RadioImpl_1_5::getOperator(int32_t serial) { -#if VDBG - RLOGD("getOperator: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR); - return Void(); -} - -Return<void> RadioImpl_1_5::setRadioPower(int32_t serial, bool on) { - RLOGD("setRadioPower: serial %d on %d", serial, on); - dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on)); - return Void(); -} - -Return<void> RadioImpl_1_5::sendDtmf(int32_t serial, const hidl_string& s) { -#if VDBG - RLOGD("sendDtmf: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::sendSms(int32_t serial, const GsmSmsMessage& message) { -#if VDBG - RLOGD("sendSms: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, false, - 2, message.smscPdu.c_str(), message.pdu.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) { -#if VDBG - RLOGD("sendSMSExpectMore: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, false, - 2, message.smscPdu.c_str(), message.pdu.c_str()); - return Void(); -} - -static bool convertMvnoTypeToString(MvnoType type, char *&str) { - switch (type) { - case MvnoType::IMSI: - str = (char *)"imsi"; - return true; - case MvnoType::GID: - str = (char *)"gid"; - return true; - case MvnoType::SPN: - str = (char *)"spn"; - return true; - case MvnoType::NONE: - str = (char *)""; - return true; - } - return false; -} - -Return<void> RadioImpl_1_5::setupDataCall(int32_t serial, RadioTechnology radioTechnology, - const DataProfileInfo& dataProfileInfo, bool modemCognitive, - bool roamingAllowed, bool isRoaming) { - -#if VDBG - RLOGD("setupDataCall: serial %d", serial); -#endif - - if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) { - const hidl_string &protocol = - (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol); - dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 7, - std::to_string((int) radioTechnology + 2).c_str(), - std::to_string((int) dataProfileInfo.profileId).c_str(), - dataProfileInfo.apn.c_str(), - dataProfileInfo.user.c_str(), - dataProfileInfo.password.c_str(), - std::to_string((int) dataProfileInfo.authType).c_str(), - protocol.c_str()); - } else if (s_vendorFunctions->version >= 15) { - char *mvnoTypeStr = NULL; - if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) { - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SETUP_DATA_CALL); - if (pRI != NULL) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - } - return Void(); - } - dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15, - std::to_string((int) radioTechnology + 2).c_str(), - std::to_string((int) dataProfileInfo.profileId).c_str(), - dataProfileInfo.apn.c_str(), - dataProfileInfo.user.c_str(), - dataProfileInfo.password.c_str(), - std::to_string((int) dataProfileInfo.authType).c_str(), - dataProfileInfo.protocol.c_str(), - dataProfileInfo.roamingProtocol.c_str(), - std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(), - std::to_string(dataProfileInfo.bearerBitmap).c_str(), - modemCognitive ? "1" : "0", - std::to_string(dataProfileInfo.mtu).c_str(), - mvnoTypeStr, - dataProfileInfo.mvnoMatchData.c_str(), - roamingAllowed ? "1" : "0"); - } else { - RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version); - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SETUP_DATA_CALL); - if (pRI != NULL) { - sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED); - } - } - return Void(); -} - -Return<void> RadioImpl_1_5::iccIOForApp(int32_t serial, const IccIo& iccIo) { -#if VDBG - RLOGD("iccIOForApp: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO); - if (pRI == NULL) { - return Void(); - } - - RIL_SIM_IO_v6 rilIccIo = {}; - rilIccIo.command = iccIo.command; - rilIccIo.fileid = iccIo.fileId; - if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) { - return Void(); - } - - rilIccIo.p1 = iccIo.p1; - rilIccIo.p2 = iccIo.p2; - rilIccIo.p3 = iccIo.p3; - - if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) { - memsetAndFreeStrings(1, rilIccIo.path); - return Void(); - } - - if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) { - memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data); - return Void(); - } - - if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) { - memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2); - return Void(); - } - - CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId); - - memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr); - - return Void(); -} - -Return<void> RadioImpl_1_5::sendUssd(int32_t serial, const hidl_string& ussd) { -#if VDBG - RLOGD("sendUssd: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::cancelPendingUssd(int32_t serial) { -#if VDBG - RLOGD("cancelPendingUssd: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD); - return Void(); -} - -Return<void> RadioImpl_1_5::getClir(int32_t serial) { -#if VDBG - RLOGD("getClir: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR); - return Void(); -} - -Return<void> RadioImpl_1_5::setClir(int32_t serial, int32_t status) { -#if VDBG - RLOGD("setClir: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status); - return Void(); -} - -Return<void> RadioImpl_1_5::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) { -#if VDBG - RLOGD("getCallForwardStatus: serial %d", serial); -#endif - dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS, - callInfo); - return Void(); -} - -Return<void> RadioImpl_1_5::setCallForward(int32_t serial, const CallForwardInfo& callInfo) { -#if VDBG - RLOGD("setCallForward: serial %d", serial); -#endif - dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD, - callInfo); - return Void(); -} - -Return<void> RadioImpl_1_5::getCallWaiting(int32_t serial, int32_t serviceClass) { -#if VDBG - RLOGD("getCallWaiting: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass); - return Void(); -} - -Return<void> RadioImpl_1_5::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) { -#if VDBG - RLOGD("setCallWaiting: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable), - serviceClass); - return Void(); -} - -Return<void> RadioImpl_1_5::acknowledgeLastIncomingGsmSms(int32_t serial, - bool success, SmsAcknowledgeFailCause cause) { -#if VDBG - RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success), - cause); - return Void(); -} - -Return<void> RadioImpl_1_5::acceptCall(int32_t serial) { -#if VDBG - RLOGD("acceptCall: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER); - return Void(); -} - -Return<void> RadioImpl_1_5::deactivateDataCall(int32_t serial, - int32_t cid, bool reasonRadioShutDown) { -#if VDBG - RLOGD("deactivateDataCall: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, false, - 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0"); - return Void(); -} - -Return<void> RadioImpl_1_5::getFacilityLockForApp(int32_t serial, const hidl_string& facility, - const hidl_string& password, int32_t serviceClass, - const hidl_string& appId) { -#if VDBG - RLOGD("getFacilityLockForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, true, - 4, facility.c_str(), password.c_str(), - (std::to_string(serviceClass)).c_str(), appId.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::setFacilityLockForApp(int32_t serial, const hidl_string& facility, - bool lockState, const hidl_string& password, - int32_t serviceClass, const hidl_string& appId) { -#if VDBG - RLOGD("setFacilityLockForApp: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, true, - 5, facility.c_str(), lockState ? "1" : "0", password.c_str(), - (std::to_string(serviceClass)).c_str(), appId.c_str() ); - return Void(); -} - -Return<void> RadioImpl_1_5::setBarringPassword(int32_t serial, const hidl_string& facility, - const hidl_string& oldPassword, - const hidl_string& newPassword) { -#if VDBG - RLOGD("setBarringPassword: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, true, - 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::getNetworkSelectionMode(int32_t serial) { -#if VDBG - RLOGD("getNetworkSelectionMode: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE); - return Void(); -} - -Return<void> RadioImpl_1_5::setNetworkSelectionModeAutomatic(int32_t serial) { -#if VDBG - RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC); - return Void(); -} - -Return<void> RadioImpl_1_5::setNetworkSelectionModeManual(int32_t serial, - const hidl_string& operatorNumeric) { -#if VDBG - RLOGD("setNetworkSelectionModeManual: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL, - operatorNumeric.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::getAvailableNetworks(int32_t serial) { -#if VDBG - RLOGD("getAvailableNetworks: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS); - return Void(); -} - -Return<void> RadioImpl_1_5::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request) { -#if VDBG - RLOGD("startNetworkScan: serial %d", serial); -#endif - - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN); - if (pRI == NULL) { - return Void(); - } - - if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return Void(); - } - - RIL_NetworkScanRequest scan_request = {}; - - scan_request.type = (RIL_ScanType) request.type; - scan_request.interval = request.interval; - scan_request.specifiers_length = request.specifiers.size(); - for (size_t i = 0; i < request.specifiers.size(); ++i) { - if (request.specifiers[i].geranBands.size() > MAX_BANDS || - request.specifiers[i].utranBands.size() > MAX_BANDS || - request.specifiers[i].eutranBands.size() > MAX_BANDS || - request.specifiers[i].channels.size() > MAX_CHANNELS) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return Void(); - } - const V1_1::RadioAccessSpecifier& ras_from = - request.specifiers[i]; - RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i]; - - ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork; - ras_to.channels_length = ras_from.channels.size(); - - std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels); - const std::vector<uint32_t> * bands = nullptr; - switch (request.specifiers[i].radioAccessNetwork) { - case V1_1::RadioAccessNetworks::GERAN: - ras_to.bands_length = ras_from.geranBands.size(); - bands = (std::vector<uint32_t> *) &ras_from.geranBands; - break; - case V1_1::RadioAccessNetworks::UTRAN: - ras_to.bands_length = ras_from.utranBands.size(); - bands = (std::vector<uint32_t> *) &ras_from.utranBands; - break; - case V1_1::RadioAccessNetworks::EUTRAN: - ras_to.bands_length = ras_from.eutranBands.size(); - bands = (std::vector<uint32_t> *) &ras_from.eutranBands; - break; - default: - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return Void(); - } - // safe to copy to geran_bands because it's a union member - for (size_t idx = 0; idx < ras_to.bands_length; ++idx) { - ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx]; - } - } - - CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI, - mSlotId); - - return Void(); -} - -Return<void> RadioImpl_1_5::stopNetworkScan(int32_t serial) { -#if VDBG - RLOGD("stopNetworkScan: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN); - return Void(); -} - -Return<void> RadioImpl_1_5::startDtmf(int32_t serial, const hidl_string& s) { -#if VDBG - RLOGD("startDtmf: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START, - s.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::stopDtmf(int32_t serial) { -#if VDBG - RLOGD("stopDtmf: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP); - return Void(); -} - -Return<void> RadioImpl_1_5::getBasebandVersion(int32_t serial) { -#if VDBG - RLOGD("getBasebandVersion: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION); - return Void(); -} - -Return<void> RadioImpl_1_5::separateConnection(int32_t serial, int32_t gsmIndex) { -#if VDBG - RLOGD("separateConnection: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex); - return Void(); -} - -Return<void> RadioImpl_1_5::setMute(int32_t serial, bool enable) { -#if VDBG - RLOGD("setMute: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable)); - return Void(); -} - -Return<void> RadioImpl_1_5::getMute(int32_t serial) { -#if VDBG - RLOGD("getMute: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE); - return Void(); -} - -Return<void> RadioImpl_1_5::getClip(int32_t serial) { -#if VDBG - RLOGD("getClip: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP); - return Void(); -} - -Return<void> RadioImpl_1_5::getDataCallList(int32_t serial) { -#if VDBG - RLOGD("getDataCallList: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST); - return Void(); -} - -Return<void> RadioImpl_1_5::setSuppServiceNotifications(int32_t serial, bool enable) { -#if VDBG - RLOGD("setSuppServiceNotifications: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1, - BOOL_TO_INT(enable)); - return Void(); -} - -Return<void> RadioImpl_1_5::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) { -#if VDBG - RLOGD("writeSmsToSim: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM); - if (pRI == NULL) { - return Void(); - } - - RIL_SMS_WriteArgs args; - args.status = (int) smsWriteArgs.status; - - if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) { - return Void(); - } - - if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) { - memsetAndFreeStrings(1, args.pdu); - return Void(); - } - - CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId); - - memsetAndFreeStrings(2, args.smsc, args.pdu); - - return Void(); -} - -Return<void> RadioImpl_1_5::deleteSmsOnSim(int32_t serial, int32_t index) { -#if VDBG - RLOGD("deleteSmsOnSim: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index); - return Void(); -} - -Return<void> RadioImpl_1_5::setBandMode(int32_t serial, RadioBandMode mode) { -#if VDBG - RLOGD("setBandMode: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode); - return Void(); -} - -Return<void> RadioImpl_1_5::getAvailableBandModes(int32_t serial) { -#if VDBG - RLOGD("getAvailableBandModes: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE); - return Void(); -} - -Return<void> RadioImpl_1_5::sendEnvelope(int32_t serial, const hidl_string& command) { -#if VDBG - RLOGD("sendEnvelope: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND, - command.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::sendTerminalResponseToSim(int32_t serial, - const hidl_string& commandResponse) { -#if VDBG - RLOGD("sendTerminalResponseToSim: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE, - commandResponse.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) { -#if VDBG - RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM, - 1, BOOL_TO_INT(accept)); - return Void(); -} - -Return<void> RadioImpl_1_5::explicitCallTransfer(int32_t serial) { -#if VDBG - RLOGD("explicitCallTransfer: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER); - return Void(); -} - -Return<void> RadioImpl_1_5::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) { -#if VDBG - RLOGD("setPreferredNetworkType: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType); - return Void(); -} - -Return<void> RadioImpl_1_5::getPreferredNetworkType(int32_t serial) { -#if VDBG - RLOGD("getPreferredNetworkType: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE); - return Void(); -} - -Return<void> RadioImpl_1_5::getNeighboringCids(int32_t serial) { -#if VDBG - RLOGD("getNeighboringCids: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS); - return Void(); -} - -Return<void> RadioImpl_1_5::setLocationUpdates(int32_t serial, bool enable) { -#if VDBG - RLOGD("setLocationUpdates: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable)); - return Void(); -} - -Return<void> RadioImpl_1_5::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) { -#if VDBG - RLOGD("setCdmaSubscriptionSource: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub); - return Void(); -} - -Return<void> RadioImpl_1_5::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) { -#if VDBG - RLOGD("setCdmaRoamingPreference: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type); - return Void(); -} - -Return<void> RadioImpl_1_5::getCdmaRoamingPreference(int32_t serial) { -#if VDBG - RLOGD("getCdmaRoamingPreference: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE); - return Void(); -} - -Return<void> RadioImpl_1_5::setTTYMode(int32_t serial, TtyMode mode) { -#if VDBG - RLOGD("setTTYMode: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode); - return Void(); -} - -Return<void> RadioImpl_1_5::getTTYMode(int32_t serial) { -#if VDBG - RLOGD("getTTYMode: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE); - return Void(); -} - -Return<void> RadioImpl_1_5::setPreferredVoicePrivacy(int32_t serial, bool enable) { -#if VDBG - RLOGD("setPreferredVoicePrivacy: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE, - 1, BOOL_TO_INT(enable)); - return Void(); -} - -Return<void> RadioImpl_1_5::getPreferredVoicePrivacy(int32_t serial) { -#if VDBG - RLOGD("getPreferredVoicePrivacy: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE); - return Void(); -} - -Return<void> RadioImpl_1_5::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) { -#if VDBG - RLOGD("sendCDMAFeatureCode: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH, - featureCode.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on, - int32_t off) { -#if VDBG - RLOGD("sendBurstDtmf: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false, - 3, dtmf.c_str(), (std::to_string(on)).c_str(), - (std::to_string(off)).c_str()); - return Void(); -} - -void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) { - rcsm.uTeleserviceID = sms.teleserviceId; - rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent); - rcsm.uServicecategory = sms.serviceCategory; - rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode; - rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode; - rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType; - rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan; - - rcsm.sAddress.number_of_digits = sms.address.digits.size(); - int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); - for (int i = 0; i < digitLimit; i++) { - rcsm.sAddress.digits[i] = sms.address.digits[i]; - } - - rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType; - rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd); - - rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size(); - digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); - for (int i = 0; i < digitLimit; i++) { - rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i]; - } - - rcsm.uBearerDataLen = sms.bearerData.size(); - digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); - for (int i = 0; i < digitLimit; i++) { - rcsm.aBearerData[i] = sms.bearerData[i]; - } -} - -Return<void> RadioImpl_1_5::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) { -#if VDBG - RLOGD("sendCdmaSms: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS); - if (pRI == NULL) { - return Void(); - } - - RIL_CDMA_SMS_Message rcsm = {}; - constructCdmaSms(rcsm, sms); - - CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) { -#if VDBG - RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE); - if (pRI == NULL) { - return Void(); - } - - RIL_CDMA_SMS_Ack rcsa = {}; - - rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass; - rcsa.uSMSCauseCode = smsAck.smsCauseCode; - - CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::getGsmBroadcastConfig(int32_t serial) { -#if VDBG - RLOGD("getGsmBroadcastConfig: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG); - return Void(); -} - -Return<void> RadioImpl_1_5::setGsmBroadcastConfig(int32_t serial, - const hidl_vec<GsmBroadcastSmsConfigInfo>& - configInfo) { -#if VDBG - RLOGD("setGsmBroadcastConfig: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG); - if (pRI == NULL) { - return Void(); - } - - int num = configInfo.size(); - RIL_GSM_BroadcastSmsConfigInfo gsmBci[num]; - RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num]; - - for (int i = 0 ; i < num ; i++ ) { - gsmBciPtrs[i] = &gsmBci[i]; - gsmBci[i].fromServiceId = configInfo[i].fromServiceId; - gsmBci[i].toServiceId = configInfo[i].toServiceId; - gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme; - gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme; - gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected); - } - - CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs, - num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::setGsmBroadcastActivation(int32_t serial, bool activate) { -#if VDBG - RLOGD("setGsmBroadcastActivation: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION, - 1, BOOL_TO_INT(!activate)); - return Void(); -} - -Return<void> RadioImpl_1_5::getCdmaBroadcastConfig(int32_t serial) { -#if VDBG - RLOGD("getCdmaBroadcastConfig: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG); - return Void(); -} - -Return<void> RadioImpl_1_5::setCdmaBroadcastConfig(int32_t serial, - const hidl_vec<CdmaBroadcastSmsConfigInfo>& - configInfo) { -#if VDBG - RLOGD("setCdmaBroadcastConfig: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG); - if (pRI == NULL) { - return Void(); - } - - int num = configInfo.size(); - RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num]; - RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num]; - - for (int i = 0 ; i < num ; i++ ) { - cdmaBciPtrs[i] = &cdmaBci[i]; - cdmaBci[i].service_category = configInfo[i].serviceCategory; - cdmaBci[i].language = configInfo[i].language; - cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected); - } - - CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs, - num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::setCdmaBroadcastActivation(int32_t serial, bool activate) { -#if VDBG - RLOGD("setCdmaBroadcastActivation: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION, - 1, BOOL_TO_INT(!activate)); - return Void(); -} - -Return<void> RadioImpl_1_5::getCDMASubscription(int32_t serial) { -#if VDBG - RLOGD("getCDMASubscription: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION); - return Void(); -} - -Return<void> RadioImpl_1_5::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) { -#if VDBG - RLOGD("writeSmsToRuim: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM); - if (pRI == NULL) { - return Void(); - } - - RIL_CDMA_SMS_WriteArgs rcsw = {}; - rcsw.status = (int) cdmaSms.status; - constructCdmaSms(rcsw.message, cdmaSms.message); - - CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::deleteSmsOnRuim(int32_t serial, int32_t index) { -#if VDBG - RLOGD("deleteSmsOnRuim: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index); - return Void(); -} - -Return<void> RadioImpl_1_5::getDeviceIdentity(int32_t serial) { -#if VDBG - RLOGD("getDeviceIdentity: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY); - return Void(); -} - -Return<void> RadioImpl_1_5::exitEmergencyCallbackMode(int32_t serial) { -#if VDBG - RLOGD("exitEmergencyCallbackMode: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE); - return Void(); -} - -Return<void> RadioImpl_1_5::getSmscAddress(int32_t serial) { -#if VDBG - RLOGD("getSmscAddress: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS); - return Void(); -} - -Return<void> RadioImpl_1_5::setSmscAddress(int32_t serial, const hidl_string& smsc) { -#if VDBG - RLOGD("setSmscAddress: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS, - smsc.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::reportSmsMemoryStatus(int32_t serial, bool available) { -#if VDBG - RLOGD("reportSmsMemoryStatus: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1, - BOOL_TO_INT(available)); - return Void(); -} - -Return<void> RadioImpl_1_5::reportStkServiceIsRunning(int32_t serial) { -#if VDBG - RLOGD("reportStkServiceIsRunning: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING); - return Void(); -} - -Return<void> RadioImpl_1_5::getCdmaSubscriptionSource(int32_t serial) { -#if VDBG - RLOGD("getCdmaSubscriptionSource: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE); - return Void(); -} - -Return<void> RadioImpl_1_5::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) { -#if VDBG - RLOGD("requestIsimAuthentication: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION, - challenge.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success, - const hidl_string& ackPdu) { -#if VDBG - RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false, - 2, success ? "1" : "0", ackPdu.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) { -#if VDBG - RLOGD("sendEnvelopeWithStatus: serial %d", serial); -#endif - dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS, - contents.c_str()); - return Void(); -} - -Return<void> RadioImpl_1_5::getVoiceRadioTechnology(int32_t serial) { -#if VDBG - RLOGD("getVoiceRadioTechnology: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH); - return Void(); -} - -Return<void> RadioImpl_1_5::getCellInfoList(int32_t serial) { -#if VDBG - RLOGD("getCellInfoList: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST); - return Void(); -} - -Return<void> RadioImpl_1_5::setCellInfoListRate(int32_t serial, int32_t rate) { -#if VDBG - RLOGD("setCellInfoListRate: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate); - return Void(); -} - -Return<void> RadioImpl_1_5::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo, - bool modemCognitive, bool isRoaming) { -#if VDBG - RLOGD("setInitialAttachApn: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SET_INITIAL_ATTACH_APN); - if (pRI == NULL) { - return Void(); - } - - if (s_vendorFunctions->version <= 14) { - RIL_InitialAttachApn iaa = {}; - - if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) { - return Void(); - } - - const hidl_string &protocol = - (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol); - - if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) { - memsetAndFreeStrings(1, iaa.apn); - return Void(); - } - iaa.authtype = (int) dataProfileInfo.authType; - if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) { - memsetAndFreeStrings(2, iaa.apn, iaa.protocol); - return Void(); - } - if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) { - memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username); - return Void(); - } - - CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId); - - memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password); - } else { - RIL_InitialAttachApn_v15 iaa = {}; - - if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) { - return Void(); - } - - if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) { - memsetAndFreeStrings(1, iaa.apn); - return Void(); - } - if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) { - memsetAndFreeStrings(2, iaa.apn, iaa.protocol); - return Void(); - } - iaa.authtype = (int) dataProfileInfo.authType; - if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) { - memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol); - return Void(); - } - if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) { - memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username); - return Void(); - } - iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap; - iaa.bearerBitmask = dataProfileInfo.bearerBitmap; - iaa.modemCognitive = BOOL_TO_INT(modemCognitive); - iaa.mtu = dataProfileInfo.mtu; - - if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username, - iaa.password); - return Void(); - } - - if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) { - memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username, - iaa.password); - return Void(); - } - - CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId); - - memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username, - iaa.password, iaa.mvnoMatchData); - } - - return Void(); -} - -Return<void> RadioImpl_1_5::getImsRegistrationState(int32_t serial) { -#if VDBG - RLOGD("getImsRegistrationState: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE); - return Void(); -} - -bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) { - RIL_IMS_SMS_Message rism = {}; - char **pStrings; - int countStrings = 2; - int dataLen = sizeof(char *) * countStrings; - - rism.tech = RADIO_TECH_3GPP; - rism.retry = BOOL_TO_INT(message.retry); - rism.messageRef = message.messageRef; - - if (message.gsmMessage.size() != 1) { - RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return false; - } - - pStrings = (char **)calloc(countStrings, sizeof(char *)); - if (pStrings == NULL) { - RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return false; - } - - if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) { -#ifdef MEMSET_FREED - memset(pStrings, 0, dataLen); -#endif - free(pStrings); - return false; - } - - if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) { - memsetAndFreeStrings(1, pStrings[0]); -#ifdef MEMSET_FREED - memset(pStrings, 0, dataLen); -#endif - free(pStrings); - return false; - } - - rism.message.gsmMessage = pStrings; - CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) + - sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id); - - for (int i = 0 ; i < countStrings ; i++) { - memsetAndFreeStrings(1, pStrings[i]); - } - -#ifdef MEMSET_FREED - memset(pStrings, 0, dataLen); -#endif - free(pStrings); - - return true; -} - -struct ImsCdmaSms { - RIL_IMS_SMS_Message imsSms; - RIL_CDMA_SMS_Message cdmaSms; -}; - -bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) { - ImsCdmaSms temp = {}; - - if (message.cdmaMessage.size() != 1) { - RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return false; - } - - temp.imsSms.tech = RADIO_TECH_3GPP2; - temp.imsSms.retry = BOOL_TO_INT(message.retry); - temp.imsSms.messageRef = message.messageRef; - temp.imsSms.message.cdmaMessage = &temp.cdmaSms; - - constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]); - - // Vendor code expects payload length to include actual msg payload - // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in - // RIL_IMS_SMS_Message - int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t) - + sizeof(RIL_CDMA_SMS_Message); - - CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id); - - return true; -} - -Return<void> RadioImpl_1_5::sendImsSms(int32_t serial, const ImsSmsMessage& message) { -#if VDBG - RLOGD("sendImsSms: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS); - if (pRI == NULL) { - return Void(); - } - - RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech; - - if (RADIO_TECH_3GPP == format) { - dispatchImsGsmSms(message, pRI); - } else if (RADIO_TECH_3GPP2 == format) { - dispatchImsCdmaSms(message, pRI); - } else { - RLOGE("sendImsSms: Invalid radio tech %s", - requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - } - return Void(); -} - -Return<void> RadioImpl_1_5::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) { -#if VDBG - RLOGD("iccTransmitApduBasicChannel: serial %d", serial); -#endif - dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message); - return Void(); -} - -Return<void> RadioImpl_1_5::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) { -#if VDBG - RLOGD("iccOpenLogicalChannel: serial %d", serial); -#endif - if (s_vendorFunctions->version < 15) { - dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str()); - } else { - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL); - if (pRI == NULL) { - return Void(); - } - - RIL_OpenChannelParams params = {}; - - params.p2 = p2; - - if (!copyHidlStringToRil(¶ms.aidPtr, aid, pRI)) { - return Void(); - } - - CALL_ONREQUEST(pRI->pCI->requestNumber, ¶ms, sizeof(params), pRI, mSlotId); - - memsetAndFreeStrings(1, params.aidPtr); - } - return Void(); -} - -Return<void> RadioImpl_1_5::iccCloseLogicalChannel(int32_t serial, int32_t channelId) { -#if VDBG - RLOGD("iccCloseLogicalChannel: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId); - return Void(); -} - -Return<void> RadioImpl_1_5::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) { -#if VDBG - RLOGD("iccTransmitApduLogicalChannel: serial %d", serial); -#endif - dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message); - return Void(); -} - -Return<void> RadioImpl_1_5::nvReadItem(int32_t serial, NvItem itemId) { -#if VDBG - RLOGD("nvReadItem: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM); - if (pRI == NULL) { - return Void(); - } - - RIL_NV_ReadItem nvri = {}; - nvri.itemID = (RIL_NV_Item) itemId; - - CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::nvWriteItem(int32_t serial, const NvWriteItem& item) { -#if VDBG - RLOGD("nvWriteItem: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM); - if (pRI == NULL) { - return Void(); - } - - RIL_NV_WriteItem nvwi = {}; - - nvwi.itemID = (RIL_NV_Item) item.itemId; - - if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) { - return Void(); - } - - CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId); - - memsetAndFreeStrings(1, nvwi.value); - return Void(); -} - -Return<void> RadioImpl_1_5::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) { -#if VDBG - RLOGD("nvWriteCdmaPrl: serial %d", serial); -#endif - dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl); - return Void(); -} - -Return<void> RadioImpl_1_5::nvResetConfig(int32_t serial, ResetNvType resetType) { - int rilResetType = -1; -#if VDBG - RLOGD("nvResetConfig: serial %d", serial); -#endif - /* Convert ResetNvType to RIL.h values - * RIL_REQUEST_NV_RESET_CONFIG - * 1 - reload all NV items - * 2 - erase NV reset (SCRTN) - * 3 - factory reset (RTN) - */ - switch(resetType) { - case ResetNvType::RELOAD: - rilResetType = 1; - break; - case ResetNvType::ERASE: - rilResetType = 2; - break; - case ResetNvType::FACTORY_RESET: - rilResetType = 3; - break; - } - dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType); - return Void(); -} - -Return<void> RadioImpl_1_5::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) { -#if VDBG - RLOGD("setUiccSubscription: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SET_UICC_SUBSCRIPTION); - if (pRI == NULL) { - return Void(); - } - - RIL_SelectUiccSub rilUiccSub = {}; - - rilUiccSub.slot = uiccSub.slot; - rilUiccSub.app_index = uiccSub.appIndex; - rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType; - rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus; - - CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::setDataAllowed(int32_t serial, bool allow) { -#if VDBG - RLOGD("setDataAllowed: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow)); - return Void(); -} - -Return<void> RadioImpl_1_5::getHardwareConfig(int32_t serial) { -#if VDBG - RLOGD("getHardwareConfig: serial %d", serial); -#endif - RLOGD("getHardwareConfig: serial %d, mSlotId = %d", serial, mSlotId); - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG); - return Void(); -} - -Return<void> RadioImpl_1_5::requestIccSimAuthentication(int32_t serial, int32_t authContext, - const hidl_string& authData, const hidl_string& aid) { -#if VDBG - RLOGD("requestIccSimAuthentication: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION); - if (pRI == NULL) { - return Void(); - } - - RIL_SimAuthentication pf = {}; - - pf.authContext = authContext; - - if (!copyHidlStringToRil(&pf.authData, authData, pRI)) { - return Void(); - } - - if (!copyHidlStringToRil(&pf.aid, aid, pRI)) { - memsetAndFreeStrings(1, pf.authData); - return Void(); - } - - CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId); - - memsetAndFreeStrings(2, pf.authData, pf.aid); - return Void(); -} - -/** - * @param numProfiles number of data profile - * @param dataProfiles the pointer to the actual data profiles. The acceptable type is - RIL_DataProfileInfo or RIL_DataProfileInfo_v15. - * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure - * @param numfields number of string-type member in the data profile structure - * @param ... the variadic parameters are pointers to each string-type member - **/ -template <typename T> -void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs, - int numfields, ...) { - va_list args; - va_start(args, numfields); - - // Iterate through each string-type field that need to be free. - for (int i = 0; i < numfields; i++) { - // Iterate through each data profile and free that specific string-type field. - // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure. - char *T::*ptr = va_arg(args, char *T::*); - for (int j = 0; j < numProfiles; j++) { - memsetAndFreeStrings(1, dataProfiles[j].*ptr); - } - } - - va_end(args); - -#ifdef MEMSET_FREED - memset(dataProfiles, 0, numProfiles * sizeof(T)); - memset(dataProfilePtrs, 0, numProfiles * sizeof(T *)); -#endif - free(dataProfiles); - free(dataProfilePtrs); -} - -Return<void> RadioImpl_1_5::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles, - bool isRoaming) { -#if VDBG - RLOGD("setDataProfile: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE); - if (pRI == NULL) { - return Void(); - } - - size_t num = profiles.size(); - bool success = false; - - if (s_vendorFunctions->version <= 14) { - - RIL_DataProfileInfo *dataProfiles = - (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo)); - - if (dataProfiles == NULL) { - RLOGE("Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return Void(); - } - - RIL_DataProfileInfo **dataProfilePtrs = - (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *)); - if (dataProfilePtrs == NULL) { - RLOGE("Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - free(dataProfiles); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return Void(); - } - - for (size_t i = 0; i < num; i++) { - dataProfilePtrs[i] = &dataProfiles[i]; - - success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true); - - const hidl_string &protocol = - (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol); - - if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) { - success = false; - } - - if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI, - true)) { - success = false; - } - if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password, - pRI, true)) { - success = false; - } - - if (!success) { - freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4, - &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol, - &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password); - return Void(); - } - - dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId; - dataProfiles[i].authType = (int) profiles[i].authType; - dataProfiles[i].type = (int) profiles[i].type; - dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime; - dataProfiles[i].maxConns = profiles[i].maxConns; - dataProfiles[i].waitTime = profiles[i].waitTime; - dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled); - } - - CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs, - num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId); - - freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4, - &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol, - &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password); - } else { - RIL_DataProfileInfo_v15 *dataProfiles = - (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15)); - - if (dataProfiles == NULL) { - RLOGE("Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return Void(); - } - - RIL_DataProfileInfo_v15 **dataProfilePtrs = - (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *)); - if (dataProfilePtrs == NULL) { - RLOGE("Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - free(dataProfiles); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return Void(); - } - - for (size_t i = 0; i < num; i++) { - dataProfilePtrs[i] = &dataProfiles[i]; - - success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true); - if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol, - pRI)) { - success = false; - } - if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol, - profiles[i].roamingProtocol, pRI, true)) { - success = false; - } - if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI, - true)) { - success = false; - } - if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password, - pRI, true)) { - success = false; - } - if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData, - profiles[i].mvnoMatchData, pRI, true)) { - success = false; - } - - if (success && !convertMvnoTypeToString(profiles[i].mvnoType, - dataProfiles[i].mvnoType)) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - success = false; - } - - if (!success) { - freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6, - &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol, - &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user, - &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData); - return Void(); - } - - dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId; - dataProfiles[i].authType = (int) profiles[i].authType; - dataProfiles[i].type = (int) profiles[i].type; - dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime; - dataProfiles[i].maxConns = profiles[i].maxConns; - dataProfiles[i].waitTime = profiles[i].waitTime; - dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled); - dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap; - dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap; - dataProfiles[i].mtu = profiles[i].mtu; - } - - CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs, - num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId); - - freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6, - &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol, - &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user, - &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData); - } - - return Void(); -} - -Return<void> RadioImpl_1_5::requestShutdown(int32_t serial) { -#if VDBG - RLOGD("requestShutdown: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN); - return Void(); -} - -Return<void> RadioImpl_1_5::getRadioCapability(int32_t serial) { -#if VDBG - RLOGD("getRadioCapability: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY); - return Void(); -} - -Return<void> RadioImpl_1_5::setRadioCapability(int32_t serial, const RadioCapability& rc) { -#if VDBG - RLOGD("setRadioCapability: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY); - if (pRI == NULL) { - return Void(); - } - - RIL_RadioCapability rilRc = {}; - - // TODO : set rilRc.version using HIDL version ? - rilRc.session = rc.session; - rilRc.phase = (int) rc.phase; - rilRc.rat = (int) rc.raf; - rilRc.status = (int) rc.status; - strlcpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), sizeof(rilRc.logicalModemUuid)); - - CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId); - - return Void(); -} - -Return<void> RadioImpl_1_5::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) { -#if VDBG - RLOGD("startLceService: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval, - BOOL_TO_INT(pullMode)); - return Void(); -} - -Return<void> RadioImpl_1_5::stopLceService(int32_t serial) { -#if VDBG - RLOGD("stopLceService: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE); - return Void(); -} - -Return<void> RadioImpl_1_5::pullLceData(int32_t serial) { -#if VDBG - RLOGD("pullLceData: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA); - return Void(); -} - -Return<void> RadioImpl_1_5::getModemActivityInfo(int32_t serial) { -#if VDBG - RLOGD("getModemActivityInfo: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO); - return Void(); -} - -int prepareCarrierRestrictions(RIL_CarrierRestrictions &request, bool allAllowed, - const hidl_vec<Carrier>& allowedList, - const hidl_vec<Carrier>& excludedList, - RequestInfo *pRI) { - RIL_Carrier *allowedCarriers = NULL; - RIL_Carrier *excludedCarriers = NULL; - - request.len_allowed_carriers = allowedList.size(); - allowedCarriers = (RIL_Carrier *)calloc(request.len_allowed_carriers, sizeof(RIL_Carrier)); - if (allowedCarriers == NULL) { - RLOGE("prepareCarrierRestrictions: Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); - return -1; - } - request.allowed_carriers = allowedCarriers; - - request.len_excluded_carriers = excludedList.size(); - excludedCarriers = (RIL_Carrier *)calloc(request.len_excluded_carriers, sizeof(RIL_Carrier)); - if (excludedCarriers == NULL) { - RLOGE("prepareCarrierRestrictions: Memory allocation failed for request %s", - requestToString(pRI->pCI->requestNumber)); - sendErrorResponse(pRI, RIL_E_NO_MEMORY); -#ifdef MEMSET_FREED - memset(allowedCarriers, 0, request.len_allowed_carriers * sizeof(RIL_Carrier)); -#endif - free(allowedCarriers); - return -1; - } - request.excluded_carriers = excludedCarriers; - - for (int i = 0; i < request.len_allowed_carriers; i++) { - allowedCarriers[i].mcc = allowedList[i].mcc.c_str(); - allowedCarriers[i].mnc = allowedList[i].mnc.c_str(); - allowedCarriers[i].match_type = (RIL_CarrierMatchType) allowedList[i].matchType; - allowedCarriers[i].match_data = allowedList[i].matchData.c_str(); - } - - for (int i = 0; i < request.len_excluded_carriers; i++) { - excludedCarriers[i].mcc = excludedList[i].mcc.c_str(); - excludedCarriers[i].mnc = excludedList[i].mnc.c_str(); - excludedCarriers[i].match_type = - (RIL_CarrierMatchType) excludedList[i].matchType; - excludedCarriers[i].match_data = excludedList[i].matchData.c_str(); - } - - return 0; -} - -void freeCarrierRestrictions(RIL_CarrierRestrictions &request) { - if (request.allowed_carriers != NULL) { -#ifdef MEMSET_FREED - memset(request.allowed_carriers, 0, request.len_allowed_carriers * sizeof(RIL_Carrier)); -#endif - free(request.allowed_carriers); - } - if (request.excluded_carriers != NULL) { -#ifdef MEMSET_FREED - memset(request.excluded_carriers, 0, request.len_excluded_carriers * sizeof(RIL_Carrier)); -#endif - free(request.excluded_carriers); - } -} - - -Return<void> RadioImpl_1_5::setAllowedCarriers(int32_t serial, bool allAllowed, - const CarrierRestrictions& carriers) { -#if VDBG - RLOGD("setAllowedCarriers: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SET_CARRIER_RESTRICTIONS); - if (pRI == NULL) { - return Void(); - } - - RIL_CarrierRestrictions cr = {}; - if (prepareCarrierRestrictions(cr, allAllowed, carriers.allowedCarriers, - carriers.excludedCarriers, pRI) < 0) { - return Void(); - } - - CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId); - - freeCarrierRestrictions(cr); - - return Void(); -} - -Return<void> RadioImpl_1_5::setAllowedCarriers_1_4(int32_t serial, - const ::android::hardware::radio::V1_4::CarrierRestrictionsWithPriority& carriers, - ::android::hardware::radio::V1_4::SimLockMultiSimPolicy multiSimPolicy) { -#if VDBG - RLOGD("setAllowedCarriers_1_4: serial %d", serial); -#endif - - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SET_CARRIER_RESTRICTIONS_1_4); - if (pRI == NULL) { - return Void(); - } - - // Prepare legacy structure (defined in IRadio 1.0) to re-use existing code. - RIL_CarrierRestrictions cr = {}; - if (prepareCarrierRestrictions(cr, false, carriers.allowedCarriers, - carriers.excludedCarriers, pRI) < 0) { - return Void(); - } - // Copy the legacy structure into the new structure (defined in IRadio 1.4) - RIL_CarrierRestrictionsWithPriority crExt = {}; - crExt.len_allowed_carriers = cr.len_allowed_carriers; - crExt.allowed_carriers = cr.allowed_carriers; - crExt.len_excluded_carriers = cr.len_excluded_carriers; - crExt.excluded_carriers = cr.excluded_carriers; - crExt.allowedCarriersPrioritized = BOOL_TO_INT(carriers.allowedCarriersPrioritized); - crExt.multiSimPolicy = (RIL_SimLockMultiSimPolicy)multiSimPolicy; - - CALL_ONREQUEST(pRI->pCI->requestNumber, &crExt, - sizeof(RIL_CarrierRestrictionsWithPriority), pRI, mSlotId); - - freeCarrierRestrictions(cr); - - return Void(); -} - -Return<void> RadioImpl_1_5::getAllowedCarriers(int32_t serial) { -#if VDBG - RLOGD("getAllowedCarriers: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS); - return Void(); -} - -Return<void> RadioImpl_1_5::getAllowedCarriers_1_4(int32_t serial) { -#if VDBG - RLOGD("getAllowedCarriers_1_4: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS_1_4); - return Void(); -} - -Return<void> RadioImpl_1_5::sendDeviceState(int32_t serial, DeviceStateType deviceStateType, - bool state) { -#if VDBG - RLOGD("sendDeviceState: serial %d", serial); -#endif - if (s_vendorFunctions->version < 15) { - if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) { - RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state)); - dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state)); - } else { - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SEND_DEVICE_STATE); - sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED); - } - return Void(); - } - dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType, - BOOL_TO_INT(state)); - return Void(); -} - -Return<void> RadioImpl_1_5::setIndicationFilter(int32_t serial, int32_t indicationFilter) { -#if VDBG - RLOGD("setIndicationFilter: serial %d", serial); -#endif - if (s_vendorFunctions->version < 15) { - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER); - sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED); - return Void(); - } - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter); - return Void(); -} - -Return<void> RadioImpl_1_5::setSimCardPower(int32_t serial, bool powerUp) { -#if VDBG - RLOGD("setSimCardPower: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp)); - return Void(); -} - -Return<void> RadioImpl_1_5::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) { -#if VDBG - RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state); - return Void(); -} - -Return<void> RadioImpl_1_5::setCarrierInfoForImsiEncryption(int32_t serial, - const V1_1::ImsiEncryptionInfo& data) { -#if VDBG - RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial); -#endif - RequestInfo *pRI = android::addRequestToList( - serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION); - if (pRI == NULL) { - return Void(); - } - - RIL_CarrierInfoForImsiEncryption imsiEncryption = {}; - - if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) { - return Void(); - } - if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) { - memsetAndFreeStrings(1, imsiEncryption.mnc); - return Void(); - } - if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) { - memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc); - return Void(); - } - imsiEncryption.carrierKeyLength = data.carrierKey.size(); - imsiEncryption.carrierKey = new uint8_t[imsiEncryption.carrierKeyLength]; - memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), imsiEncryption.carrierKeyLength); - imsiEncryption.expirationTime = data.expirationTime; - CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption, - sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId); - delete(imsiEncryption.carrierKey); - return Void(); -} - -Return<void> RadioImpl_1_5::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE); - if (pRI == NULL) { - return Void(); - } - - RIL_KeepaliveRequest kaReq = {}; - - kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type); - switch(kaReq.type) { - case NATT_IPV4: - if (keepalive.sourceAddress.size() != 4 || - keepalive.destinationAddress.size() != 4) { - RLOGE("Invalid address for keepalive!"); - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return Void(); - } - break; - case NATT_IPV6: - if (keepalive.sourceAddress.size() != 16 || - keepalive.destinationAddress.size() != 16) { - RLOGE("Invalid address for keepalive!"); - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return Void(); - } - break; - default: - RLOGE("Unknown packet keepalive type!"); - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return Void(); - } - - ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size()); - kaReq.sourcePort = keepalive.sourcePort; - - ::memcpy(kaReq.destinationAddress, - keepalive.destinationAddress.data(), keepalive.destinationAddress.size()); - kaReq.destinationPort = keepalive.destinationPort; - - kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis; - kaReq.cid = keepalive.cid; // This is the context ID of the data call - - CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::stopKeepalive(int32_t serial, int32_t sessionHandle) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE); - if (pRI == NULL) { - return Void(); - } - - CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId); - return Void(); -} - -Return<void> RadioImpl_1_5::responseAcknowledgement() { - android::releaseWakeLock(); - return Void(); -} - -int prepareNetworkScanRequest_1_2(RIL_NetworkScanRequest &scan_request, - const ::android::hardware::radio::V1_2::NetworkScanRequest& request, - RequestInfo *pRI) { - - scan_request.type = (RIL_ScanType) request.type; - scan_request.interval = request.interval; - scan_request.specifiers_length = request.specifiers.size(); - - int intervalLow = static_cast<int>(::android::hardware::radio::V1_2::ScanIntervalRange::MIN); - int intervalHigh = static_cast<int>(::android::hardware::radio::V1_2::ScanIntervalRange::MAX); - int maxSearchTimeLow = - static_cast<int>(::android::hardware::radio::V1_2::MaxSearchTimeRange::MIN); - int maxSearchTimeHigh = - static_cast<int>(::android::hardware::radio::V1_2::MaxSearchTimeRange::MAX); - int incrementalResultsPeriodicityRangeLow = - static_cast<int>(::android::hardware::radio::V1_2::IncrementalResultsPeriodicityRange::MIN); - int incrementalResultsPeriodicityRangeHigh = - static_cast<int>(::android::hardware::radio::V1_2::IncrementalResultsPeriodicityRange::MAX); - uint maxSpecifierSize = - static_cast<uint>(::android::hardware::radio::V1_2::RadioConst - ::RADIO_ACCESS_SPECIFIER_MAX_SIZE); - - if (request.interval < intervalLow || request.interval > intervalHigh) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - // If defined, must fall in correct range. - if (request.maxSearchTime != 0 - && (request.maxSearchTime < maxSearchTimeLow - || request.maxSearchTime > maxSearchTimeHigh)) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - if (request.maxSearchTime != 0 - && (request.incrementalResultsPeriodicity < incrementalResultsPeriodicityRangeLow - || request.incrementalResultsPeriodicity > incrementalResultsPeriodicityRangeHigh - || request.incrementalResultsPeriodicity > request.maxSearchTime)) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - if (request.specifiers.size() == 0 || request.specifiers.size() > maxSpecifierSize) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - - for (size_t i = 0; i < request.specifiers.size(); ++i) { - if (request.specifiers[i].geranBands.size() > MAX_BANDS || - request.specifiers[i].utranBands.size() > MAX_BANDS || - request.specifiers[i].eutranBands.size() > MAX_BANDS || - request.specifiers[i].channels.size() > MAX_CHANNELS) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - const V1_1::RadioAccessSpecifier& ras_from = - request.specifiers[i]; - RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i]; - - ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork; - ras_to.channels_length = ras_from.channels.size(); - - std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels); - const std::vector<uint32_t> * bands = nullptr; - switch (request.specifiers[i].radioAccessNetwork) { - case V1_1::RadioAccessNetworks::GERAN: - ras_to.bands_length = ras_from.geranBands.size(); - bands = (std::vector<uint32_t> *) &ras_from.geranBands; - break; - case V1_1::RadioAccessNetworks::UTRAN: - ras_to.bands_length = ras_from.utranBands.size(); - bands = (std::vector<uint32_t> *) &ras_from.utranBands; - break; - case V1_1::RadioAccessNetworks::EUTRAN: - ras_to.bands_length = ras_from.eutranBands.size(); - bands = (std::vector<uint32_t> *) &ras_from.eutranBands; - break; - default: - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - // safe to copy to geran_bands because it's a union member - for (size_t idx = 0; idx < ras_to.bands_length; ++idx) { - ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx]; - } - } - - return 0; -} - -int prepareNetworkScanRequest_1_5(RIL_NetworkScanRequest &scan_request, - const ::android::hardware::radio::V1_5::NetworkScanRequest& request, - RequestInfo *pRI) { - - scan_request.type = (RIL_ScanType) request.type; - scan_request.interval = request.interval; - scan_request.specifiers_length = request.specifiers.size(); - - int intervalLow = static_cast<int>(::android::hardware::radio::V1_2::ScanIntervalRange::MIN); - int intervalHigh = static_cast<int>(::android::hardware::radio::V1_2::ScanIntervalRange::MAX); - int maxSearchTimeLow = - static_cast<int>(::android::hardware::radio::V1_2::MaxSearchTimeRange::MIN); - int maxSearchTimeHigh = - static_cast<int>(::android::hardware::radio::V1_2::MaxSearchTimeRange::MAX); - int incrementalResultsPeriodicityRangeLow = - static_cast<int>(::android::hardware::radio::V1_2::IncrementalResultsPeriodicityRange::MIN); - int incrementalResultsPeriodicityRangeHigh = - static_cast<int>(::android::hardware::radio::V1_2::IncrementalResultsPeriodicityRange::MAX); - uint maxSpecifierSize = - static_cast<uint>(::android::hardware::radio::V1_2::RadioConst - ::RADIO_ACCESS_SPECIFIER_MAX_SIZE); - - if (request.interval < intervalLow || request.interval > intervalHigh) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - // If defined, must fall in correct range. - if (request.maxSearchTime != 0 - && (request.maxSearchTime < maxSearchTimeLow - || request.maxSearchTime > maxSearchTimeHigh)) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - if (request.maxSearchTime != 0 - && (request.incrementalResultsPeriodicity < incrementalResultsPeriodicityRangeLow - || request.incrementalResultsPeriodicity > incrementalResultsPeriodicityRangeHigh - || request.incrementalResultsPeriodicity > request.maxSearchTime)) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - if (request.specifiers.size() == 0 || request.specifiers.size() > maxSpecifierSize) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - - for (size_t i = 0; i < request.specifiers.size(); ++i) { - if (request.specifiers[i].bands.geranBands().size() > MAX_BANDS || - request.specifiers[i].bands.utranBands().size() > MAX_BANDS || - request.specifiers[i].bands.eutranBands().size() > MAX_BANDS || - request.specifiers[i].bands.ngranBands().size() > MAX_BANDS || - request.specifiers[i].channels.size() > MAX_CHANNELS) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - const V1_5::RadioAccessSpecifier& ras_from = request.specifiers[i]; - RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i]; - - ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork; - ras_to.channels_length = ras_from.channels.size(); - - std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels); - const std::vector<uint32_t> * bands = nullptr; - switch (request.specifiers[i].radioAccessNetwork) { - case V1_5::RadioAccessNetworks::GERAN: - ras_to.bands_length = ras_from.bands.geranBands().size(); - bands = (std::vector<uint32_t> *) &ras_from.bands; - break; - case V1_5::RadioAccessNetworks::UTRAN: - ras_to.bands_length = ras_from.bands.utranBands().size(); - bands = (std::vector<uint32_t> *) &ras_from.bands; - break; - case V1_5::RadioAccessNetworks::EUTRAN: - ras_to.bands_length = ras_from.bands.eutranBands().size(); - bands = (std::vector<uint32_t> *) &ras_from.bands; - break; - case V1_5::RadioAccessNetworks::NGRAN: - ras_to.bands_length = ras_from.bands.ngranBands().size(); - bands = (std::vector<uint32_t> *) &ras_from.bands; - break; - default: - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - return -1; - } - // safe to copy to geran_bands because it's a union member - for (size_t idx = 0; idx < ras_to.bands_length; ++idx) { - ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx]; - } - } - - return 0; -} - -// Methods from ::android::hardware::radio::V1_2::IRadio follow. -Return<void> RadioImpl_1_5::startNetworkScan_1_2(int32_t serial, - const ::android::hardware::radio::V1_2::NetworkScanRequest& request) { -#if VDBG - RLOGD("startNetworkScan_1_2: serial %d", serial); -#endif - - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN); - if (pRI == NULL) { - return Void(); - } - - // TODO: implement checks for new fields. - // NetworkScanRequest added maxSearchTime, incrementalResults, incrementalResultsPeriodicity and - // mccMncs, could add more validations using request2 here. - - RIL_NetworkScanRequest scan_request = {}; - - if (prepareNetworkScanRequest_1_2(scan_request, request, pRI) < 0) { - return Void(); - } - - CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI, - mSlotId); - - return Void(); -} - -Return<void> RadioImpl_1_5::setIndicationFilter_1_2(int32_t /* serial */, - hidl_bitfield<::android::hardware::radio::V1_2::IndicationFilter> /* indicationFilter */) { - // TODO implement -#if VDBG - RLOGE("[%04d]< %s", serial, "Method is not implemented"); -#endif - return Void(); -} - -Return<void> RadioImpl_1_5::setSignalStrengthReportingCriteria(int32_t /* serial */, - int32_t /* hysteresisMs */, int32_t /* hysteresisDb */, - const hidl_vec<int32_t>& /* thresholdsDbm */, - ::android::hardware::radio::V1_2::AccessNetwork /* accessNetwork */) { - // TODO implement -#if VDBG - RLOGE("[%04d]< %s", serial, "Method is not implemented"); -#endif - return Void(); -} - -Return<void> RadioImpl_1_5::setLinkCapacityReportingCriteria(int32_t /* serial */, - int32_t /* hysteresisMs */, int32_t /* hysteresisDlKbps */, int32_t /* hysteresisUlKbps */, - const hidl_vec<int32_t>& /* thresholdsDownlinkKbps */, - const hidl_vec<int32_t>& /* thresholdsUplinkKbps */, - ::android::hardware::radio::V1_2::AccessNetwork /* accessNetwork */) { - // TODO implement -#if VDBG - RLOGE("[%04d]< %s", serial, "Method is not implemented"); -#endif - return Void(); -} - -Return<void> RadioImpl_1_5::setupDataCall_1_2(int32_t /* serial */, - ::android::hardware::radio::V1_2::AccessNetwork /* accessNetwork */, - const ::android::hardware::radio::V1_0::DataProfileInfo& /* dataProfileInfo */, - bool /* modemCognitive */, bool /* roamingAllowed */, bool /* isRoaming */, - ::android::hardware::radio::V1_2::DataRequestReason /* reason */, - const hidl_vec<hidl_string>& /* addresses */, const hidl_vec<hidl_string>& /* dnses */) { - // TODO implement -#if VDBG - RLOGE("[%04d]< %s", serial, "Method is not implemented"); -#endif - return Void(); -} - -Return<void> RadioImpl_1_5::deactivateDataCall_1_2(int32_t /* serial */, int32_t /* cid */, - ::android::hardware::radio::V1_2::DataRequestReason /* reason */) { - // TODO implement -#if VDBG - RLOGE("[%04d]< %s", serial, "Method is not implemented"); -#endif - return Void(); -} - -// Methods from ::android::hardware::radio::V1_3::IRadio follow. -Return<void> RadioImpl_1_5::setSystemSelectionChannels(int32_t serial, bool /* specifyChannels */, - const hidl_vec<::android::hardware::radio::V1_1::RadioAccessSpecifier>& /* specifiers */) { -#if VDBG - RLOGD("setSystemSelectionChannels: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS); - return Void(); -} - -Return<void> RadioImpl_1_5::enableModem(int32_t serial, bool /* on */) { -#if VDBG - RLOGE("enableModem: serial = %d, enable = %s", serial, on); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_ENABLE_MODEM); - return Void(); -} - -Return<void> RadioImpl_1_5::getModemStackStatus(int32_t serial) { -#if VDBG - RLOGD("getModemStackStatus: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MODEM_STACK_STATUS); - return Void(); -} - -const char * getProtocolString(const ::android::hardware::radio::V1_4::PdpProtocolType protocolVal) { - switch(protocolVal) { - case ::android::hardware::radio::V1_4::PdpProtocolType::IP: - return "IP"; - case ::android::hardware::radio::V1_4::PdpProtocolType::IPV6: - return "IPV6"; - case ::android::hardware::radio::V1_4::PdpProtocolType::IPV4V6: - return "IPV4V6"; - case ::android::hardware::radio::V1_4::PdpProtocolType::PPP: - return "PPP"; - case ::android::hardware::radio::V1_4::PdpProtocolType::NON_IP: - return "NON_IP"; - case ::android::hardware::radio::V1_4::PdpProtocolType::UNSTRUCTURED: - return "UNSTRUCTURED"; - default: - return "UNKNOWN"; - } -} - -// Methods from ::android::hardware::radio::V1_4::IRadio follow. -Return<void> RadioImpl_1_5::setupDataCall_1_4(int32_t serial , - ::android::hardware::radio::V1_4::AccessNetwork /* accessNetwork */, - const ::android::hardware::radio::V1_4::DataProfileInfo& dataProfileInfo, - bool roamingAllowed, ::android::hardware::radio::V1_2::DataRequestReason /* reason */, - const hidl_vec<hidl_string>& /* addresses */, const hidl_vec<hidl_string>& /* dnses */) { - -#if VDBG - RLOGD("setupDataCall_1_4: serial %d", serial); -#endif - - char *mvnoTypeStr = NULL; - if (!convertMvnoTypeToString(MvnoType::IMSI, mvnoTypeStr)) { - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SETUP_DATA_CALL); - if (pRI != NULL) { - sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); - } - return Void(); - } - dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15, - std::to_string((int) RadioTechnology::UNKNOWN + 2).c_str(), - std::to_string((int) dataProfileInfo.profileId).c_str(), - dataProfileInfo.apn.c_str(), - dataProfileInfo.user.c_str(), - dataProfileInfo.password.c_str(), - std::to_string((int) dataProfileInfo.authType).c_str(), - getProtocolString(dataProfileInfo.protocol), - getProtocolString(dataProfileInfo.roamingProtocol), - std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(), - std::to_string(dataProfileInfo.bearerBitmap).c_str(), - dataProfileInfo.persistent ? "1" : "0", - std::to_string(dataProfileInfo.mtu).c_str(), - mvnoTypeStr, - "302720x94", - roamingAllowed ? "1" : "0"); - return Void(); -} - -Return<void> RadioImpl_1_5::setInitialAttachApn_1_4(int32_t serial , - const ::android::hardware::radio::V1_4::DataProfileInfo& dataProfileInfo) { - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SET_INITIAL_ATTACH_APN); - if (pRI == NULL) { - return Void(); - } - - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, RESPONSE_SOLICITED, RIL_E_SUCCESS); - - if (radioService[mSlotId]->mRadioResponseV1_4 != NULL) { - Return<void> retStatus - = radioService[mSlotId]->mRadioResponseV1_4->setInitialAttachApnResponse(responseInfo); - radioService[mSlotId]->checkReturnStatus(retStatus); - } else if (radioService[mSlotId]->mRadioResponse != NULL) { - Return<void> retStatus - = radioService[mSlotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo); - radioService[mSlotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL", mSlotId); - } - - return Void(); -} - -Return<void> RadioImpl_1_5::setDataProfile_1_4(int32_t serial , - const hidl_vec<::android::hardware::radio::V1_4::DataProfileInfo>& /* profiles */) { - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, - RIL_REQUEST_SET_DATA_PROFILE); - if (pRI == NULL) { - return Void(); - } - - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, RESPONSE_SOLICITED, RIL_E_SUCCESS); - - if (radioService[mSlotId]->mRadioResponseV1_4 != NULL) { - Return<void> retStatus - = radioService[mSlotId]->mRadioResponseV1_4->setDataProfileResponse(responseInfo); - radioService[mSlotId]->checkReturnStatus(retStatus); - } else if (radioService[mSlotId]->mRadioResponse != NULL) { - Return<void> retStatus - = radioService[mSlotId]->mRadioResponse->setDataProfileResponse(responseInfo); - radioService[mSlotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", mSlotId); - } - - return Void(); -} - -Return<void> RadioImpl_1_5::emergencyDial(int32_t serial, - const ::android::hardware::radio::V1_0::Dial& dialInfo, - hidl_bitfield<android::hardware::radio::V1_4::EmergencyServiceCategory> /* categories */, - const hidl_vec<hidl_string>& /* urns */, - ::android::hardware::radio::V1_4::EmergencyCallRouting /* routing */, - bool /* fromEmergencyDialer */, bool /* isTesting */) { -#if VDBG - RLOGD("emergencyDial: serial %d", serial); -#endif - - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_EMERGENCY_DIAL); - if (pRI == NULL) { - return Void(); - } - RIL_Dial dial = {}; - RIL_UUS_Info uusInfo = {}; - int32_t sizeOfDial = sizeof(dial); - - if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) { - return Void(); - } - dial.clir = (int) dialInfo.clir; - - if (dialInfo.uusInfo.size() != 0) { - uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType; - uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs; - - if (dialInfo.uusInfo[0].uusData.size() == 0) { - uusInfo.uusData = NULL; - uusInfo.uusLength = 0; - } else { - if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) { - memsetAndFreeStrings(1, dial.address); - return Void(); - } - uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size(); - } - - dial.uusInfo = &uusInfo; - } - - CALL_ONREQUEST(RIL_REQUEST_EMERGENCY_DIAL, &dial, sizeOfDial, pRI, mSlotId); - - memsetAndFreeStrings(2, dial.address, uusInfo.uusData); - - return Void(); -} - -Return<void> RadioImpl_1_5::startNetworkScan_1_4(int32_t serial, - const ::android::hardware::radio::V1_2::NetworkScanRequest& request) { -#if VDBG - RLOGD("startNetworkScan_1_4: serial %d", serial); -#endif - - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN4); - if (pRI == NULL) { - return Void(); - } - - // TODO: implement checks for new fields. - // NetworkScanRequest added maxSearchTime, incrementalResults, incrementalResultsPeriodicity and - // mccMncs, could add more validations using request2 here. - - RIL_NetworkScanRequest scan_request = {}; - - if (prepareNetworkScanRequest_1_2(scan_request, request, pRI) < 0) { - return Void(); - } - - CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN4, &scan_request, sizeof(scan_request), pRI, - mSlotId); - - return Void(); -} - -Return<void> RadioImpl_1_5::getPreferredNetworkTypeBitmap(int32_t serial ) { -#if VDBG - RLOGD("getPreferredNetworkTypeBitmap: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE_BITMAP); - return Void(); -} - -Return<void> RadioImpl_1_5::setPreferredNetworkTypeBitmap( - int32_t serial, hidl_bitfield<RadioAccessFamily> networkTypeBitmap) { -#if VDBG - RLOGD("setPreferredNetworkTypeBitmap: serial %d", serial); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE_BITMAP, 1, networkTypeBitmap); - return Void(); -} - -Return<void> RadioImpl_1_5::getSignalStrength_1_4(int32_t serial) { -#if VDBG - RLOGD("getSignalStrength_1_4: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH); - return Void(); -} - -// Methods from ::android::hardware::radio::IRadio::V1_5 follow. -Return<void> RadioImpl_1_5::setSignalStrengthReportingCriteria_1_5(int32_t /* serial */, - const ::android::hardware::radio::V1_5::SignalThresholdInfo& /* signalThresholdInfo */, - const ::android::hardware::radio::V1_5::AccessNetwork /* accessNetwork */) { - // TODO implement -#if VDBG - RLOGE("[%04d]< %s", serial, "Method is not implemented"); -#endif - return Void(); -} - -Return<void> RadioImpl_1_5::enableUiccApplications(int32_t serial, bool enable) { -#if VDBG - RLOGD("enableUiccApplications: serial %d enable %d", serial, enable); -#endif - dispatchInts(serial, mSlotId, RIL_REQUEST_ENABLE_UICC_APPLICATIONS, 1, BOOL_TO_INT(enable)); - return Void(); -} - -Return<void> RadioImpl_1_5::areUiccApplicationsEnabled(int32_t serial) { -#if VDBG - RLOGD("areUiccApplicationsEnabled: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_ARE_UICC_APPLICATIONS_ENABLED); - return Void(); -} - -Return<void> RadioImpl_1_5::canToggleUiccApplicationsEnablement(int32_t serial) { -#if VDBG - RLOGD("canToggleUiccApplicationsEnablement: serial %d.", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_CAN_TOGGLE_UICC_APPLICATIONS_ENABLEMENT); - return Void(); -} - -Return<void> RadioImpl_1_5::setSystemSelectionChannels_1_5(int32_t serial, bool /* specifyChannels */, - const hidl_vec<::android::hardware::radio::V1_5::RadioAccessSpecifier>& /* specifiers */) { -#if VDBG - RLOGD("setSystemSelectionChannels_1_5: serial %d", serial); -#endif - dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS_1_5); - return Void(); -} - -Return<void> RadioImpl_1_5::startNetworkScan_1_5(int32_t serial, - const ::android::hardware::radio::V1_5::NetworkScanRequest& request) { -#if VDBG - RLOGD("startNetworkScan_1_5: serial %d", serial); -#endif - - RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN_1_5); - if (pRI == NULL) { - return Void(); - } - - // TODO: implement checks for new fields. - // NetworkScanRequest added maxSearchTime, incrementalResults, incrementalResultsPeriodicity and - // mccMncs, could add more validations using request2 here. - - RIL_NetworkScanRequest scan_request = {}; - - if (prepareNetworkScanRequest_1_5(scan_request, request, pRI) < 0) { - return Void(); - } - - CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN_1_5, &scan_request, sizeof(scan_request), pRI, - mSlotId); - - return Void(); -} - -// OEM hook methods: -Return<void> OemHookImpl::setResponseFunctions( - const ::android::sp<IOemHookResponse>& oemHookResponseParam, - const ::android::sp<IOemHookIndication>& oemHookIndicationParam) { -#if VDBG - RLOGD("OemHookImpl::setResponseFunctions"); -#endif - - pthread_rwlock_t *radioServiceRwlockPtr = radio_1_5::getRadioServiceRwlock(mSlotId); - int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr); - assert(ret == 0); - - mOemHookResponse = oemHookResponseParam; - mOemHookIndication = oemHookIndicationParam; - mCounterOemHook[mSlotId]++; - - ret = pthread_rwlock_unlock(radioServiceRwlockPtr); - assert(ret == 0); - - return Void(); -} - -Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) { -#if VDBG - RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial); -#endif - dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data); - return Void(); -} - -Return<void> OemHookImpl::sendRequestStrings(int32_t serial, - const hidl_vec<hidl_string>& data) { -#if VDBG - RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial); -#endif - dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data); - return Void(); -} - -/*************************************************************************************************** - * RESPONSE FUNCTIONS - * Functions above are used for requests going from framework to vendor code. The ones below are - * responses for those requests coming back from the vendor code. - **************************************************************************************************/ - -void radio_1_5::acknowledgeRequest(int slotId, int serial) { - if (radioService[slotId]->mRadioResponse != NULL) { - Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId); - } -} - -void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType, - RIL_Errno e) { - responseInfo.serial = serial; - switch (responseType) { - case RESPONSE_SOLICITED: - responseInfo.type = RadioResponseType::SOLICITED; - break; - case RESPONSE_SOLICITED_ACK_EXP: - responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP; - break; - } - responseInfo.error = (RadioError) e; -} - -int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e, - void *response, size_t responseLen) { - populateResponseInfo(responseInfo, serial, responseType, e); - int ret = -1; - - if (response == NULL && responseLen == 0) { - // Earlier RILs did not send a response for some cases although the interface - // expected an integer as response. Do not return error if response is empty. Instead - // Return -1 in those cases to maintain backward compatibility. - } else if (response == NULL || responseLen != sizeof(int)) { - RLOGE("responseIntOrEmpty: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *p_int = (int *) response; - ret = p_int[0]; - } - return ret; -} - -int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e, - void *response, size_t responseLen) { - populateResponseInfo(responseInfo, serial, responseType, e); - int ret = -1; - - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("responseInt: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *p_int = (int *) response; - ret = p_int[0]; - } - return ret; -} - -int radio_1_5::getIccCardStatusResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { - if (radioService[slotId]->mRadioResponseV1_4 != NULL - || radioService[slotId]->mRadioResponseV1_2 != NULL - || radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - CardStatus cardStatus = {CardState::ABSENT, PinState::UNKNOWN, -1, -1, -1, {}}; - RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response); - if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6) - || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications - || p_cur->cdma_subscription_app_index >= p_cur->num_applications - || p_cur->ims_subscription_app_index >= p_cur->num_applications) { - RLOGE("getIccCardStatusResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - cardStatus.cardState = (CardState) p_cur->card_state; - cardStatus.universalPinState = (PinState) p_cur->universal_pin_state; - cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index; - cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index; - cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index; - - RIL_AppStatus *rilAppStatus = p_cur->applications; - cardStatus.applications.resize(p_cur->num_applications); - AppStatus *appStatus = cardStatus.applications.data(); -#if VDBG - RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications); -#endif - for (int i = 0; i < p_cur->num_applications; i++) { - appStatus[i].appType = (AppType) rilAppStatus[i].app_type; - appStatus[i].appState = (AppState) rilAppStatus[i].app_state; - appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate; - appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr); - appStatus[i].appLabelPtr = convertCharPtrToHidlString( - rilAppStatus[i].app_label_ptr); - appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced; - appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1; - appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2; - } - } - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - ::android::hardware::radio::V1_2::CardStatus cardStatusV1_2; - ::android::hardware::radio::V1_4::CardStatus cardStatusV1_4; - cardStatusV1_2.base = cardStatus; - cardStatusV1_2.physicalSlotId = -1; - cardStatusV1_4.base = cardStatusV1_2; - Return<void> retStatus = radioService[slotId]->mRadioResponseV1_4-> - getIccCardStatusResponse_1_4(responseInfo, cardStatusV1_4); - radioService[slotId]->checkReturnStatus(retStatus); - } else if (radioService[slotId]->mRadioResponseV1_3 != NULL) { - ::android::hardware::radio::V1_2::CardStatus cardStatusV1_2; - cardStatusV1_2.base = cardStatus; - cardStatusV1_2.physicalSlotId = -1; - Return<void> retStatus = radioService[slotId]->mRadioResponseV1_3-> - getIccCardStatusResponse_1_2(responseInfo, cardStatusV1_2); - radioService[slotId]->checkReturnStatus(retStatus); - } else if (radioService[slotId]->mRadioResponseV1_2 != NULL) { - ::android::hardware::radio::V1_2::CardStatus cardStatusV1_2; - cardStatusV1_2.base = cardStatus; - cardStatusV1_2.physicalSlotId = -1; - Return<void> retStatus = radioService[slotId]->mRadioResponseV1_2-> - getIccCardStatusResponse_1_2(responseInfo, cardStatusV1_2); - radioService[slotId]->checkReturnStatus(retStatus); - // TODO: add 1.1 if needed. - } else { - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - getIccCardStatusResponse(responseInfo, cardStatus); - radioService[slotId]->checkReturnStatus(retStatus); - } - } else { - RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::supplyIccPinForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("supplyIccPinForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - supplyIccPinForAppResponse(responseInfo, ret); - RLOGE("supplyIccPinForAppResponse: amit ret %d", ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::supplyIccPukForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("supplyIccPukForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse( - responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::supplyIccPin2ForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("supplyIccPin2ForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - supplyIccPin2ForAppResponse(responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::supplyIccPuk2ForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - supplyIccPuk2ForAppResponse(responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::changeIccPinForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("changeIccPinForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - changeIccPinForAppResponse(responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::changeIccPin2ForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("changeIccPin2ForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - changeIccPin2ForAppResponse(responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::supplyNetworkDepersonalizationResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - supplyNetworkDepersonalizationResponse(responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == " - "NULL", slotId); - } - - return 0; -} - -int radio_1_5::getCurrentCallsResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getCurrentCallsResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - hidl_vec<Call> calls; - if ((response == NULL && responseLen != 0) - || (responseLen % sizeof(RIL_Call *)) != 0) { - RLOGE("getCurrentCallsResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int num = responseLen / sizeof(RIL_Call *); - calls.resize(num); - - for (int i = 0 ; i < num ; i++) { - RIL_Call *p_cur = ((RIL_Call **) response)[i]; - /* each call info */ - calls[i].state = (CallState) p_cur->state; - calls[i].index = p_cur->index; - calls[i].toa = p_cur->toa; - calls[i].isMpty = p_cur->isMpty; - calls[i].isMT = p_cur->isMT; - calls[i].als = p_cur->als; - calls[i].isVoice = p_cur->isVoice; - calls[i].isVoicePrivacy = p_cur->isVoicePrivacy; - calls[i].number = convertCharPtrToHidlString(p_cur->number); - calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation; - calls[i].name = convertCharPtrToHidlString(p_cur->name); - calls[i].namePresentation = (CallPresentation) p_cur->namePresentation; - if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) { - RIL_UUS_Info *uusInfo = p_cur->uusInfo; - calls[i].uusInfo.resize(1); - calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType; - calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs; - // convert uusInfo->uusData to a null-terminated string - char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength); - calls[i].uusInfo[0].uusData = nullTermStr; - free(nullTermStr); - } - } - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - getCurrentCallsResponse(responseInfo, calls); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::dialResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("dialResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getIMSIForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getIMSIForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse( - responseInfo, convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::hangupConnectionResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("hangupConnectionResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::hangupWaitingOrBackgroundResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = - radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial, - RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = - radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial, - RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = - radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::conferenceResponse(int slotId, int responseType, - int serial, RIL_Errno e, void *response, size_t responseLen) { -#if VDBG - RLOGD("conferenceResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::rejectCallResponse(int slotId, int responseType, - int serial, RIL_Errno e, void *response, size_t responseLen) { -#if VDBG - RLOGD("rejectCallResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getLastCallFailCauseResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getLastCallFailCauseResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - LastCallFailCauseInfo info = {}; - info.vendorCause = hidl_string(); - if (response == NULL) { - RLOGE("getCurrentCallsResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else if (responseLen == sizeof(int)) { - int *pInt = (int *) response; - info.causeCode = (LastCallFailCause) pInt[0]; - } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) { - RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response; - info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code; - info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause); - } else { - RLOGE("getCurrentCallsResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse( - responseInfo, info); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getSignalStrengthResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getSignalStrengthResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - SignalStrength signalStrength = {}; - if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) { - RLOGE("getSignalStrengthResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - convertRilSignalStrengthToHal(response, responseLen, signalStrength); - } - - ::android::hardware::radio::V1_4::SignalStrength signalStrength_1_4; - signalStrength_1_4.gsm = signalStrength.gw; - signalStrength_1_4.cdma = signalStrength.cdma; - signalStrength_1_4.evdo = signalStrength.evdo; - signalStrength_1_4.lte = signalStrength.lte; - //TODO: future implementation needs to fill tdScdma, wcdma and nr signal strength. - - Return<void> retStatus = radioService[slotId]->mRadioResponseV1_4-> - getSignalStrengthResponse_1_4(responseInfo, signalStrength_1_4); - radioService[slotId]->checkReturnStatus(retStatus); - } else if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - SignalStrength signalStrength = {}; - if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) { - RLOGE("getSignalStrengthResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - convertRilSignalStrengthToHal(response, responseLen, signalStrength); - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse( - responseInfo, signalStrength); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) { - if (rat == NULL) { - return RIL_CELL_INFO_TYPE_NONE; - } - - int radioTech = atoi(rat); - - switch(radioTech) { - - case RADIO_TECH_GPRS: - case RADIO_TECH_EDGE: - case RADIO_TECH_GSM: { - return RIL_CELL_INFO_TYPE_GSM; - } - - case RADIO_TECH_UMTS: - case RADIO_TECH_HSDPA: - case RADIO_TECH_HSUPA: - case RADIO_TECH_HSPA: - case RADIO_TECH_HSPAP: { - return RIL_CELL_INFO_TYPE_WCDMA; - } - - case RADIO_TECH_IS95A: - case RADIO_TECH_IS95B: - case RADIO_TECH_1xRTT: - case RADIO_TECH_EVDO_0: - case RADIO_TECH_EVDO_A: - case RADIO_TECH_EVDO_B: - case RADIO_TECH_EHRPD: { - return RIL_CELL_INFO_TYPE_CDMA; - } - - case RADIO_TECH_LTE: - case RADIO_TECH_LTE_CA: { - return RIL_CELL_INFO_TYPE_LTE; - } - - case RADIO_TECH_TD_SCDMA: { - return RIL_CELL_INFO_TYPE_TD_SCDMA; - } - - default: { - break; - } - } - - return RIL_CELL_INFO_TYPE_NONE; - -} - -void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) { - - cellIdentity.cellIdentityGsm.resize(0); - cellIdentity.cellIdentityWcdma.resize(0); - cellIdentity.cellIdentityCdma.resize(0); - cellIdentity.cellIdentityTdscdma.resize(0); - cellIdentity.cellIdentityLte.resize(0); - cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType; - switch(rilCellIdentity.cellInfoType) { - - case RIL_CELL_INFO_TYPE_GSM: { - cellIdentity.cellIdentityGsm.resize(1); - cellIdentity.cellIdentityGsm[0].mcc = - std::to_string(rilCellIdentity.cellIdentityGsm.mcc); - cellIdentity.cellIdentityGsm[0].mnc = - ril::util::mnc::decode(rilCellIdentity.cellIdentityGsm.mnc); - cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac; - cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid; - cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn; - cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic; - break; - } - - case RIL_CELL_INFO_TYPE_WCDMA: { - cellIdentity.cellIdentityWcdma.resize(1); - cellIdentity.cellIdentityWcdma[0].mcc = - std::to_string(rilCellIdentity.cellIdentityWcdma.mcc); - cellIdentity.cellIdentityWcdma[0].mnc = - ril::util::mnc::decode(rilCellIdentity.cellIdentityWcdma.mnc); - cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac; - cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid; - cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc; - cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn; - break; - } - - case RIL_CELL_INFO_TYPE_CDMA: { - cellIdentity.cellIdentityCdma.resize(1); - cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId; - cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId; - cellIdentity.cellIdentityCdma[0].baseStationId = - rilCellIdentity.cellIdentityCdma.basestationId; - cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude; - cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude; - break; - } - - case RIL_CELL_INFO_TYPE_LTE: { - cellIdentity.cellIdentityLte.resize(1); - cellIdentity.cellIdentityLte[0].mcc = - std::to_string(rilCellIdentity.cellIdentityLte.mcc); - cellIdentity.cellIdentityLte[0].mnc = - ril::util::mnc::decode(rilCellIdentity.cellIdentityLte.mnc); - cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci; - cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci; - cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac; - cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn; - break; - } - - case RIL_CELL_INFO_TYPE_TD_SCDMA: { - cellIdentity.cellIdentityTdscdma.resize(1); - cellIdentity.cellIdentityTdscdma[0].mcc = - std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc); - cellIdentity.cellIdentityTdscdma[0].mnc = - ril::util::mnc::decode(rilCellIdentity.cellIdentityTdscdma.mnc); - cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac; - cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid; - cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid; - break; - } - - default: { - break; - } - } -} - -int convertResponseStringEntryToInt(char **response, int index, int numStrings) { - if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) { - return atoi(response[index]); - } - - return -1; -} - -int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) { - const int hexBase = 16; - if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) { - return strtol(response[index], NULL, hexBase); - } - - return -1; -} - -/* Fill Cell Identity info from Voice Registration State Response. - * This fucntion is applicable only for RIL Version < 15. - * Response is a "char **". - * First and Second entries are in hex string format - * and rest are integers represented in ascii format. */ -void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity, - int numStrings, char** response) { - - RIL_CellIdentity_v16 rilCellIdentity; - memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16)); - - rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]); - switch(rilCellIdentity.cellInfoType) { - - case RIL_CELL_INFO_TYPE_GSM: { - /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ - rilCellIdentity.cellIdentityGsm.lac = - convertResponseHexStringEntryToInt(response, 1, numStrings); - - /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ - rilCellIdentity.cellIdentityGsm.cid = - convertResponseHexStringEntryToInt(response, 2, numStrings); - break; - } - - case RIL_CELL_INFO_TYPE_WCDMA: { - /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ - rilCellIdentity.cellIdentityWcdma.lac = - convertResponseHexStringEntryToInt(response, 1, numStrings); - - /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ - rilCellIdentity.cellIdentityWcdma.cid = - convertResponseHexStringEntryToInt(response, 2, numStrings); - rilCellIdentity.cellIdentityWcdma.psc = - convertResponseStringEntryToInt(response, 14, numStrings); - break; - } - - case RIL_CELL_INFO_TYPE_TD_SCDMA:{ - /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ - rilCellIdentity.cellIdentityTdscdma.lac = - convertResponseHexStringEntryToInt(response, 1, numStrings); - - /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ - rilCellIdentity.cellIdentityTdscdma.cid = - convertResponseHexStringEntryToInt(response, 2, numStrings); - break; - } - - case RIL_CELL_INFO_TYPE_CDMA:{ - rilCellIdentity.cellIdentityCdma.basestationId = - convertResponseStringEntryToInt(response, 4, numStrings); - /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */ - rilCellIdentity.cellIdentityCdma.latitude = - convertResponseStringEntryToInt(response, 5, numStrings); - rilCellIdentity.cellIdentityCdma.longitude = - convertResponseStringEntryToInt(response, 6, numStrings); - rilCellIdentity.cellIdentityCdma.systemId = - convertResponseStringEntryToInt(response, 8, numStrings); - rilCellIdentity.cellIdentityCdma.networkId = - convertResponseStringEntryToInt(response, 9, numStrings); - break; - } - - case RIL_CELL_INFO_TYPE_LTE:{ - /* valid TAC are hexstrings in the range 0x0000 - 0xffff */ - rilCellIdentity.cellIdentityLte.tac = - convertResponseHexStringEntryToInt(response, 1, numStrings); - - /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ - rilCellIdentity.cellIdentityLte.ci = - convertResponseHexStringEntryToInt(response, 2, numStrings); - break; - } - - default: { - break; - } - } - - fillCellIdentityResponse(cellIdentity, rilCellIdentity); -} - -/* Fill Cell Identity info from Data Registration State Response. - * This fucntion is applicable only for RIL Version < 15. - * Response is a "char **". - * First and Second entries are in hex string format - * and rest are integers represented in ascii format. */ -void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity, - int numStrings, char** response) { - - RIL_CellIdentity_v16 rilCellIdentity; - memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16)); - - rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]); - switch(rilCellIdentity.cellInfoType) { - case RIL_CELL_INFO_TYPE_GSM: { - /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ - rilCellIdentity.cellIdentityGsm.lac = - convertResponseHexStringEntryToInt(response, 1, numStrings); - - /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ - rilCellIdentity.cellIdentityGsm.cid = - convertResponseHexStringEntryToInt(response, 2, numStrings); - break; - } - case RIL_CELL_INFO_TYPE_WCDMA: { - /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ - rilCellIdentity.cellIdentityWcdma.lac = - convertResponseHexStringEntryToInt(response, 1, numStrings); - - /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ - rilCellIdentity.cellIdentityWcdma.cid = - convertResponseHexStringEntryToInt(response, 2, numStrings); - break; - } - case RIL_CELL_INFO_TYPE_TD_SCDMA:{ - /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ - rilCellIdentity.cellIdentityTdscdma.lac = - convertResponseHexStringEntryToInt(response, 1, numStrings); - - /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ - rilCellIdentity.cellIdentityTdscdma.cid = - convertResponseHexStringEntryToInt(response, 2, numStrings); - break; - } - case RIL_CELL_INFO_TYPE_LTE: { - rilCellIdentity.cellIdentityLte.tac = - convertResponseStringEntryToInt(response, 6, numStrings); - rilCellIdentity.cellIdentityLte.pci = - convertResponseStringEntryToInt(response, 7, numStrings); - rilCellIdentity.cellIdentityLte.ci = - convertResponseStringEntryToInt(response, 8, numStrings); - break; - } - default: { - break; - } - } - - fillCellIdentityResponse(cellIdentity, rilCellIdentity); -} - -int radio_1_5::getVoiceRegistrationStateResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getVoiceRegistrationStateResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - VoiceRegStateResult voiceRegResponse = {}; - int numStrings = responseLen / sizeof(char *); - if (response == NULL) { - RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else if (s_vendorFunctions->version <= 14) { - if (numStrings != 15) { - RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - char **resp = (char **) response; - voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4); - voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]); - voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0); - voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]); - voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0); - voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0); - voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0); - fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity, - numStrings, resp); - } - } else { - RIL_VoiceRegistrationStateResponse *voiceRegState = - (RIL_VoiceRegistrationStateResponse *)response; - - if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) { - RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - voiceRegResponse.regState = (RegState) voiceRegState->regState; - voiceRegResponse.rat = voiceRegState->rat;; - voiceRegResponse.cssSupported = voiceRegState->cssSupported; - voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator; - voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl; - voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator; - voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial; - fillCellIdentityResponse(voiceRegResponse.cellIdentity, - voiceRegState->cellIdentity); - } - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse( - responseInfo, voiceRegResponse); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getDataRegistrationStateResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getDataRegistrationStateResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - DataRegStateResult dataRegResponse = {}; - if (response == NULL) { - RLOGE("getDataRegistrationStateResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else if (s_vendorFunctions->version <= 14) { - int numStrings = responseLen / sizeof(char *); - if ((numStrings != 6) && (numStrings != 11)) { - RLOGE("getDataRegistrationStateResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - char **resp = (char **) response; - dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4); - dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0); - dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]); - dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1); - fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity, - numStrings, resp); - } - } else { - RIL_DataRegistrationStateResponse *dataRegState = - (RIL_DataRegistrationStateResponse *)response; - - if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) { - RLOGE("getDataRegistrationStateResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - dataRegResponse.regState = (RegState) dataRegState->regState; - dataRegResponse.rat = dataRegState->rat;; - dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied; - dataRegResponse.maxDataCalls = dataRegState->maxDataCalls; - fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity); - } - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo, - dataRegResponse); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getOperatorResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getOperatorResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_string longName; - hidl_string shortName; - hidl_string numeric; - int numStrings = responseLen / sizeof(char *); - if (response == NULL || numStrings != 3) { - RLOGE("getOperatorResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - - } else { - char **resp = (char **) response; - longName = convertCharPtrToHidlString(resp[0]); - shortName = convertCharPtrToHidlString(resp[1]); - numeric = convertCharPtrToHidlString(resp[2]); - } - Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse( - responseInfo, longName, shortName, numeric); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setRadioPowerResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { - RLOGD("setRadioPowerResponse: serial %d", serial); - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::sendDtmfResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("sendDtmfResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType, - RIL_Errno e, void *response, size_t responseLen) { - populateResponseInfo(responseInfo, serial, responseType, e); - SendSmsResult result = {}; - - if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) { - RLOGE("Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - result.ackPDU = hidl_string(); - } else { - RIL_SMS_Response *resp = (RIL_SMS_Response *) response; - result.messageRef = resp->messageRef; - result.ackPDU = convertCharPtrToHidlString(resp->ackPDU); - result.errorCode = resp->errorCode; - } - return result; -} - -int radio_1_5::sendSmsResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("sendSmsResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response, - responseLen); - - Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo, - result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::sendSMSExpectMoreResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("sendSMSExpectMoreResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response, - responseLen); - - Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setupDataCallResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("setupDataCallResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - ::android::hardware::radio::V1_4::SetupDataCallResult result; - if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) { - if (response != NULL) { - RLOGE("setupDataCallResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } - result.cause = ::android::hardware::radio::V1_4::DataCallFailCause::ERROR_UNSPECIFIED; - result.type = ::android::hardware::radio::V1_4::PdpProtocolType::UNKNOWN; - result.ifname = hidl_string(); - result.addresses = hidl_vec<hidl_string>(); - result.dnses = hidl_vec<hidl_string>(); - result.gateways = hidl_vec<hidl_string>(); - result.pcscf = hidl_vec<hidl_string>(); - } else { - convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result); - } - - Return<void> retStatus = radioService[slotId]->mRadioResponseV1_4->setupDataCallResponse_1_4( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - SetupDataCallResult result = {}; - if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) { - if (response != NULL) { - RLOGE("setupDataCallResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } - result.status = DataCallFailCause::ERROR_UNSPECIFIED; - result.type = hidl_string(); - result.ifname = hidl_string(); - result.addresses = hidl_string(); - result.dnses = hidl_string(); - result.gateways = hidl_string(); - result.pcscf = hidl_string(); - } else { - convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result); - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType, - RIL_Errno e, void *response, size_t responseLen) { - populateResponseInfo(responseInfo, serial, responseType, e); - IccIoResult result = {}; - - if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) { - RLOGE("Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - result.simResponse = hidl_string(); - } else { - RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response; - result.sw1 = resp->sw1; - result.sw2 = resp->sw2; - result.simResponse = convertCharPtrToHidlString(resp->simResponse); - } - return result; -} - -int radio_1_5::iccIOForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("iccIOForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response, - responseLen); - - Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::sendUssdResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("sendUssdResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::cancelPendingUssdResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("cancelPendingUssdResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getClirResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getClirResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - int n = -1, m = -1; - int numInts = responseLen / sizeof(int); - if (response == NULL || numInts != 2) { - RLOGE("getClirResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *pInt = (int *) response; - n = pInt[0]; - m = pInt[1]; - } - Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo, - n, m); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setClirResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("setClirResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getCallForwardStatusResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getCallForwardStatusResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_vec<CallForwardInfo> callForwardInfos; - - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_CallForwardInfo *) != 0) { - RLOGE("getCallForwardStatusResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int num = responseLen / sizeof(RIL_CallForwardInfo *); - callForwardInfos.resize(num); - for (int i = 0 ; i < num; i++) { - RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i]; - callForwardInfos[i].status = (CallForwardInfoStatus) resp->status; - callForwardInfos[i].reason = resp->reason; - callForwardInfos[i].serviceClass = resp->serviceClass; - callForwardInfos[i].toa = resp->toa; - callForwardInfos[i].number = convertCharPtrToHidlString(resp->number); - callForwardInfos[i].timeSeconds = resp->timeSeconds; - } - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse( - responseInfo, callForwardInfos); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setCallForwardResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("setCallForwardResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getCallWaitingResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getCallWaitingResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - bool enable = false; - int serviceClass = -1; - int numInts = responseLen / sizeof(int); - if (response == NULL || numInts != 2) { - RLOGE("getCallWaitingResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *pInt = (int *) response; - enable = pInt[0] == 1 ? true : false; - serviceClass = pInt[1]; - } - Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse( - responseInfo, enable, serviceClass); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setCallWaitingResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("setCallWaitingResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::acknowledgeLastIncomingGsmSmsResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = - radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::acceptCallResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("acceptCallResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::deactivateDataCallResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("deactivateDataCallResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getFacilityLockForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getFacilityLockForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - getFacilityLockForAppResponse(responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setFacilityLockForAppResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setFacilityLockForAppResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo, - ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setBarringPasswordResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("acceptCallResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getNetworkSelectionModeResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getNetworkSelectionModeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - bool manual = false; - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("getNetworkSelectionModeResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *pInt = (int *) response; - manual = pInt[0] == 1 ? true : false; - } - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse( - responseInfo, - manual); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial, - RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::setNetworkSelectionModeManualResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse " - "== NULL", slotId); - } - - return 0; -} - -int convertOperatorStatusToInt(const char *str) { - if (strncmp("unknown", str, 9) == 0) { - return (int) OperatorStatus::UNKNOWN; - } else if (strncmp("available", str, 9) == 0) { - return (int) OperatorStatus::AVAILABLE; - } else if (strncmp("current", str, 9) == 0) { - return (int) OperatorStatus::CURRENT; - } else if (strncmp("forbidden", str, 9) == 0) { - return (int) OperatorStatus::FORBIDDEN; - } else { - return -1; - } -} - -int radio_1_5::getAvailableNetworksResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getAvailableNetworksResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_vec<OperatorInfo> networks; - if ((response == NULL && responseLen != 0) - || responseLen % (4 * sizeof(char *))!= 0) { - RLOGE("getAvailableNetworksResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - char **resp = (char **) response; - int numStrings = responseLen / sizeof(char *); - networks.resize(numStrings/4); - for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) { - networks[j].alphaLong = convertCharPtrToHidlString(resp[i]); - networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]); - networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]); - int status = convertOperatorStatusToInt(resp[i + 3]); - if (status == -1) { - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - networks[j].status = (OperatorStatus) status; - } - } - } - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo, - networks); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::startDtmfResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("startDtmfResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::stopDtmfResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("stopDtmfResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getBasebandVersionResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getBasebandVersionResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo, - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::separateConnectionResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("separateConnectionResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setMuteResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setMuteResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getMuteResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getMuteResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - bool enable = false; - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("getMuteResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *pInt = (int *) response; - enable = pInt[0] == 1 ? true : false; - } - Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo, - enable); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getClipResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getClipResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo, - (ClipStatus) ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getDataCallListResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getDataCallListResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - hidl_vec<SetupDataCallResult> ret; - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) { - RLOGE("getDataCallListResponse: invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - convertRilDataCallListToHal(response, responseLen, ret); - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse( - responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setSuppServiceNotificationsResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setSuppServiceNotificationsResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::deleteSmsOnSimResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("deleteSmsOnSimResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setBandModeResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setBandModeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::writeSmsToSimResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("writeSmsToSimResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getAvailableBandModesResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getAvailableBandModesResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_vec<RadioBandMode> modes; - if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) { - RLOGE("getAvailableBandModesResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *pInt = (int *) response; - int numInts = responseLen / sizeof(int); - modes.resize(numInts); - for (int i = 0; i < numInts; i++) { - modes[i] = (RadioBandMode) pInt[i]; - } - } - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo, - modes); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::sendEnvelopeResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("sendEnvelopeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo, - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::sendTerminalResponseToSimResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("sendTerminalResponseToSimResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::handleStkCallSetupRequestFromSimResponse(int slotId, - int responseType, int serial, - RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::explicitCallTransferResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("explicitCallTransferResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setPreferredNetworkTypeResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setPreferredNetworkTypeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - - -int radio_1_5::getPreferredNetworkTypeResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getPreferredNetworkTypeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse( - responseInfo, (PreferredNetworkType) ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setPreferredNetworkTypeBitmapResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setPreferredNetworkTypeBitmapResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_4->setPreferredNetworkTypeBitmapResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setPreferredNetworkTypeBitmapResponse: radioService[%d]->mRadioResponseV1_4 == NULL", - slotId); - } - - return 0; -} - - -int radio_1_5::getPreferredNetworkTypeBitmapResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getPreferredNetworkTypeBitmapResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_4->getPreferredNetworkTypeBitmapResponse( - responseInfo, - (const ::android::hardware::hidl_bitfield< - ::android::hardware::radio::V1_4::RadioAccessFamily>) ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getPreferredNetworkTypeBitmapResponse: radioService[%d]->mRadioResponseV1_4 == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getNeighboringCidsResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getNeighboringCidsResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_vec<NeighboringCell> cells; - - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_NeighboringCell *) != 0) { - RLOGE("getNeighboringCidsResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int num = responseLen / sizeof(RIL_NeighboringCell *); - cells.resize(num); - for (int i = 0 ; i < num; i++) { - RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i]; - cells[i].cid = convertCharPtrToHidlString(resp->cid); - cells[i].rssi = resp->rssi; - } - } - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo, - cells); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setLocationUpdatesResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setLocationUpdatesResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setCdmaSubscriptionSourceResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setCdmaRoamingPreferenceResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getCdmaRoamingPreferenceResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse( - responseInfo, (CdmaRoamingType) ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setTTYModeResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setTTYModeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getTTYModeResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getTTYModeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo, - (TtyMode) ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setPreferredVoicePrivacyResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getPreferredVoicePrivacyResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - bool enable = false; - int numInts = responseLen / sizeof(int); - if (response == NULL || numInts != 1) { - RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *pInt = (int *) response; - enable = pInt[0] == 1 ? true : false; - } - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse( - responseInfo, enable); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::sendCDMAFeatureCodeResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::sendBurstDtmfResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("sendBurstDtmfResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::sendCdmaSmsResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("sendCdmaSmsResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response, - responseLen); - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::acknowledgeLastIncomingCdmaSmsResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::getGsmBroadcastConfigResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getGsmBroadcastConfigResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_vec<GsmBroadcastSmsConfigInfo> configs; - - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) { - RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *); - configs.resize(num); - for (int i = 0 ; i < num; i++) { - RIL_GSM_BroadcastSmsConfigInfo *resp = - ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i]; - configs[i].fromServiceId = resp->fromServiceId; - configs[i].toServiceId = resp->toServiceId; - configs[i].fromCodeScheme = resp->fromCodeScheme; - configs[i].toCodeScheme = resp->toCodeScheme; - configs[i].selected = resp->selected == 1 ? true : false; - } - } - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo, - configs); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setGsmBroadcastConfigResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setGsmBroadcastConfigResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setGsmBroadcastActivationResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setGsmBroadcastActivationResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getCdmaBroadcastConfigResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_vec<CdmaBroadcastSmsConfigInfo> configs; - - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) { - RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *); - configs.resize(num); - for (int i = 0 ; i < num; i++) { - RIL_CDMA_BroadcastSmsConfigInfo *resp = - ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i]; - configs[i].serviceCategory = resp->service_category; - configs[i].language = resp->language; - configs[i].selected = resp->selected == 1 ? true : false; - } - } - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo, - configs); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setCdmaBroadcastConfigResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setCdmaBroadcastActivationResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getCDMASubscriptionResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getCDMASubscriptionResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - int numStrings = responseLen / sizeof(char *); - hidl_string emptyString; - if (response == NULL || numStrings != 5) { - RLOGE("getOperatorResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse( - responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - char **resp = (char **) response; - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse( - responseInfo, - convertCharPtrToHidlString(resp[0]), - convertCharPtrToHidlString(resp[1]), - convertCharPtrToHidlString(resp[2]), - convertCharPtrToHidlString(resp[3]), - convertCharPtrToHidlString(resp[4])); - radioService[slotId]->checkReturnStatus(retStatus); - } - } else { - RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::writeSmsToRuimResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("writeSmsToRuimResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::deleteSmsOnRuimResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("deleteSmsOnRuimResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getDeviceIdentityResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getDeviceIdentityResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - int numStrings = responseLen / sizeof(char *); - hidl_string emptyString; - if (response == NULL || numStrings != 4) { - RLOGE("getDeviceIdentityResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo, - emptyString, emptyString, emptyString, emptyString); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - char **resp = (char **) response; - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo, - convertCharPtrToHidlString(resp[0]), - convertCharPtrToHidlString(resp[1]), - convertCharPtrToHidlString(resp[2]), - convertCharPtrToHidlString(resp[3])); - radioService[slotId]->checkReturnStatus(retStatus); - } - } else { - RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::exitEmergencyCallbackModeResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getSmscAddressResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getSmscAddressResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo, - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setSmscAddressResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setSmscAddressResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::reportSmsMemoryStatusResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("reportSmsMemoryStatusResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::reportStkServiceIsRunningResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("reportStkServiceIsRunningResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse-> - reportStkServiceIsRunningResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getCdmaSubscriptionSourceResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse( - responseInfo, (CdmaSubscriptionSource) ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::requestIsimAuthenticationResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("requestIsimAuthenticationResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse( - responseInfo, - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::acknowledgeIncomingGsmSmsWithPduResponse(int slotId, - int responseType, - int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::sendEnvelopeWithStatusResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, - response, responseLen); - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo, - result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getVoiceRadioTechnologyResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse( - responseInfo, (RadioTechnology) ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getCellInfoListResponse(int slotId, - int responseType, - int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("getCellInfoListResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - hidl_vec<CellInfo> ret; - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_CellInfo_v12) != 0) { - RLOGE("getCellInfoListResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - convertRilCellInfoListToHal(response, responseLen, ret); - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse( - responseInfo, ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setCellInfoListRateResponse(int slotId, - int responseType, - int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("setCellInfoListRateResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setInitialAttachApnResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setInitialAttachApnResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getImsRegistrationStateResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getImsRegistrationStateResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - bool isRegistered = false; - int ratFamily = 0; - int numInts = responseLen / sizeof(int); - if (response == NULL || numInts != 2) { - RLOGE("getImsRegistrationStateResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - int *pInt = (int *) response; - isRegistered = pInt[0] == 1 ? true : false; - ratFamily = pInt[1]; - } - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse( - responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::sendImsSmsResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("sendImsSmsResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response, - responseLen); - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::iccTransmitApduBasicChannelResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response, - responseLen); - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::iccOpenLogicalChannelResponse(int slotId, - int responseType, int serial, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("iccOpenLogicalChannelResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - int channelId = -1; - hidl_vec<int8_t> selectResponse; - int numInts = responseLen / sizeof(int); - if (response == NULL || responseLen % sizeof(int) != 0) { - RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL"); - if (response != NULL) { - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } - } else { - int *pInt = (int *) response; - channelId = pInt[0]; - selectResponse.resize(numInts - 1); - for (int i = 1; i < numInts; i++) { - selectResponse[i - 1] = (int8_t) pInt[i]; - } - } - Return<void> retStatus - = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo, - channelId, selectResponse); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::iccCloseLogicalChannelResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("iccCloseLogicalChannelResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::iccTransmitApduLogicalChannelResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response, - responseLen); - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::nvReadItemResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("nvReadItemResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse( - responseInfo, - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::nvWriteItemResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("nvWriteItemResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::nvWriteCdmaPrlResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("nvWriteCdmaPrlResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::nvResetConfigResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("nvResetConfigResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setUiccSubscriptionResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setUiccSubscriptionResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setDataAllowedResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setDataAllowedResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getHardwareConfigResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getHardwareConfigResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - hidl_vec<HardwareConfig> result; - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_HardwareConfig) != 0) { - RLOGE("hardwareConfigChangedInd: invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - convertRilHardwareConfigListToHal(response, responseLen, result); - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::requestIccSimAuthenticationResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("requestIccSimAuthenticationResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response, - responseLen); - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse " - "== NULL", slotId); - } - - return 0; -} - -int radio_1_5::setDataProfileResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setDataProfileResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::requestShutdownResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("requestShutdownResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -void responseRadioCapability(RadioResponseInfo& responseInfo, int serial, - int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) { - populateResponseInfo(responseInfo, serial, responseType, e); - - if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) { - RLOGE("responseRadioCapability: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - rc.logicalModemUuid = hidl_string(); - } else { - convertRilRadioCapabilityToHal(response, responseLen, rc); - } -} - -int radio_1_5::getRadioCapabilityResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getRadioCapabilityResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - RadioCapability result = {}; - responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen, - result); - Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setRadioCapabilityResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setRadioCapabilityResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - RadioCapability result = {}; - responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen, - result); - Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType, - RIL_Errno e, void *response, size_t responseLen) { - populateResponseInfo(responseInfo, serial, responseType, e); - LceStatusInfo result = {}; - - if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) { - RLOGE("Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response; - result.lceStatus = (LceStatus) resp->lce_status; - result.actualIntervalMs = (uint8_t) resp->actual_interval_ms; - } - return result; -} - -int radio_1_5::startLceServiceResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("startLceServiceResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e, - response, responseLen); - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo, - result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::stopLceServiceResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("stopLceServiceResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e, - response, responseLen); - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo, - result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::pullLceDataResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("pullLceDataResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - LceDataInfo result = {}; - if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) { - RLOGE("pullLceDataResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - convertRilLceDataInfoToHal(response, responseLen, result); - } - - Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse( - responseInfo, result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::getModemActivityInfoResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getModemActivityInfoResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - ActivityStatsInfo info; - if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) { - RLOGE("getModemActivityInfoResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response; - info.sleepModeTimeMs = resp->sleep_mode_time_ms; - info.idleModeTimeMs = resp->idle_mode_time_ms; - for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) { - info.txmModetimeMs[i] = resp->tx_mode_time_ms[i]; - } - info.rxModeTimeMs = resp->rx_mode_time_ms; - } - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo, - info); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setAllowedCarriersResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setAllowedCarriersResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo, - ret); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setAllowedCarriersResponse4(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setAllowedCarriersResponse4: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_4->setAllowedCarriersResponse_1_4(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setAllowedCarriersResponse4: radioService[%d]->mRadioResponseV1_4 == NULL", slotId); - } - - return 0; -} - -void prepareCarrierRestrictionsResponse(hidl_vec<Carrier>& allowedCarriers, - hidl_vec<Carrier>& excludedCarriers, - bool& allAllowed, - const RIL_CarrierRestrictions* pCr) { - if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) { - allAllowed = false; - } - allowedCarriers.resize(pCr->len_allowed_carriers); - for(int i = 0; i < pCr->len_allowed_carriers; i++) { - RIL_Carrier *carrier = pCr->allowed_carriers + i; - allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc); - allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc); - allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type; - allowedCarriers[i].matchData = - convertCharPtrToHidlString(carrier->match_data); - } - - excludedCarriers.resize(pCr->len_excluded_carriers); - for(int i = 0; i < pCr->len_excluded_carriers; i++) { - RIL_Carrier *carrier = pCr->excluded_carriers + i; - excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc); - excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc); - excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type; - excludedCarriers[i].matchData = - convertCharPtrToHidlString(carrier->match_data); - } -} - -int radio_1_5::getAllowedCarriersResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getAllowedCarriersResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - CarrierRestrictions carrierInfo = {}; - bool allAllowed = true; - if (response == NULL) { -#if VDBG - RLOGD("getAllowedCarriersResponse response is NULL: all allowed"); -#endif - carrierInfo.allowedCarriers.resize(0); - carrierInfo.excludedCarriers.resize(0); - } else if (responseLen != sizeof(RIL_CarrierRestrictions)) { - RLOGE("getAllowedCarriersResponse Invalid response"); - if (e == RIL_E_SUCCESS) { - responseInfo.error = RadioError::INVALID_RESPONSE; - } - } else { - RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response; - prepareCarrierRestrictionsResponse(carrierInfo.allowedCarriers, carrierInfo.excludedCarriers, allAllowed, pCr); - } - - Return<void> retStatus - = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo, - allAllowed, carrierInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::getAllowedCarriersResponse4(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("getAllowedCarriersResponse4: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - ::android::hardware::radio::V1_4::CarrierRestrictionsWithPriority carrierInfo = {}; - ::android::hardware::radio::V1_4::SimLockMultiSimPolicy multiSimPolicy = - ::android::hardware::radio::V1_4::SimLockMultiSimPolicy::NO_MULTISIM_POLICY; - bool allAllowed = true; - - if (response == NULL) { -#if VDBG - RLOGD("getAllowedCarriersResponse4 response is NULL: all allowed"); -#endif - carrierInfo.allowedCarriers.resize(0); - carrierInfo.excludedCarriers.resize(0); - carrierInfo.allowedCarriersPrioritized = false; - } else if (responseLen != sizeof(RIL_CarrierRestrictionsWithPriority)) { - RLOGE("getAllowedCarriersResponse4 Invalid response"); - if (e == RIL_E_SUCCESS) { - responseInfo.error = RadioError::INVALID_RESPONSE; - } - } else { - RIL_CarrierRestrictionsWithPriority *pCrExt = (RIL_CarrierRestrictionsWithPriority *)response; - - // Convert into the structure used in IRadio 1.0 to re-use existing code - RIL_CarrierRestrictions cr = {}; - cr.len_allowed_carriers = pCrExt->len_allowed_carriers; - cr.len_excluded_carriers = pCrExt->len_excluded_carriers; - cr.allowed_carriers = pCrExt->allowed_carriers; - cr.excluded_carriers = pCrExt->excluded_carriers; - prepareCarrierRestrictionsResponse(carrierInfo.allowedCarriers, carrierInfo.excludedCarriers, allAllowed, &cr); - - carrierInfo.allowedCarriersPrioritized = (bool)pCrExt->allowedCarriersPrioritized; - multiSimPolicy = (::android::hardware::radio::V1_4::SimLockMultiSimPolicy)pCrExt->multiSimPolicy; - } - - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_4->getAllowedCarriersResponse_1_4(responseInfo, - carrierInfo, multiSimPolicy); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("getAllowedCarriersResponse4: radioService[%d]->mRadioResponseV1_4 == NULL", slotId); - } - - return 0; -} - -int radio_1_5::sendDeviceStateResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responselen) { -#if VDBG - RLOGD("sendDeviceStateResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId); - } - - return 0; -} - -int radio_1_5::setCarrierInfoForImsiEncryptionResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { - RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial); - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus = radioService[slotId]->mRadioResponseV1_4-> - setCarrierInfoForImsiEncryptionResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_4 == " - "NULL", slotId); - } - return 0; -} - -int radio_1_5::setIndicationFilterResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responselen) { -#if VDBG - RLOGD("setIndicationFilterResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::setSimCardPowerResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("setSimCardPowerResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponse != NULL - || radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - Return<void> retStatus = radioService[slotId]->mRadioResponseV1_4-> - setSimCardPowerResponse_1_1(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_4 == NULL", - slotId); - Return<void> retStatus - = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } - } else { - RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && " - "radioService[%d]->mRadioResponseV1_4 == NULL", slotId, slotId); - } - return 0; -} - -int radio_1_5::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("startNetworkScanResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_4->startNetworkScanResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_4 == NULL", slotId); - } - - return 0; -} - -int radio_1_5::startNetworkScanResponse4(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("startNetworkScanResponse4: serial %d", serial); -#endif - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_4->startNetworkScanResponse_1_4(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_4 == NULL", slotId); - } - - return 0; -} - -int radio_1_5::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("stopNetworkScanResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_4->stopNetworkScanResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_4 == NULL", slotId); - } - - return 0; -} - -int radio_1_5::emergencyDialResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("emergencyDialResponse: serial %d", serial); -#endif - - if (radioService[slotId]->mRadioResponseV1_4 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_4->emergencyDialResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("emergencyDialResponse: radioService[%d]->mRadioResponseV1_4 == NULL", slotId); - } - return 0; -} - -void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus, - V1_1::KeepaliveStatus& halStatus) { - halStatus.sessionHandle = rilStatus->sessionHandle; - halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code); -} - -int radio_1_5::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_4 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_4 == NULL", __FUNCTION__, slotId); - return 0; - } - - V1_1::KeepaliveStatus ks = {}; - if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) { - RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e)); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks); - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_4->startKeepaliveResponse(responseInfo, ks); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_4 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_4 == NULL", __FUNCTION__, slotId); - return 0; - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_4->stopKeepaliveResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::getModemStackStatusResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_3 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_3 == NULL", __FUNCTION__, slotId); - return 0; - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_3->getModemStackStatusResponse( - responseInfo, true); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::enableModemResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_3 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_3 == NULL", __FUNCTION__, slotId); - return 0; - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_3->enableModemResponse(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::sendRequestRawResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("sendRequestRawResponse: serial %d", serial); -#endif - - if (!kOemHookEnabled) return 0; - - if (oemHookService[slotId]->mOemHookResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_vec<uint8_t> data; - - if (response == NULL) { - RLOGE("sendRequestRawResponse: Invalid response"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - data.setToExternal((uint8_t *) response, responseLen); - } - Return<void> retStatus = oemHookService[slotId]->mOemHookResponse-> - sendRequestRawResponse(responseInfo, data); - checkReturnStatus(slotId, retStatus, false); - } else { - RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::sendRequestStringsResponse(int slotId, - int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("sendRequestStringsResponse: serial %d", serial); -#endif - - if (!kOemHookEnabled) return 0; - - if (oemHookService[slotId]->mOemHookResponse != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - hidl_vec<hidl_string> data; - - if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) { - RLOGE("sendRequestStringsResponse Invalid response: NULL"); - if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; - } else { - char **resp = (char **) response; - int numStrings = responseLen / sizeof(char *); - data.resize(numStrings); - for (int i = 0; i < numStrings; i++) { - data[i] = convertCharPtrToHidlString(resp[i]); - } - } - Return<void> retStatus - = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse( - responseInfo, data); - checkReturnStatus(slotId, retStatus, false); - } else { - RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == " - "NULL", slotId); - } - - return 0; -} - -int radio_1_5::setSystemSelectionChannelsResponse(int slotId, int responseType, int serial, - RIL_Errno e, void* /* response */, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_3 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_3 == NULL", __FUNCTION__, slotId); - return 0; - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_3->setSystemSelectionChannelsResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::setSignalStrengthReportingCriteriaResponse_1_5(int slotId, int responseType, - int serial, RIL_Errno e, void* /* response */, - size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - if (radioService[slotId]->mRadioResponseV1_5 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_5 == NULL", __FUNCTION__, slotId); - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_5->setSignalStrengthReportingCriteriaResponse_1_5( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } - return 0; -} - -int radio_1_5::enableUiccApplicationsResponse(int slotId, int responseType, int serial, - RIL_Errno e, void* /* response */, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_5 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_5 == NULL", __FUNCTION__, slotId); - return 0; - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_5->enableUiccApplicationsResponse( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::areUiccApplicationsEnabledResponse(int slotId, int responseType, int serial, - RIL_Errno e, void* response, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_5 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_5 == NULL", __FUNCTION__, slotId); - return 0; - } - - bool enable = false; - if (response == NULL || responseLen != sizeof(bool)) { - RLOGE("isSimDetachedFromNetwork Invalid response."); - } else { - enable = (*((bool *) response)); - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_5->areUiccApplicationsEnabledResponse( - responseInfo, enable); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::canToggleUiccApplicationsEnablementResponse(int slotId, int responseType, - int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_5 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_5 == NULL", __FUNCTION__, slotId); - return 0; - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_5->canToggleUiccApplicationsEnablementResponse( - responseInfo, true); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::setSystemSelectionChannelsResponse_1_5(int slotId, int responseType, int serial, - RIL_Errno e, void* /* response */, size_t responseLen) { -#if VDBG - RLOGD("%s(): %d", __FUNCTION__, serial); -#endif - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - - // If we don't have a radio service, there's nothing we can do - if (radioService[slotId]->mRadioResponseV1_5 == NULL) { - RLOGE("%s: radioService[%d]->mRadioResponseV1_5 == NULL", __FUNCTION__, slotId); - return 0; - } - - Return<void> retStatus = - radioService[slotId]->mRadioResponseV1_5->setSystemSelectionChannelsResponse_1_5( - responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::startNetworkScanResponse_1_5(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("startNetworkScanResponse_1_5: serial %d", serial); -#endif - if (radioService[slotId]->mRadioResponseV1_5 != NULL) { - RadioResponseInfo responseInfo = {}; - populateResponseInfo(responseInfo, serial, responseType, e); - Return<void> retStatus - = radioService[slotId]->mRadioResponseV1_5->startNetworkScanResponse_1_5(responseInfo); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_5 == NULL", slotId); - } - return 0; -} - -/*************************************************************************************************** - * INDICATION FUNCTIONS - * The below function handle unsolicited messages coming from the Radio - * (messages for which there is no pending request) - **************************************************************************************************/ - -RadioIndicationType convertIntToRadioIndicationType(int indicationType) { - return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) : - (RadioIndicationType::UNSOLICITED_ACK_EXP); -} - -int radio_1_5::radioStateChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - RadioState radioState = - (RadioState) CALL_ONSTATEREQUEST(slotId); - RLOGD("radioStateChangedInd: radioState %d", radioState); - Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged( - convertIntToRadioIndicationType(indicationType), radioState); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::callStateChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("callStateChangedInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::networkStateChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("networkStateChangedInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -uint8_t hexCharToInt(uint8_t c) { - if (c >= '0' && c <= '9') return (c - '0'); - if (c >= 'A' && c <= 'F') return (c - 'A' + 10); - if (c >= 'a' && c <= 'f') return (c - 'a' + 10); - - return INVALID_HEX_CHAR; -} - -uint8_t * convertHexStringToBytes(void *response, size_t responseLen) { - if (responseLen % 2 != 0) { - return NULL; - } - - uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t)); - if (bytes == NULL) { - RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string"); - return NULL; - } - uint8_t *hexString = (uint8_t *)response; - - for (size_t i = 0; i < responseLen; i += 2) { - uint8_t hexChar1 = hexCharToInt(hexString[i]); - uint8_t hexChar2 = hexCharToInt(hexString[i + 1]); - - if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) { - RLOGE("convertHexStringToBytes: invalid hex char %d %d", - hexString[i], hexString[i + 1]); - free(bytes); - return NULL; - } - bytes[i/2] = ((hexChar1 << 4) | hexChar2); - } - - return bytes; -} - -int radio_1_5::newSmsInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("newSmsInd: invalid response"); - return 0; - } - - uint8_t *bytes = convertHexStringToBytes(response, responseLen); - if (bytes == NULL) { - RLOGE("newSmsInd: convertHexStringToBytes failed"); - return 0; - } - - hidl_vec<uint8_t> pdu; - pdu.setToExternal(bytes, responseLen/2); -#if VDBG - RLOGD("newSmsInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms( - convertIntToRadioIndicationType(indicationType), pdu); - radioService[slotId]->checkReturnStatus(retStatus); - free(bytes); - } else { - RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::newSmsStatusReportInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("newSmsStatusReportInd: invalid response"); - return 0; - } - - uint8_t *bytes = convertHexStringToBytes(response, responseLen); - if (bytes == NULL) { - RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed"); - return 0; - } - - hidl_vec<uint8_t> pdu; - pdu.setToExternal(bytes, responseLen/2); -#if VDBG - RLOGD("newSmsStatusReportInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport( - convertIntToRadioIndicationType(indicationType), pdu); - radioService[slotId]->checkReturnStatus(retStatus); - free(bytes); - } else { - RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::newSmsOnSimInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("newSmsOnSimInd: invalid response"); - return 0; - } - int32_t recordNumber = ((int32_t *) response)[0]; -#if VDBG - RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim( - convertIntToRadioIndicationType(indicationType), recordNumber); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::onUssdInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != 2 * sizeof(char *)) { - RLOGE("onUssdInd: invalid response"); - return 0; - } - char **strings = (char **) response; - char *mode = strings[0]; - hidl_string msg = convertCharPtrToHidlString(strings[1]); - UssdModeType modeType = (UssdModeType) atoi(mode); -#if VDBG - RLOGD("onUssdInd: mode %s", mode); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd( - convertIntToRadioIndicationType(indicationType), modeType, msg); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::nitzTimeReceivedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("nitzTimeReceivedInd: invalid response"); - return 0; - } - hidl_string nitzTime = convertCharPtrToHidlString((char *) response); -#if VDBG - RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(), - nitzTimeReceived[slotId]); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived( - convertIntToRadioIndicationType(indicationType), nitzTime, - nitzTimeReceived[slotId]); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId); - return -1; - } - - return 0; -} - -void convertRilSignalStrengthToHal(void *response, size_t responseLen, - SignalStrength& signalStrength) { - RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response; - - // Fixup LTE for backwards compatibility - // signalStrength: -1 -> 99 - if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) { - rilSignalStrength->LTE_SignalStrength.signalStrength = 99; - } - // rsrp: -1 -> INT_MAX all other negative value to positive. - // So remap here - if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) { - rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX; - } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) { - rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp; - } - // rsrq: -1 -> INT_MAX - if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) { - rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX; - } - // Not remapping rssnr is already using INT_MAX - // cqi: -1 -> INT_MAX - if (rilSignalStrength->LTE_SignalStrength.cqi == -1) { - rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX; - } - - signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength; - signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate; - // RIL_SignalStrength_v10 not support gw.timingAdvance. Set to INT_MAX as - // invalid value. - signalStrength.gw.timingAdvance = INT_MAX; - - signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm; - signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio; - signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm; - signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio; - signalStrength.evdo.signalNoiseRatio = - rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio; - signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength; - signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp; - signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq; - signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr; - signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi; - signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance; - signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp; -} - -int radio_1_5::currentSignalStrengthInd(int slotId, - int indicationType, int token, RIL_Errno e, - void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) { - RLOGE("currentSignalStrengthInd: invalid response"); - return 0; - } - - SignalStrength signalStrength = {}; - convertRilSignalStrengthToHal(response, responseLen, signalStrength); - -#if VDBG - RLOGD("currentSignalStrengthInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength( - convertIntToRadioIndicationType(indicationType), signalStrength); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, - SetupDataCallResult& dcResult) { - dcResult.status = (DataCallFailCause) dcResponse->status; - dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime; - dcResult.cid = dcResponse->cid; - dcResult.active = dcResponse->active; - dcResult.type = convertCharPtrToHidlString(dcResponse->type); - dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname); - dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses); - dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses); - dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways); - dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf); - dcResult.mtu = dcResponse->mtu; -} - -hidl_vec<hidl_string> split(hidl_string str) { - std::vector<hidl_string> ret; - std::stringstream ss(static_cast<std::string>(str)); - - std::string tok; - - while(getline(ss, tok, ' ')) { - ret.push_back(hidl_string(tok)); - } - - return ret; -} - -::android::hardware::radio::V1_4::PdpProtocolType convertToPdpProtocolType(hidl_string str) { - if (strncmp("IP", str.c_str(), 2) == 0) { - return ::android::hardware::radio::V1_4::PdpProtocolType::IP; - } else if (strncmp("IPV6", str.c_str(), 4) == 0) { - return ::android::hardware::radio::V1_4::PdpProtocolType::IPV6; - } else if (strncmp("IPV4V6", str.c_str(), 6) == 0) { - return ::android::hardware::radio::V1_4::PdpProtocolType::IPV4V6; - } else if (strncmp("PPP", str.c_str(), 3) == 0) { - return ::android::hardware::radio::V1_4::PdpProtocolType::PPP; - } else if (strncmp("NON_IP", str.c_str(), 6) == 0) { - return ::android::hardware::radio::V1_4::PdpProtocolType::NON_IP; - } else if (strncmp("UNSTRUCTURED", str.c_str(), 12) == 0) { - return ::android::hardware::radio::V1_4::PdpProtocolType::UNSTRUCTURED; - } else { - return ::android::hardware::radio::V1_4::PdpProtocolType::UNKNOWN; - } -} - -void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, - ::android::hardware::radio::V1_4::SetupDataCallResult& dcResult) { - dcResult.cause = (::android::hardware::radio::V1_4::DataCallFailCause) dcResponse->status; - dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime; - dcResult.cid = dcResponse->cid; - dcResult.active = (::android::hardware::radio::V1_4::DataConnActiveStatus)dcResponse->active; - dcResult.type = convertToPdpProtocolType(convertCharPtrToHidlString(dcResponse->type)); - dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname); - dcResult.addresses = split(convertCharPtrToHidlString(dcResponse->addresses)); - dcResult.dnses = split(convertCharPtrToHidlString(dcResponse->dnses)); - dcResult.gateways = split(convertCharPtrToHidlString(dcResponse->gateways)); - dcResult.pcscf = split(convertCharPtrToHidlString(dcResponse->pcscf)); - dcResult.mtu = dcResponse->mtu; -} - - -void convertRilDataCallListToHal(void *response, size_t responseLen, - hidl_vec<SetupDataCallResult>& dcResultList) { - int num = responseLen / sizeof(RIL_Data_Call_Response_v11); - - RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response; - dcResultList.resize(num); - for (int i = 0; i < num; i++) { - convertRilDataCallToHal(&dcResponse[i], dcResultList[i]); - } -} - -int radio_1_5::dataCallListChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) { - RLOGE("dataCallListChangedInd: invalid response"); - return 0; - } - hidl_vec<SetupDataCallResult> dcList; - convertRilDataCallListToHal(response, responseLen, dcList); -#if VDBG - RLOGD("dataCallListChangedInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged( - convertIntToRadioIndicationType(indicationType), dcList); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::suppSvcNotifyInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) { - RLOGE("suppSvcNotifyInd: invalid response"); - return 0; - } - - SuppSvcNotification suppSvc = {}; - RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response; - suppSvc.isMT = ssn->notificationType; - suppSvc.code = ssn->code; - suppSvc.index = ssn->index; - suppSvc.type = ssn->type; - suppSvc.number = convertCharPtrToHidlString(ssn->number); - -#if VDBG - RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d", - suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify( - convertIntToRadioIndicationType(indicationType), suppSvc); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::stkSessionEndInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("stkSessionEndInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::stkProactiveCommandInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("stkProactiveCommandInd: invalid response"); - return 0; - } -#if VDBG - RLOGD("stkProactiveCommandInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand( - convertIntToRadioIndicationType(indicationType), - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::stkEventNotifyInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("stkEventNotifyInd: invalid response"); - return 0; - } -#if VDBG - RLOGD("stkEventNotifyInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify( - convertIntToRadioIndicationType(indicationType), - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::stkCallSetupInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("stkCallSetupInd: invalid response"); - return 0; - } - int32_t timeout = ((int32_t *) response)[0]; -#if VDBG - RLOGD("stkCallSetupInd: timeout %d", timeout); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup( - convertIntToRadioIndicationType(indicationType), timeout); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::simSmsStorageFullInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("simSmsStorageFullInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::simRefreshInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) { - RLOGE("simRefreshInd: invalid response"); - return 0; - } - - SimRefreshResult refreshResult = {}; - RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response); - refreshResult.type = - (V1_0::SimRefreshType) simRefreshResponse->result; - refreshResult.efId = simRefreshResponse->ef_id; - refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid); - -#if VDBG - RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh( - convertIntToRadioIndicationType(indicationType), refreshResult); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord, - CdmaSignalInfoRecord& record) { - record.isPresent = signalInfoRecord->isPresent; - record.signalType = signalInfoRecord->signalType; - record.alertPitch = signalInfoRecord->alertPitch; - record.signal = signalInfoRecord->signal; -} - -int radio_1_5::callRingInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - bool isGsm; - CdmaSignalInfoRecord record = {}; - if (response == NULL || responseLen == 0) { - isGsm = true; - } else { - isGsm = false; - if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) { - RLOGE("callRingInd: invalid response"); - return 0; - } - convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record); - } - -#if VDBG - RLOGD("callRingInd: isGsm %d", isGsm); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing( - convertIntToRadioIndicationType(indicationType), isGsm, record); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::simStatusChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("simStatusChangedInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::cdmaNewSmsInd(int slotId, int indicationType, - int token, RIL_Errno e, void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) { - RLOGE("cdmaNewSmsInd: invalid response"); - return 0; - } - - CdmaSmsMessage msg = {}; - RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response; - msg.teleserviceId = rilMsg->uTeleserviceID; - msg.isServicePresent = rilMsg->bIsServicePresent; - msg.serviceCategory = rilMsg->uServicecategory; - msg.address.digitMode = - (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode; - msg.address.numberMode = - (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode; - msg.address.numberType = - (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type; - msg.address.numberPlan = - (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan; - - int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); - msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit); - - msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType) - rilMsg->sSubAddress.subaddressType; - msg.subAddress.odd = rilMsg->sSubAddress.odd; - - digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); - msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit); - - digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); - msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit); - -#if VDBG - RLOGD("cdmaNewSmsInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms( - convertIntToRadioIndicationType(indicationType), msg); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::newBroadcastSmsInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("newBroadcastSmsInd: invalid response"); - return 0; - } - - hidl_vec<uint8_t> data; - data.setToExternal((uint8_t *) response, responseLen); -#if VDBG - RLOGD("newBroadcastSmsInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms( - convertIntToRadioIndicationType(indicationType), data); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::cdmaRuimSmsStorageFullInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("cdmaRuimSmsStorageFullInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::restrictedStateChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("restrictedStateChangedInd: invalid response"); - return 0; - } - int32_t state = ((int32_t *) response)[0]; -#if VDBG - RLOGD("restrictedStateChangedInd: state %d", state); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged( - convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::enterEmergencyCallbackModeInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("enterEmergencyCallbackModeInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::cdmaCallWaitingInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) { - RLOGE("cdmaCallWaitingInd: invalid response"); - return 0; - } - - CdmaCallWaiting callWaitingRecord = {}; - RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response); - callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number); - callWaitingRecord.numberPresentation = - (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation; - callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name); - convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord, - callWaitingRecord.signalInfoRecord); - callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type; - callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan; - -#if VDBG - RLOGD("cdmaCallWaitingInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting( - convertIntToRadioIndicationType(indicationType), callWaitingRecord); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::cdmaOtaProvisionStatusInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("cdmaOtaProvisionStatusInd: invalid response"); - return 0; - } - int32_t status = ((int32_t *) response)[0]; -#if VDBG - RLOGD("cdmaOtaProvisionStatusInd: status %d", status); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus( - convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::cdmaInfoRecInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) { - RLOGE("cdmaInfoRecInd: invalid response"); - return 0; - } - - CdmaInformationRecords records = {}; - RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response; - - char* string8 = NULL; - int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS); - if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) { - RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping " - "additional ones", recordsRil->numberOfInfoRecs, - RIL_CDMA_MAX_NUMBER_OF_INFO_RECS); - } - records.infoRec.resize(num); - for (int i = 0 ; i < num ; i++) { - CdmaInformationRecord *record = &records.infoRec[i]; - RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i]; - record->name = (CdmaInfoRecName) infoRec->name; - // All vectors should be size 0 except one which will be size 1. Set everything to - // size 0 initially. - record->display.resize(0); - record->number.resize(0); - record->signal.resize(0); - record->redir.resize(0); - record->lineCtrl.resize(0); - record->clir.resize(0); - record->audioCtrl.resize(0); - switch (infoRec->name) { - case RIL_CDMA_DISPLAY_INFO_REC: - case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: { - if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) { - RLOGE("cdmaInfoRecInd: invalid display info response length %d " - "expected not more than %d", (int) infoRec->rec.display.alpha_len, - CDMA_ALPHA_INFO_BUFFER_LENGTH); - return 0; - } - string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char)); - if (string8 == NULL) { - RLOGE("cdmaInfoRecInd: Memory allocation failed for " - "responseCdmaInformationRecords"); - return 0; - } - memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len); - string8[(int)infoRec->rec.display.alpha_len] = '\0'; - - record->display.resize(1); - record->display[0].alphaBuf = string8; - free(string8); - string8 = NULL; - break; - } - - case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC: - case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC: - case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: { - if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) { - RLOGE("cdmaInfoRecInd: invalid display info response length %d " - "expected not more than %d", (int) infoRec->rec.number.len, - CDMA_NUMBER_INFO_BUFFER_LENGTH); - return 0; - } - string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char)); - if (string8 == NULL) { - RLOGE("cdmaInfoRecInd: Memory allocation failed for " - "responseCdmaInformationRecords"); - return 0; - } - memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len); - string8[(int)infoRec->rec.number.len] = '\0'; - - record->number.resize(1); - record->number[0].number = string8; - free(string8); - string8 = NULL; - record->number[0].numberType = infoRec->rec.number.number_type; - record->number[0].numberPlan = infoRec->rec.number.number_plan; - record->number[0].pi = infoRec->rec.number.pi; - record->number[0].si = infoRec->rec.number.si; - break; - } - - case RIL_CDMA_SIGNAL_INFO_REC: { - record->signal.resize(1); - record->signal[0].isPresent = infoRec->rec.signal.isPresent; - record->signal[0].signalType = infoRec->rec.signal.signalType; - record->signal[0].alertPitch = infoRec->rec.signal.alertPitch; - record->signal[0].signal = infoRec->rec.signal.signal; - break; - } - - case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: { - if (infoRec->rec.redir.redirectingNumber.len > - CDMA_NUMBER_INFO_BUFFER_LENGTH) { - RLOGE("cdmaInfoRecInd: invalid display info response length %d " - "expected not more than %d\n", - (int)infoRec->rec.redir.redirectingNumber.len, - CDMA_NUMBER_INFO_BUFFER_LENGTH); - return 0; - } - string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) * - sizeof(char)); - if (string8 == NULL) { - RLOGE("cdmaInfoRecInd: Memory allocation failed for " - "responseCdmaInformationRecords"); - return 0; - } - memcpy(string8, infoRec->rec.redir.redirectingNumber.buf, - infoRec->rec.redir.redirectingNumber.len); - string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0'; - - record->redir.resize(1); - record->redir[0].redirectingNumber.number = string8; - free(string8); - string8 = NULL; - record->redir[0].redirectingNumber.numberType = - infoRec->rec.redir.redirectingNumber.number_type; - record->redir[0].redirectingNumber.numberPlan = - infoRec->rec.redir.redirectingNumber.number_plan; - record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi; - record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si; - record->redir[0].redirectingReason = - (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason; - break; - } - - case RIL_CDMA_LINE_CONTROL_INFO_REC: { - record->lineCtrl.resize(1); - record->lineCtrl[0].lineCtrlPolarityIncluded = - infoRec->rec.lineCtrl.lineCtrlPolarityIncluded; - record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle; - record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse; - record->lineCtrl[0].lineCtrlPowerDenial = - infoRec->rec.lineCtrl.lineCtrlPowerDenial; - break; - } - - case RIL_CDMA_T53_CLIR_INFO_REC: { - record->clir.resize(1); - record->clir[0].cause = infoRec->rec.clir.cause; - break; - } - - case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: { - record->audioCtrl.resize(1); - record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink; - record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink; - break; - } - - case RIL_CDMA_T53_RELEASE_INFO_REC: - RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID"); - return 0; - - default: - RLOGE("cdmaInfoRecInd: Incorrect name value"); - return 0; - } - } - -#if VDBG - RLOGD("cdmaInfoRecInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec( - convertIntToRadioIndicationType(indicationType), records); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::indicateRingbackToneInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("indicateRingbackToneInd: invalid response"); - return 0; - } - bool start = ((int32_t *) response)[0]; -#if VDBG - RLOGD("indicateRingbackToneInd: start %d", start); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone( - convertIntToRadioIndicationType(indicationType), start); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::resendIncallMuteInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("resendIncallMuteInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::cdmaSubscriptionSourceChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, - void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("cdmaSubscriptionSourceChangedInd: invalid response"); - return 0; - } - int32_t cdmaSource = ((int32_t *) response)[0]; -#if VDBG - RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication-> - cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType), - (CdmaSubscriptionSource) cdmaSource); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::cdmaPrlChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("cdmaPrlChangedInd: invalid response"); - return 0; - } - int32_t version = ((int32_t *) response)[0]; -#if VDBG - RLOGD("cdmaPrlChangedInd: version %d", version); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged( - convertIntToRadioIndicationType(indicationType), version); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::exitEmergencyCallbackModeInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("exitEmergencyCallbackModeInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::rilConnectedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - RLOGD("rilConnectedInd"); - Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::voiceRadioTechChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("voiceRadioTechChangedInd: invalid response"); - return 0; - } - int32_t rat = ((int32_t *) response)[0]; -#if VDBG - RLOGD("voiceRadioTechChangedInd: rat %d", rat); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged( - convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) { - int num = responseLen / sizeof(RIL_CellInfo_v12); - records.resize(num); - - RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response; - for (int i = 0; i < num; i++) { - records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType; - records[i].registered = rillCellInfo->registered; - records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType; - records[i].timeStamp = rillCellInfo->timeStamp; - // All vectors should be size 0 except one which will be size 1. Set everything to - // size 0 initially. - records[i].gsm.resize(0); - records[i].wcdma.resize(0); - records[i].cdma.resize(0); - records[i].lte.resize(0); - records[i].tdscdma.resize(0); - switch(rillCellInfo->cellInfoType) { - case RIL_CELL_INFO_TYPE_GSM: { - records[i].gsm.resize(1); - CellInfoGsm *cellInfoGsm = &records[i].gsm[0]; - cellInfoGsm->cellIdentityGsm.mcc = - std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc); - cellInfoGsm->cellIdentityGsm.mnc = - ril::util::mnc::decode(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc); - cellInfoGsm->cellIdentityGsm.lac = - rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac; - cellInfoGsm->cellIdentityGsm.cid = - rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid; - cellInfoGsm->cellIdentityGsm.arfcn = - rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn; - cellInfoGsm->cellIdentityGsm.bsic = - rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic; - cellInfoGsm->signalStrengthGsm.signalStrength = - rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength; - cellInfoGsm->signalStrengthGsm.bitErrorRate = - rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate; - cellInfoGsm->signalStrengthGsm.timingAdvance = - rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance; - break; - } - - case RIL_CELL_INFO_TYPE_WCDMA: { - records[i].wcdma.resize(1); - CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0]; - cellInfoWcdma->cellIdentityWcdma.mcc = - std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc); - cellInfoWcdma->cellIdentityWcdma.mnc = - ril::util::mnc::decode(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc); - cellInfoWcdma->cellIdentityWcdma.lac = - rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac; - cellInfoWcdma->cellIdentityWcdma.cid = - rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid; - cellInfoWcdma->cellIdentityWcdma.psc = - rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc; - cellInfoWcdma->cellIdentityWcdma.uarfcn = - rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn; - cellInfoWcdma->signalStrengthWcdma.signalStrength = - rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength; - cellInfoWcdma->signalStrengthWcdma.bitErrorRate = - rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate; - break; - } - - case RIL_CELL_INFO_TYPE_CDMA: { - records[i].cdma.resize(1); - CellInfoCdma *cellInfoCdma = &records[i].cdma[0]; - cellInfoCdma->cellIdentityCdma.networkId = - rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId; - cellInfoCdma->cellIdentityCdma.systemId = - rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId; - cellInfoCdma->cellIdentityCdma.baseStationId = - rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId; - cellInfoCdma->cellIdentityCdma.longitude = - rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude; - cellInfoCdma->cellIdentityCdma.latitude = - rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude; - cellInfoCdma->signalStrengthCdma.dbm = - rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm; - cellInfoCdma->signalStrengthCdma.ecio = - rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio; - cellInfoCdma->signalStrengthEvdo.dbm = - rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm; - cellInfoCdma->signalStrengthEvdo.ecio = - rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio; - cellInfoCdma->signalStrengthEvdo.signalNoiseRatio = - rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio; - break; - } - - case RIL_CELL_INFO_TYPE_LTE: { - records[i].lte.resize(1); - CellInfoLte *cellInfoLte = &records[i].lte[0]; - cellInfoLte->cellIdentityLte.mcc = - std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc); - cellInfoLte->cellIdentityLte.mnc = - ril::util::mnc::decode(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc); - cellInfoLte->cellIdentityLte.ci = - rillCellInfo->CellInfo.lte.cellIdentityLte.ci; - cellInfoLte->cellIdentityLte.pci = - rillCellInfo->CellInfo.lte.cellIdentityLte.pci; - cellInfoLte->cellIdentityLte.tac = - rillCellInfo->CellInfo.lte.cellIdentityLte.tac; - cellInfoLte->cellIdentityLte.earfcn = - rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn; - cellInfoLte->signalStrengthLte.signalStrength = - rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength; - cellInfoLte->signalStrengthLte.rsrp = - rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp; - cellInfoLte->signalStrengthLte.rsrq = - rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq; - cellInfoLte->signalStrengthLte.rssnr = - rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr; - cellInfoLte->signalStrengthLte.cqi = - rillCellInfo->CellInfo.lte.signalStrengthLte.cqi; - cellInfoLte->signalStrengthLte.timingAdvance = - rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance; - break; - } - - case RIL_CELL_INFO_TYPE_TD_SCDMA: { - records[i].tdscdma.resize(1); - CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0]; - cellInfoTdscdma->cellIdentityTdscdma.mcc = - std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc); - cellInfoTdscdma->cellIdentityTdscdma.mnc = - ril::util::mnc::decode( - rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc); - cellInfoTdscdma->cellIdentityTdscdma.lac = - rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac; - cellInfoTdscdma->cellIdentityTdscdma.cid = - rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid; - cellInfoTdscdma->cellIdentityTdscdma.cpid = - rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid; - cellInfoTdscdma->signalStrengthTdscdma.rscp = - rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp; - break; - } - default: { - break; - } - } - rillCellInfo += 1; - } -} - -int radio_1_5::cellInfoListInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) { - RLOGE("cellInfoListInd: invalid response"); - return 0; - } - - hidl_vec<CellInfo> records; - convertRilCellInfoListToHal(response, responseLen, records); - -#if VDBG - RLOGD("cellInfoListInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList( - convertIntToRadioIndicationType(indicationType), records); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::imsNetworkStateChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { -#if VDBG - RLOGD("imsNetworkStateChangedInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged( - convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::subscriptionStatusChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("subscriptionStatusChangedInd: invalid response"); - return 0; - } - bool activate = ((int32_t *) response)[0]; -#if VDBG - RLOGD("subscriptionStatusChangedInd: activate %d", activate); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged( - convertIntToRadioIndicationType(indicationType), activate); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::srvccStateNotifyInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(int)) { - RLOGE("srvccStateNotifyInd: invalid response"); - return 0; - } - int32_t state = ((int32_t *) response)[0]; -#if VDBG - RLOGD("srvccStateNotifyInd: rat %d", state); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify( - convertIntToRadioIndicationType(indicationType), (SrvccState) state); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -void convertRilHardwareConfigListToHal(void *response, size_t responseLen, - hidl_vec<HardwareConfig>& records) { - int num = responseLen / sizeof(RIL_HardwareConfig); - records.resize(num); - - RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response; - for (int i = 0; i < num; i++) { - records[i].type = (HardwareConfigType) rilHardwareConfig[i].type; - records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid); - records[i].state = (HardwareConfigState) rilHardwareConfig[i].state; - switch (rilHardwareConfig[i].type) { - case RIL_HARDWARE_CONFIG_MODEM: { - records[i].modem.resize(1); - records[i].sim.resize(0); - HardwareConfigModem *hwConfigModem = &records[i].modem[0]; - hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat; - hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice; - hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData; - hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby; - break; - } - - case RIL_HARDWARE_CONFIG_SIM: { - records[i].sim.resize(1); - records[i].modem.resize(0); - records[i].sim[0].modemUuid = - convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid); - break; - } - } - } -} - -int radio_1_5::hardwareConfigChangedInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if ((response == NULL && responseLen != 0) - || responseLen % sizeof(RIL_HardwareConfig) != 0) { - RLOGE("hardwareConfigChangedInd: invalid response"); - return 0; - } - - hidl_vec<HardwareConfig> configs; - convertRilHardwareConfigListToHal(response, responseLen, configs); - -#if VDBG - RLOGD("hardwareConfigChangedInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged( - convertIntToRadioIndicationType(indicationType), configs); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) { - RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response; - rc.session = rilRadioCapability->session; - rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase; - rc.raf = rilRadioCapability->rat; - rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid); - rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status; -} - -int radio_1_5::radioCapabilityIndicationInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) { - RLOGE("radioCapabilityIndicationInd: invalid response"); - return 0; - } - - RadioCapability rc = {}; - convertRilRadioCapabilityToHal(response, responseLen, rc); - -#if VDBG - RLOGD("radioCapabilityIndicationInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication( - convertIntToRadioIndicationType(indicationType), rc); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) { - if ((reqType == SS_INTERROGATION) && - (serType == SS_CFU || - serType == SS_CF_BUSY || - serType == SS_CF_NO_REPLY || - serType == SS_CF_NOT_REACHABLE || - serType == SS_CF_ALL || - serType == SS_CF_ALL_CONDITIONAL)) { - return true; - } - return false; -} - -int radio_1_5::onSupplementaryServiceIndicationInd(int slotId, - int indicationType, int token, RIL_Errno e, - void *response, size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) { - RLOGE("onSupplementaryServiceIndicationInd: invalid response"); - return 0; - } - - RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response; - StkCcUnsolSsResult ss = {}; - ss.serviceType = (SsServiceType) rilSsResponse->serviceType; - ss.requestType = (SsRequestType) rilSsResponse->requestType; - ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType; - ss.serviceClass = rilSsResponse->serviceClass; - ss.result = (RadioError) rilSsResponse->result; - - if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) { -#if VDBG - RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d", - rilSsResponse->cfData.numValidIndexes); -#endif - if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) { - RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than " - "max value %d, truncating it to max value", NUM_SERVICE_CLASSES); - rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES; - } - - ss.cfData.resize(1); - ss.ssInfo.resize(0); - - /* number of call info's */ - ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes); - - for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) { - RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i]; - CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i]; - - cfInfo->status = (CallForwardInfoStatus) cf.status; - cfInfo->reason = cf.reason; - cfInfo->serviceClass = cf.serviceClass; - cfInfo->toa = cf.toa; - cfInfo->number = convertCharPtrToHidlString(cf.number); - cfInfo->timeSeconds = cf.timeSeconds; -#if VDBG - RLOGD("onSupplementaryServiceIndicationInd: " - "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status, - cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds); -#endif - } - } else { - ss.ssInfo.resize(1); - ss.cfData.resize(0); - - /* each int */ - ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX); - for (int i = 0; i < SS_INFO_MAX; i++) { -#if VDBG - RLOGD("onSupplementaryServiceIndicationInd: Data: %d", - rilSsResponse->ssInfo[i]); -#endif - ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i]; - } - } - -#if VDBG - RLOGD("onSupplementaryServiceIndicationInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication-> - onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType), - ss); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("onSupplementaryServiceIndicationInd: " - "radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::stkCallControlAlphaNotifyInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("stkCallControlAlphaNotifyInd: invalid response"); - return 0; - } -#if VDBG - RLOGD("stkCallControlAlphaNotifyInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify( - convertIntToRadioIndicationType(indicationType), - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL", - slotId); - } - - return 0; -} - -void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) { - RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response; - lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps; - lce.confidenceLevel = rilLceDataInfo->confidence_level; - lce.lceSuspended = rilLceDataInfo->lce_suspended; -} - -int radio_1_5::lceDataInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) { - RLOGE("lceDataInd: invalid response"); - return 0; - } - - LceDataInfo lce = {}; - convertRilLceDataInfoToHal(response, responseLen, lce); -#if VDBG - RLOGD("lceDataInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData( - convertIntToRadioIndicationType(indicationType), lce); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::pcoDataInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) { - RLOGE("pcoDataInd: invalid response"); - return 0; - } - - PcoDataInfo pco = {}; - RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response; - pco.cid = rilPcoData->cid; - pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto); - pco.pcoId = rilPcoData->pco_id; - pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length); - -#if VDBG - RLOGD("pcoDataInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData( - convertIntToRadioIndicationType(indicationType), pco); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::modemResetInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("modemResetInd: invalid response"); - return 0; - } -#if VDBG - RLOGD("modemResetInd"); -#endif - Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset( - convertIntToRadioIndicationType(indicationType), - convertCharPtrToHidlString((char *) response)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId); - } - - return 0; -} - -int radio_1_5::networkScanResultInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("networkScanResultInd"); -#endif - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_4 != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("networkScanResultInd: invalid response"); - return 0; - } - RLOGD("networkScanResultInd"); - -#if VDBG - RLOGD("networkScanResultInd"); -#endif - - RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response; - - V1_1::NetworkScanResult result; - result.status = (V1_1::ScanStatus) networkScanResult->status; - result.error = (RadioError) networkScanResult->error; - convertRilCellInfoListToHal( - networkScanResult->network_infos, - networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12), - result.networkInfos); - - Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_4->networkScanResult( - convertIntToRadioIndicationType(indicationType), result); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_4 == NULL", slotId); - } - return 0; -} - -int radio_1_5::carrierInfoForImsiEncryption(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_4 != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("carrierInfoForImsiEncryption: invalid response"); - return 0; - } - RLOGD("carrierInfoForImsiEncryption"); - Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_4-> - carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType)); - radioService[slotId]->checkReturnStatus(retStatus); - } else { - RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_4 == NULL", - slotId); - } - - return 0; -} - -int radio_1_5::keepaliveStatusInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { -#if VDBG - RLOGD("%s(): token=%d", __FUNCTION__, token); -#endif - if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) { - RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId); - return 0; - } - - auto ret = V1_1::IRadioIndication::castFrom( - radioService[slotId]->mRadioIndication); - if (!ret.isOk()) { - RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId); - return 0; - } - sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret; - - if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) { - RLOGE("%s: invalid response", __FUNCTION__); - return 0; - } - - V1_1::KeepaliveStatus ks; - convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks); - - Return<void> retStatus = radioIndicationV1_1->keepaliveStatus( - convertIntToRadioIndicationType(indicationType), ks); - radioService[slotId]->checkReturnStatus(retStatus); - return 0; -} - -int radio_1_5::oemHookRawInd(int slotId, - int indicationType, int token, RIL_Errno e, void *response, - size_t responseLen) { - if (!kOemHookEnabled) return 0; - - if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) { - if (response == NULL || responseLen == 0) { - RLOGE("oemHookRawInd: invalid response"); - return 0; - } - - hidl_vec<uint8_t> data; - data.setToExternal((uint8_t *) response, responseLen); -#if VDBG - RLOGD("oemHookRawInd"); -#endif - Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw( - convertIntToRadioIndicationType(indicationType), data); - checkReturnStatus(slotId, retStatus, false); - } else { - RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId); - } - - return 0; -} - -void radio_1_5::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) { - using namespace android::hardware; - int simCount = 1; - const char *serviceNames[] = { - android::RIL_getServiceName() - #if (SIM_COUNT >= 2) - , RIL2_SERVICE_NAME - #if (SIM_COUNT >= 3) - , RIL3_SERVICE_NAME - #if (SIM_COUNT >= 4) - , RIL4_SERVICE_NAME - #endif - #endif - #endif - }; - - #if (SIM_COUNT >= 2) - simCount = SIM_COUNT; - #endif - - s_vendorFunctions = callbacks; - s_commands = commands; - - configureRpcThreadpool(1, true /* callerWillJoin */); - for (int i = 0; i < simCount; i++) { - pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i); - int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr); - assert(ret == 0); - - RLOGD("sim i = %d registering ...", i); - - radioService[i] = new RadioImpl_1_5; - radioService[i]->mSlotId = i; - RLOGD("registerService: starting android::hardware::radio::V1_5::IRadio %s for slot %d", - serviceNames[i], i); - android::status_t status = radioService[i]->registerAsService(serviceNames[i]); - assert(status == android::OK); - - RLOGD("registerService: OemHook is enabled = %s", kOemHookEnabled ? "true" : "false"); - if (kOemHookEnabled) { - oemHookService[i] = new OemHookImpl; - oemHookService[i]->mSlotId = i; - // status = oemHookService[i]->registerAsService(serviceNames[i]); - } - - ret = pthread_rwlock_unlock(radioServiceRwlockPtr); - assert(ret == 0); - } -} - -void rilc_thread_pool() { - joinRpcThreadpool(); -} - -pthread_rwlock_t * radio_1_5::getRadioServiceRwlock(int slotId) { - pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock; - - #if (SIM_COUNT >= 2) - if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2; - #if (SIM_COUNT >= 3) - if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3; - #if (SIM_COUNT >= 4) - if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4; - #endif - #endif - #endif - - return radioServiceRwlockPtr; -} - -// should acquire write lock for the corresponding service before calling this -void radio_1_5::setNitzTimeReceived(int slotId, long timeReceived) { - nitzTimeReceived[slotId] = timeReceived; -} |