1ea497e4dSopenharmony_ci/*
2ea497e4dSopenharmony_ci * Copyright (c) 2022 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 "face_auth_driver_hdi.h"
17ea497e4dSopenharmony_ci
18ea497e4dSopenharmony_ci#include <memory>
19ea497e4dSopenharmony_ci#include <vector>
20ea497e4dSopenharmony_ci
21ea497e4dSopenharmony_ci#include "hdf_base.h"
22ea497e4dSopenharmony_ci#include "refbase.h"
23ea497e4dSopenharmony_ci
24ea497e4dSopenharmony_ci#include "iam_check.h"
25ea497e4dSopenharmony_ci#include "iam_logger.h"
26ea497e4dSopenharmony_ci#include "iam_ptr.h"
27ea497e4dSopenharmony_ci
28ea497e4dSopenharmony_ci#include "face_auth_all_in_one_executor_hdi.h"
29ea497e4dSopenharmony_ci#include "face_auth_defines.h"
30ea497e4dSopenharmony_ci#include "face_auth_hdi.h"
31ea497e4dSopenharmony_ci#include "face_auth_interface_adapter.h"
32ea497e4dSopenharmony_ci
33ea497e4dSopenharmony_ci#define LOG_TAG "FACE_AUTH_SA"
34ea497e4dSopenharmony_ci
35ea497e4dSopenharmony_cinamespace OHOS {
36ea497e4dSopenharmony_cinamespace UserIam {
37ea497e4dSopenharmony_cinamespace FaceAuth {
38ea497e4dSopenharmony_cinamespace UserAuth = OHOS::UserIam::UserAuth;
39ea497e4dSopenharmony_cistd::mutex FaceAuthDriverHdi::mutex_;
40ea497e4dSopenharmony_ci
41ea497e4dSopenharmony_ciFaceAuthDriverHdi::FaceAuthDriverHdi(const std::shared_ptr<FaceAuthInterfaceAdapter> faceAuthInterfaceAdapter)
42ea497e4dSopenharmony_ci    : faceAuthInterfaceAdapter_(faceAuthInterfaceAdapter)
43ea497e4dSopenharmony_ci{
44ea497e4dSopenharmony_ci}
45ea497e4dSopenharmony_ci
46ea497e4dSopenharmony_civoid FaceAuthDriverHdi::GetExecutorList(std::vector<std::shared_ptr<UserAuth::IAuthExecutorHdi>> &executorList)
47ea497e4dSopenharmony_ci{
48ea497e4dSopenharmony_ci    IF_FALSE_LOGE_AND_RETURN(faceAuthInterfaceAdapter_ != nullptr);
49ea497e4dSopenharmony_ci    auto faceIf = faceAuthInterfaceAdapter_->Get();
50ea497e4dSopenharmony_ci    if (faceIf == nullptr) {
51ea497e4dSopenharmony_ci        IAM_LOGE("IFaceAuthInterface is null");
52ea497e4dSopenharmony_ci        return;
53ea497e4dSopenharmony_ci    }
54ea497e4dSopenharmony_ci
55ea497e4dSopenharmony_ci    std::vector<sptr<IAllInOneExecutor>> iExecutorList;
56ea497e4dSopenharmony_ci    auto ret = faceIf->GetExecutorList(iExecutorList);
57ea497e4dSopenharmony_ci    if (ret != HDF_SUCCESS) {
58ea497e4dSopenharmony_ci        IAM_LOGE("GetExecutorList fail");
59ea497e4dSopenharmony_ci        return;
60ea497e4dSopenharmony_ci    }
61ea497e4dSopenharmony_ci
62ea497e4dSopenharmony_ci    std::lock_guard<std::mutex> guard(mutex_);
63ea497e4dSopenharmony_ci    faceAuthExecutorList_.clear();
64ea497e4dSopenharmony_ci    for (const auto &iExecutor : iExecutorList) {
65ea497e4dSopenharmony_ci        if (iExecutor == nullptr) {
66ea497e4dSopenharmony_ci            IAM_LOGE("iExecutor is nullptr");
67ea497e4dSopenharmony_ci            continue;
68ea497e4dSopenharmony_ci        }
69ea497e4dSopenharmony_ci        auto executor = Common::MakeShared<FaceAuthAllInOneExecutorHdi>(iExecutor);
70ea497e4dSopenharmony_ci        if (executor == nullptr) {
71ea497e4dSopenharmony_ci            IAM_LOGE("make share failed");
72ea497e4dSopenharmony_ci            continue;
73ea497e4dSopenharmony_ci        }
74ea497e4dSopenharmony_ci        executorList.push_back(executor);
75ea497e4dSopenharmony_ci        faceAuthExecutorList_.push_back(executor);
76ea497e4dSopenharmony_ci    }
77ea497e4dSopenharmony_ci}
78ea497e4dSopenharmony_ci
79ea497e4dSopenharmony_civoid FaceAuthDriverHdi::OnHdiDisconnect()
80ea497e4dSopenharmony_ci{
81ea497e4dSopenharmony_ci    IAM_LOGI("start");
82ea497e4dSopenharmony_ci    std::lock_guard<std::mutex> guard(mutex_);
83ea497e4dSopenharmony_ci    for (const auto &iExecutor : faceAuthExecutorList_) {
84ea497e4dSopenharmony_ci        if (iExecutor == nullptr) {
85ea497e4dSopenharmony_ci            IAM_LOGE("iExecutor is nullptr");
86ea497e4dSopenharmony_ci            continue;
87ea497e4dSopenharmony_ci        }
88ea497e4dSopenharmony_ci        iExecutor->OnHdiDisconnect();
89ea497e4dSopenharmony_ci    }
90ea497e4dSopenharmony_ci    faceAuthExecutorList_.clear();
91ea497e4dSopenharmony_ci    return;
92ea497e4dSopenharmony_ci}
93ea497e4dSopenharmony_ci
94ea497e4dSopenharmony_ciint32_t FaceAuthDriverHdi::SetBufferProducer(sptr<IBufferProducer> &producer)
95ea497e4dSopenharmony_ci{
96ea497e4dSopenharmony_ci    OHOS::sptr<BufferProducerSequenceable> producerSequenceable(nullptr);
97ea497e4dSopenharmony_ci    if (producer != nullptr) {
98ea497e4dSopenharmony_ci        producerSequenceable =
99ea497e4dSopenharmony_ci            sptr<BufferProducerSequenceable>(new (std::nothrow) BufferProducerSequenceable(producer));
100ea497e4dSopenharmony_ci        IF_FALSE_LOGE_AND_RETURN_VAL(producerSequenceable != nullptr, FACE_AUTH_ERROR);
101ea497e4dSopenharmony_ci    }
102ea497e4dSopenharmony_ci
103ea497e4dSopenharmony_ci    IF_FALSE_LOGE_AND_RETURN_VAL(faceAuthInterfaceAdapter_ != nullptr, FACE_AUTH_ERROR);
104ea497e4dSopenharmony_ci    auto faceIf = faceAuthInterfaceAdapter_->Get();
105ea497e4dSopenharmony_ci    if (faceIf == nullptr) {
106ea497e4dSopenharmony_ci        IAM_LOGE("IFaceAuthInterface is null");
107ea497e4dSopenharmony_ci        return FACE_AUTH_ERROR;
108ea497e4dSopenharmony_ci    }
109ea497e4dSopenharmony_ci
110ea497e4dSopenharmony_ci    auto ret = faceIf->SetBufferProducer(producerSequenceable);
111ea497e4dSopenharmony_ci    if (ret != HDF_SUCCESS) {
112ea497e4dSopenharmony_ci        IAM_LOGE("GetExecutorList fail");
113ea497e4dSopenharmony_ci        return FACE_AUTH_ERROR;
114ea497e4dSopenharmony_ci    }
115ea497e4dSopenharmony_ci
116ea497e4dSopenharmony_ci    return FACE_AUTH_SUCCESS;
117ea497e4dSopenharmony_ci}
118ea497e4dSopenharmony_ci} // namespace FaceAuth
119ea497e4dSopenharmony_ci} // namespace UserIam
120ea497e4dSopenharmony_ci} // namespace OHOS
121