1ea497e4dSopenharmony_ci/* 2ea497e4dSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3ea497e4dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ea497e4dSopenharmony_ci * you may not use this file except in compliance with the License. 5ea497e4dSopenharmony_ci * You may obtain a copy of the License at 6ea497e4dSopenharmony_ci * 7ea497e4dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ea497e4dSopenharmony_ci * 9ea497e4dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ea497e4dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ea497e4dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ea497e4dSopenharmony_ci * See the License for the specific language governing permissions and 13ea497e4dSopenharmony_ci * limitations under the License. 14ea497e4dSopenharmony_ci */ 15ea497e4dSopenharmony_ci 16ea497e4dSopenharmony_ci#include "sa_command_manager.h" 17ea497e4dSopenharmony_ci 18ea497e4dSopenharmony_ci#include "iam_check.h" 19ea497e4dSopenharmony_ci 20ea497e4dSopenharmony_ci#define LOG_TAG "FACE_AUTH_SA" 21ea497e4dSopenharmony_ci 22ea497e4dSopenharmony_cinamespace OHOS { 23ea497e4dSopenharmony_cinamespace UserIam { 24ea497e4dSopenharmony_cinamespace FaceAuth { 25ea497e4dSopenharmony_ciSaCommandManager &SaCommandManager::GetInstance() 26ea497e4dSopenharmony_ci{ 27ea497e4dSopenharmony_ci static SaCommandManager manager; 28ea497e4dSopenharmony_ci return manager; 29ea497e4dSopenharmony_ci} 30ea497e4dSopenharmony_ci 31ea497e4dSopenharmony_civoid SaCommandManager::RegisterSaCommandProcessor(std::vector<SaCommandId> commandIds, 32ea497e4dSopenharmony_ci std::shared_ptr<ISaCommandProcessor> processor) 33ea497e4dSopenharmony_ci{ 34ea497e4dSopenharmony_ci IF_FALSE_LOGE_AND_RETURN(processor != nullptr); 35ea497e4dSopenharmony_ci 36ea497e4dSopenharmony_ci std::unique_lock<std::shared_mutex> lock(mutex_); 37ea497e4dSopenharmony_ci 38ea497e4dSopenharmony_ci processors_.insert(processor); 39ea497e4dSopenharmony_ci 40ea497e4dSopenharmony_ci for (const auto &commandId : commandIds) { 41ea497e4dSopenharmony_ci if (commandId2Processors_.find(commandId) == commandId2Processors_.end()) { 42ea497e4dSopenharmony_ci commandId2Processors_[commandId] = std::set<std::shared_ptr<ISaCommandProcessor>>(); 43ea497e4dSopenharmony_ci } 44ea497e4dSopenharmony_ci 45ea497e4dSopenharmony_ci commandId2Processors_[commandId].insert(processor); 46ea497e4dSopenharmony_ci } 47ea497e4dSopenharmony_ci} 48ea497e4dSopenharmony_ci 49ea497e4dSopenharmony_civoid SaCommandManager::UnregisterSaCommandProcessor(std::vector<SaCommandId> commandIds, 50ea497e4dSopenharmony_ci std::shared_ptr<ISaCommandProcessor> processor) 51ea497e4dSopenharmony_ci{ 52ea497e4dSopenharmony_ci IF_FALSE_LOGE_AND_RETURN(processor != nullptr); 53ea497e4dSopenharmony_ci 54ea497e4dSopenharmony_ci std::unique_lock<std::shared_mutex> lock(mutex_); 55ea497e4dSopenharmony_ci 56ea497e4dSopenharmony_ci processors_.erase(processor); 57ea497e4dSopenharmony_ci 58ea497e4dSopenharmony_ci for (const auto &commandId : commandIds) { 59ea497e4dSopenharmony_ci if (commandId2Processors_.find(commandId) == commandId2Processors_.end()) { 60ea497e4dSopenharmony_ci continue; 61ea497e4dSopenharmony_ci } 62ea497e4dSopenharmony_ci 63ea497e4dSopenharmony_ci commandId2Processors_[commandId].erase(processor); 64ea497e4dSopenharmony_ci } 65ea497e4dSopenharmony_ci} 66ea497e4dSopenharmony_ci 67ea497e4dSopenharmony_ciUserAuth::ResultCode SaCommandManager::ProcessSaCommands(std::shared_ptr<FaceAuthAllInOneExecutorHdi> executor, 68ea497e4dSopenharmony_ci const std::vector<SaCommand> &commands) 69ea497e4dSopenharmony_ci{ 70ea497e4dSopenharmony_ci std::shared_lock<std::shared_mutex> lock(mutex_); 71ea497e4dSopenharmony_ci 72ea497e4dSopenharmony_ci for (const auto &command : commands) { 73ea497e4dSopenharmony_ci IAM_LOGI("process command %{public}d", command.id); 74ea497e4dSopenharmony_ci auto it = commandId2Processors_.find(static_cast<SaCommandId>(command.id)); 75ea497e4dSopenharmony_ci IF_FALSE_LOGE_AND_RETURN_VAL(it != commandId2Processors_.end(), UserAuth::GENERAL_ERROR); 76ea497e4dSopenharmony_ci for (const auto &processor : commandId2Processors_[static_cast<SaCommandId>(command.id)]) { 77ea497e4dSopenharmony_ci IF_FALSE_LOGE_AND_RETURN_VAL(processor != nullptr, UserAuth::GENERAL_ERROR); 78ea497e4dSopenharmony_ci UserAuth::ResultCode result = processor->ProcessSaCommand(executor, command); 79ea497e4dSopenharmony_ci IF_FALSE_LOGE_AND_RETURN_VAL(result == UserAuth::SUCCESS, UserAuth::GENERAL_ERROR); 80ea497e4dSopenharmony_ci } 81ea497e4dSopenharmony_ci } 82ea497e4dSopenharmony_ci 83ea497e4dSopenharmony_ci return UserAuth::SUCCESS; 84ea497e4dSopenharmony_ci} 85ea497e4dSopenharmony_ci 86ea497e4dSopenharmony_civoid SaCommandManager::OnHdiDisconnect(std::shared_ptr<FaceAuthAllInOneExecutorHdi> executor) 87ea497e4dSopenharmony_ci{ 88ea497e4dSopenharmony_ci std::shared_lock<std::shared_mutex> lock(mutex_); 89ea497e4dSopenharmony_ci 90ea497e4dSopenharmony_ci for (const auto &processor : processors_) { 91ea497e4dSopenharmony_ci IF_FALSE_LOGE_AND_RETURN(processor != nullptr); 92ea497e4dSopenharmony_ci processor->OnHdiDisconnect(executor); 93ea497e4dSopenharmony_ci } 94ea497e4dSopenharmony_ci 95ea497e4dSopenharmony_ci return; 96ea497e4dSopenharmony_ci} 97ea497e4dSopenharmony_ci} // namespace FaceAuth 98ea497e4dSopenharmony_ci} // namespace UserIam 99ea497e4dSopenharmony_ci} // namespace OHOS