/****************************************************************************** * * Copyright 2023 NXP * * 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. * ******************************************************************************/ #include "Weaver.h" #include namespace aidl { namespace android { namespace hardware { namespace weaver { using ::ndk::ScopedAStatus; using std::vector; // Methods from ::android::hardware::weaver::IWeaver follow. Weaver::Weaver() { ALOGD("Weaver Constructor"); pInterface = WeaverImpl::getInstance(); if (pInterface != NULL) { pInterface->Init(); } else { ALOGE("Failed to get Weaver Interface"); } } ScopedAStatus Weaver::getConfig(WeaverConfig *out_config) { ALOGD("Weaver::getConfig"); if (out_config == NULL) { ALOGE("Invalid param"); return ScopedAStatus::fromServiceSpecificErrorWithMessage( STATUS_FAILED, "Null pointer passed"); } memset(out_config, 0, sizeof(WeaverConfig)); if (pInterface == NULL) { return ScopedAStatus::fromServiceSpecificErrorWithMessage( STATUS_FAILED, "Weaver interface not defined"); } SlotInfo slotInfo; Status_Weaver status = pInterface->GetSlots(slotInfo); if (status == WEAVER_STATUS_OK) { out_config->slots = slotInfo.slots; out_config->keySize = slotInfo.keySize; out_config->valueSize = slotInfo.valueSize; ALOGD("Weaver Success for getSlots Slots :(%d)", out_config->slots); return ScopedAStatus::ok(); } else { return ScopedAStatus::fromServiceSpecificErrorWithMessage( STATUS_FAILED, "Failed to retrieve slots info"); } } ScopedAStatus Weaver::read(int32_t in_slotId, const vector &in_key, WeaverReadResponse *out_response) { ALOGD("Weaver::read slot %d", in_slotId); if (out_response == NULL) { return ScopedAStatus::fromServiceSpecificErrorWithMessage( STATUS_FAILED, "Null pointer passed"); } if (in_key.empty()) { out_response->status = WeaverReadStatus::FAILED; return ScopedAStatus::fromServiceSpecificErrorWithMessage( STATUS_FAILED, "Empty key input passed"); } if (pInterface == NULL) { out_response->status = WeaverReadStatus::FAILED; return ScopedAStatus::fromServiceSpecificErrorWithMessage( STATUS_FAILED, "Weaver interface not defined"); } memset(out_response, 0, sizeof(WeaverReadResponse)); ReadRespInfo readInfo; ScopedAStatus retStatus; Status_Weaver status; status = pInterface->Read(in_slotId, in_key, readInfo); switch (status) { case WEAVER_STATUS_OK: ALOGD("Read slot %d OK", in_slotId); out_response->value = readInfo.value; out_response->status = WeaverReadStatus::OK; retStatus = ScopedAStatus::ok(); break; case WEAVER_STATUS_INCORRECT_KEY: ALOGE("Read Incorrect Key"); out_response->value.resize(0); out_response->timeout = readInfo.timeout; out_response->status = WeaverReadStatus::INCORRECT_KEY; retStatus = ScopedAStatus::ok(); break; case WEAVER_STATUS_THROTTLE: ALOGE("Read WEAVER_THROTTLE"); out_response->value.resize(0); out_response->timeout = readInfo.timeout; out_response->status = WeaverReadStatus::THROTTLE; retStatus = ScopedAStatus::ok(); break; default: out_response->timeout = 0; out_response->value.resize(0); out_response->status = WeaverReadStatus::FAILED; retStatus = ScopedAStatus::ok(); break; } return retStatus; } ScopedAStatus Weaver::write(int32_t in_slotId, const vector &in_key, const vector &in_value) { ALOGD("Weaver::write slot %d", in_slotId); if (in_key.empty() || in_value.empty()) { return ScopedAStatus::fromServiceSpecificErrorWithMessage( STATUS_FAILED, "Invalid parameters passed"); } if (pInterface == NULL) { return ScopedAStatus::fromServiceSpecificErrorWithMessage( STATUS_FAILED, "Weaver interface not defined"); } if (pInterface->Write(in_slotId, in_key, in_value) == WEAVER_STATUS_OK) { ALOGD("Write slot %d OK", in_slotId); return ScopedAStatus::ok(); } else { return ScopedAStatus::fromServiceSpecificErrorWithMessage(STATUS_FAILED, "Unknown error"); } } } // namespace weaver } // namespace hardware } // namespace android } // namespace aidl