1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4020a203aSopenharmony_ci * you may not use this file except in compliance with the License.
5020a203aSopenharmony_ci * You may obtain a copy of the License at
6020a203aSopenharmony_ci *
7020a203aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8020a203aSopenharmony_ci *
9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12020a203aSopenharmony_ci * See the License for the specific language governing permissions and
13020a203aSopenharmony_ci * limitations under the License.
14020a203aSopenharmony_ci */
15020a203aSopenharmony_ci
16020a203aSopenharmony_ci#include "freeze_common.h"
17020a203aSopenharmony_ci
18020a203aSopenharmony_ci#include "hiview_logger.h"
19020a203aSopenharmony_cinamespace OHOS {
20020a203aSopenharmony_cinamespace HiviewDFX {
21020a203aSopenharmony_cinamespace {
22020a203aSopenharmony_ci    static const int APPLICATION_RESULT_ID = 0;
23020a203aSopenharmony_ci    static const int SYSTEM_RESULT_ID = 1;
24020a203aSopenharmony_ci    static const int SYSTEM_WARNING_RESULT_ID = 2;
25020a203aSopenharmony_ci}
26020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D01, "FreezeDetector");
27020a203aSopenharmony_ciFreezeCommon::FreezeCommon()
28020a203aSopenharmony_ci{
29020a203aSopenharmony_ci    freezeRuleCluster_ = nullptr;
30020a203aSopenharmony_ci}
31020a203aSopenharmony_ci
32020a203aSopenharmony_ciFreezeCommon::~FreezeCommon()
33020a203aSopenharmony_ci{
34020a203aSopenharmony_ci    freezeRuleCluster_ = nullptr;
35020a203aSopenharmony_ci}
36020a203aSopenharmony_ci
37020a203aSopenharmony_cibool FreezeCommon::Init()
38020a203aSopenharmony_ci{
39020a203aSopenharmony_ci    freezeRuleCluster_ = std::make_shared<FreezeRuleCluster>();
40020a203aSopenharmony_ci    return freezeRuleCluster_->Init();
41020a203aSopenharmony_ci}
42020a203aSopenharmony_ci
43020a203aSopenharmony_cibool FreezeCommon::IsFreezeEvent(const std::string& domain, const std::string& stringId) const
44020a203aSopenharmony_ci{
45020a203aSopenharmony_ci    return IsApplicationEvent(domain, stringId) || IsSystemEvent(domain, stringId) ||
46020a203aSopenharmony_ci        IsSysWarningEvent(domain, stringId);
47020a203aSopenharmony_ci}
48020a203aSopenharmony_ci
49020a203aSopenharmony_cibool FreezeCommon::IsApplicationEvent(const std::string& domain, const std::string& stringId) const
50020a203aSopenharmony_ci{
51020a203aSopenharmony_ci    return IsAssignedEvent(domain, stringId, APPLICATION_RESULT_ID);
52020a203aSopenharmony_ci}
53020a203aSopenharmony_ci
54020a203aSopenharmony_cibool FreezeCommon::IsSystemEvent(const std::string& domain, const std::string& stringId) const
55020a203aSopenharmony_ci{
56020a203aSopenharmony_ci    return IsAssignedEvent(domain, stringId, SYSTEM_RESULT_ID);
57020a203aSopenharmony_ci}
58020a203aSopenharmony_ci
59020a203aSopenharmony_cibool FreezeCommon::IsSysWarningEvent(const std::string& domain, const std::string& stringId) const
60020a203aSopenharmony_ci{
61020a203aSopenharmony_ci    return IsAssignedEvent(domain, stringId, SYSTEM_WARNING_RESULT_ID);
62020a203aSopenharmony_ci}
63020a203aSopenharmony_ci
64020a203aSopenharmony_cibool FreezeCommon::IsAssignedEvent(const std::string& domain, const std::string& stringId, int freezeId) const
65020a203aSopenharmony_ci{
66020a203aSopenharmony_ci    if (freezeRuleCluster_ == nullptr) {
67020a203aSopenharmony_ci        HIVIEW_LOGW("freezeRuleCluster_ == nullptr.");
68020a203aSopenharmony_ci        return false;
69020a203aSopenharmony_ci    }
70020a203aSopenharmony_ci
71020a203aSopenharmony_ci    std::map<std::string, std::pair<std::string, bool>> pairs;
72020a203aSopenharmony_ci    switch (freezeId) {
73020a203aSopenharmony_ci        case APPLICATION_RESULT_ID:
74020a203aSopenharmony_ci            pairs = freezeRuleCluster_->GetApplicationPairs();
75020a203aSopenharmony_ci            break;
76020a203aSopenharmony_ci        case SYSTEM_RESULT_ID:
77020a203aSopenharmony_ci            pairs = freezeRuleCluster_->GetSystemPairs();
78020a203aSopenharmony_ci            break;
79020a203aSopenharmony_ci        case SYSTEM_WARNING_RESULT_ID:
80020a203aSopenharmony_ci            pairs = freezeRuleCluster_->GetSysWarningPairs();
81020a203aSopenharmony_ci            break;
82020a203aSopenharmony_ci        default:
83020a203aSopenharmony_ci            return false;
84020a203aSopenharmony_ci    }
85020a203aSopenharmony_ci    for (auto const &pair : pairs) {
86020a203aSopenharmony_ci        if (stringId == pair.first && domain == pair.second.first) {
87020a203aSopenharmony_ci            return true;
88020a203aSopenharmony_ci        }
89020a203aSopenharmony_ci    }
90020a203aSopenharmony_ci    return false;
91020a203aSopenharmony_ci}
92020a203aSopenharmony_ci
93020a203aSopenharmony_cibool FreezeCommon::IsSystemResult(const FreezeResult& result) const
94020a203aSopenharmony_ci{
95020a203aSopenharmony_ci    return result.GetId() == SYSTEM_RESULT_ID;
96020a203aSopenharmony_ci}
97020a203aSopenharmony_ci
98020a203aSopenharmony_cibool FreezeCommon::IsApplicationResult(const FreezeResult& result) const
99020a203aSopenharmony_ci{
100020a203aSopenharmony_ci    return result.GetId() == APPLICATION_RESULT_ID;
101020a203aSopenharmony_ci}
102020a203aSopenharmony_ci
103020a203aSopenharmony_cibool FreezeCommon::IsSysWarningResult(const FreezeResult& result) const
104020a203aSopenharmony_ci{
105020a203aSopenharmony_ci    return result.GetId() == SYSTEM_WARNING_RESULT_ID;
106020a203aSopenharmony_ci}
107020a203aSopenharmony_ci
108020a203aSopenharmony_cibool FreezeCommon::IsBetaVersion() const
109020a203aSopenharmony_ci{
110020a203aSopenharmony_ci    return true;
111020a203aSopenharmony_ci}
112020a203aSopenharmony_ci
113020a203aSopenharmony_cistd::set<std::string> FreezeCommon::GetPrincipalStringIds() const
114020a203aSopenharmony_ci{
115020a203aSopenharmony_ci    std::set<std::string> set;
116020a203aSopenharmony_ci    if (freezeRuleCluster_ == nullptr) {
117020a203aSopenharmony_ci        HIVIEW_LOGW("freezeRuleCluster_ == nullptr.");
118020a203aSopenharmony_ci        return set;
119020a203aSopenharmony_ci    }
120020a203aSopenharmony_ci    auto applicationPairs = freezeRuleCluster_->GetApplicationPairs();
121020a203aSopenharmony_ci    auto systemPairs = freezeRuleCluster_->GetSystemPairs();
122020a203aSopenharmony_ci    auto sysWarningPairs = freezeRuleCluster_->GetSysWarningPairs();
123020a203aSopenharmony_ci    for (auto const &pair : applicationPairs) {
124020a203aSopenharmony_ci        if (pair.second.second) {
125020a203aSopenharmony_ci            set.insert(pair.first);
126020a203aSopenharmony_ci        }
127020a203aSopenharmony_ci    }
128020a203aSopenharmony_ci    for (auto const &pair : systemPairs) {
129020a203aSopenharmony_ci        if (pair.second.second) {
130020a203aSopenharmony_ci            set.insert(pair.first);
131020a203aSopenharmony_ci        }
132020a203aSopenharmony_ci    }
133020a203aSopenharmony_ci    for (auto const &pair : sysWarningPairs) {
134020a203aSopenharmony_ci        if (pair.second.second) {
135020a203aSopenharmony_ci            set.insert(pair.first);
136020a203aSopenharmony_ci        }
137020a203aSopenharmony_ci    }
138020a203aSopenharmony_ci
139020a203aSopenharmony_ci    return set;
140020a203aSopenharmony_ci}
141020a203aSopenharmony_ci
142020a203aSopenharmony_cistd::shared_ptr<FreezeRuleCluster> FreezeCommon::GetFreezeRuleCluster() const
143020a203aSopenharmony_ci{
144020a203aSopenharmony_ci    return freezeRuleCluster_;
145020a203aSopenharmony_ci}
146020a203aSopenharmony_ci}  // namespace HiviewDFX
147020a203aSopenharmony_ci}  // namespace OHOS