diff options
Diffstat (limited to 'libril/ril_service.cpp')
-rw-r--r-- | libril/ril_service.cpp | 169 |
1 files changed, 146 insertions, 23 deletions
diff --git a/libril/ril_service.cpp b/libril/ril_service.cpp index ea85054..cb4fb5c 100644 --- a/libril/ril_service.cpp +++ b/libril/ril_service.cpp @@ -1322,8 +1322,63 @@ Return<void> RadioImpl::startNetworkScan(int32_t serial, const NetworkScanReques #if VDBG RLOGD("startNetworkScan: serial %d", serial); #endif - // TODO(b/30954762): Add implementation to start network scan. - dispatchVoid(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN); + + 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 ::android::hardware::radio::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 ::android::hardware::radio::V1_1::RadioAccessNetworks::GERAN: + ras_to.bands_length = ras_from.geranBands.size(); + bands = (std::vector<uint32_t> *) &ras_from.geranBands; + break; + case ::android::hardware::radio::V1_1::RadioAccessNetworks::UTRAN: + ras_to.bands_length = ras_from.utranBands.size(); + bands = (std::vector<uint32_t> *) &ras_from.utranBands; + break; + case ::android::hardware::radio::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 + std::memcpy(&ras_to.bands.geran_bands, bands, ras_to.bands_length * sizeof(uint32_t)); + } + + s_vendorFunctions->onRequest( + RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI); + return Void(); } @@ -1331,7 +1386,6 @@ Return<void> RadioImpl::stopNetworkScan(int32_t serial) { #if VDBG RLOGD("stopNetworkScan: serial %d", serial); #endif - // TODO(b/30954762): Add implementation to stop network scan. dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN); return Void(); } @@ -4334,24 +4388,6 @@ int radio::getAvailableNetworksResponse(int slotId, return 0; } -int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("startNetworkScanResponse: serial %d", serial); -#endif - // TODO(b/30954762): Add implementation to generate startNetworkScanResponse. - return 0; -} - -int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e, - void *response, size_t responseLen) { -#if VDBG - RLOGD("stopNetworkScanResponse: serial %d", serial); -#endif - // TODO(b/30954762): Add implementation to generate stopNetworkScanResponse. - return 0; -} - int radio::startDtmfResponse(int slotId, int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) { @@ -6401,6 +6437,58 @@ int radio::setSimCardPowerResponse(int slotId, return 0; } +int radio::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]->mRadioResponse != NULL) { + RadioResponseInfo responseInfo = {}; + populateResponseInfo(responseInfo, serial, responseType, e); + Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret = + ::android::hardware::radio::V1_1::IRadioResponse::castFrom( + radioService[slotId]->mRadioResponse); + if (ret.isOk()) { + sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret; + Return<void> retStatus = radioResponseV1_1->startNetworkScanResponse(responseInfo); + radioService[slotId]->checkReturnStatus(retStatus); + } else { + RLOGD("startNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId); + } + } else { + RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId); + } + + return 0; +} + +int radio::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]->mRadioResponse != NULL) { + RadioResponseInfo responseInfo = {}; + populateResponseInfo(responseInfo, serial, responseType, e); + Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret = + ::android::hardware::radio::V1_1::IRadioResponse::castFrom( + radioService[slotId]->mRadioResponse); + if (ret.isOk()) { + sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret; + Return<void> retStatus = radioResponseV1_1->stopNetworkScanResponse(responseInfo); + radioService[slotId]->checkReturnStatus(retStatus); + } else { + RLOGD("stopNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId); + } + } else { + RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId); + } + + return 0; +} + int radio::sendRequestRawResponse(int slotId, int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) { @@ -8050,11 +8138,46 @@ int radio::modemResetInd(int slotId, int radio::networkScanResultInd(int slotId, int indicationType, int token, RIL_Errno e, void *response, - size_t responselen) { + size_t responseLen) { #if VDBG RLOGD("networkScanResultInd"); #endif - // TODO(b/30954762): Add implementation for networkScanResultInd. + if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { + if (response == NULL || responseLen == 0) { + RLOGE("networkScanResultInd: invalid response"); + return 0; + } + RLOGD("networkScanResultInd"); + +#if VDBG + RLOGD("networkScanResultInd"); +#endif + + Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret = + ::android::hardware::radio::V1_1::IRadioIndication::castFrom( + radioService[slotId]->mRadioIndication); + if (ret.isOk()) { + RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response; + + ::android::hardware::radio::V1_1::NetworkScanResult result; + result.status = + (::android::hardware::radio::V1_1::ScanStatus) networkScanResult->status; + result.error = (RadioError) e; + convertRilCellInfoListToHal( + networkScanResult->network_infos, + networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12), + result.networkInfos); + + sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret; + Return<void> retStatus = radioIndicationV1_1->networkScanResult( + convertIntToRadioIndicationType(indicationType), result); + radioService[slotId]->checkReturnStatus(retStatus); + } else { + RLOGE("networkScanResultInd: ret.isOk() == false for radioService[%d]", slotId); + } + } else { + RLOGE("networkScanResultInd: radioService[%d]->mRadioIndication == NULL", slotId); + } return 0; } |