1 /*
2 * Copyright (c) 2022 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 #include "checker/checker_manager.h"
16 namespace OHOS {
17 namespace DistributedData {
GetInstance()18 CheckerManager &CheckerManager::GetInstance()
19 {
20 static CheckerManager instance;
21 return instance;
22 }
23
LoadCheckers(std::vector<std::string> & checkers)24 void CheckerManager::LoadCheckers(std::vector<std::string> &checkers)
25 {
26 for (const auto &checker : checkers) {
27 if (checkers_.find(checker) != checkers_.end()) {
28 continue;
29 }
30 auto it = getters_.Find(checker);
31 if (!it.first || it.second == nullptr) {
32 continue;
33 }
34 auto *bundleChecker = it.second();
35 if (bundleChecker == nullptr) {
36 continue;
37 }
38 bundleChecker->Initialize();
39 checkers_[checker] = bundleChecker;
40 }
41 }
42
RegisterPlugin(const std::string & checker,std::function<Checker * ()> getter)43 void CheckerManager::RegisterPlugin(const std::string &checker, std::function<Checker *()> getter)
44 {
45 auto it = getters_.Find(checker);
46 if (it.first) {
47 return;
48 }
49 getters_.Compute(checker, [&getter](const auto &key, auto &value) {
50 value = move(getter);
51 return true;
52 });
53 }
54
GetAppId(const StoreInfo & info)55 std::string CheckerManager::GetAppId(const StoreInfo &info)
56 {
57 for (auto &[name, checker] : checkers_) {
58 if (checker == nullptr) {
59 continue;
60 }
61 auto appId = checker->GetAppId(info);
62 if (appId.empty()) {
63 continue;
64 }
65 return appId;
66 }
67 return "";
68 }
69
IsValid(const StoreInfo & info)70 bool CheckerManager::IsValid(const StoreInfo &info)
71 {
72 for (auto &[name, checker] : checkers_) {
73 if (checker == nullptr) {
74 continue;
75 }
76 if (!checker->IsValid(info)) {
77 continue;
78 }
79 return true;
80 }
81 return false;
82 }
83
GetChecker(const std::string & checker)84 CheckerManager::Checker *CheckerManager::GetChecker(const std::string &checker)
85 {
86 auto it = checkers_.find(checker);
87 if (it == checkers_.end()) {
88 return nullptr;
89 }
90 return it->second;
91 }
92 } // namespace DistributedData
93 } // namespace OHOS