1/*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "fingerprint_auth_driver_hdi.h"
17
18#include <memory>
19#include <vector>
20
21#include "hdf_base.h"
22#include "refbase.h"
23
24#include "iam_check.h"
25#include "iam_logger.h"
26#include "iam_ptr.h"
27
28#include "fingerprint_auth_all_in_one_executor_hdi.h"
29#include "fingerprint_auth_defines.h"
30#include "fingerprint_auth_hdi.h"
31#include "fingerprint_auth_interface_adapter.h"
32
33#define LOG_TAG "FINGERPRINT_AUTH_SA"
34
35namespace OHOS {
36namespace UserIam {
37namespace FingerprintAuth {
38namespace UserAuth = OHOS::UserIam::UserAuth;
39std::mutex FingerprintAuthDriverHdi::mutex_;
40
41FingerprintAuthDriverHdi::FingerprintAuthDriverHdi(
42    const std::shared_ptr<FingerprintAuthInterfaceAdapter> fingerprintAuthInterfaceAdapter)
43    : fingerprintAuthInterfaceAdapter_(fingerprintAuthInterfaceAdapter)
44{
45}
46
47void FingerprintAuthDriverHdi::GetExecutorList(std::vector<std::shared_ptr<UserAuth::IAuthExecutorHdi>> &executorList)
48{
49    IF_FALSE_LOGE_AND_RETURN(fingerprintAuthInterfaceAdapter_ != nullptr);
50    auto fingerprintIf = fingerprintAuthInterfaceAdapter_->Get();
51    if (fingerprintIf == nullptr) {
52        IAM_LOGE("IFingerprintAuthInterface is null");
53        return;
54    }
55
56    std::vector<sptr<IAllInOneExecutor>> iExecutorList;
57    auto ret = fingerprintIf->GetExecutorList(iExecutorList);
58    if (ret != HDF_SUCCESS) {
59        IAM_LOGE("GetExecutorList fail");
60        return;
61    }
62
63    std::lock_guard<std::mutex> guard(mutex_);
64    fingerprintAuthExecutorList_.clear();
65    for (const auto &iExecutor : iExecutorList) {
66        if (iExecutor == nullptr) {
67            IAM_LOGE("iExecutor is nullptr");
68            continue;
69        }
70        auto executor = Common::MakeShared<FingerprintAllInOneExecutorHdi>(iExecutor);
71        if (executor == nullptr) {
72            IAM_LOGE("make share failed");
73            continue;
74        }
75        executorList.push_back(executor);
76        fingerprintAuthExecutorList_.push_back(executor);
77    }
78}
79
80void FingerprintAuthDriverHdi::OnHdiDisconnect()
81{
82    IAM_LOGI("start");
83    std::lock_guard<std::mutex> guard(mutex_);
84    for (const auto &iExecutor : fingerprintAuthExecutorList_) {
85        if (iExecutor == nullptr) {
86            IAM_LOGE("iExecutor is nullptr");
87            continue;
88        }
89        iExecutor->OnHdiDisconnect();
90    }
91    fingerprintAuthExecutorList_.clear();
92    return;
93}
94} // namespace FingerprintAuth
95} // namespace UserIam
96} // namespace OHOS
97