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