1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (c) 2021 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#ifndef FREEZE_RULE_CLUSTER_H
17020a203aSopenharmony_ci#define FREEZE_RULE_CLUSTER_H
18020a203aSopenharmony_ci
19020a203aSopenharmony_ci#include <libxml/parser.h>
20020a203aSopenharmony_ci#include <libxml/tree.h>
21020a203aSopenharmony_ci#include <list>
22020a203aSopenharmony_ci#include <map>
23020a203aSopenharmony_ci#include <string>
24020a203aSopenharmony_ci#include <vector>
25020a203aSopenharmony_ci
26020a203aSopenharmony_ci#include "watch_point.h"
27020a203aSopenharmony_cinamespace OHOS {
28020a203aSopenharmony_cinamespace HiviewDFX {
29020a203aSopenharmony_ciclass FreezeResult {
30020a203aSopenharmony_cipublic:
31020a203aSopenharmony_ci    FreezeResult() : window_(0), code_(0), scope_(""), samePackage_(""), domain_(""), stringId_(""), action_("and") {};
32020a203aSopenharmony_ci    FreezeResult(long window, const std::string& domain, const std::string& stringId)
33020a203aSopenharmony_ci        : window_(window), code_(0), scope_(""), samePackage_(""), domain_(domain), stringId_(stringId),
34020a203aSopenharmony_ci        action_("and") {};
35020a203aSopenharmony_ci    FreezeResult(unsigned long code, const std::string& scope)
36020a203aSopenharmony_ci        : window_(0), code_(code), scope_(scope), samePackage_(""), domain_(""), stringId_(""), action_("and") {};
37020a203aSopenharmony_ci    ~FreezeResult() {};
38020a203aSopenharmony_ci    std::string GetDomain() const;
39020a203aSopenharmony_ci    std::string GetStringId() const;
40020a203aSopenharmony_ci    unsigned long GetId() const;
41020a203aSopenharmony_ci    void SetId(unsigned long code);
42020a203aSopenharmony_ci    std::string GetScope() const;
43020a203aSopenharmony_ci    void SetScope(const std::string& scope);
44020a203aSopenharmony_ci    long GetWindow() const;
45020a203aSopenharmony_ci    std::string GetSamePackage() const;
46020a203aSopenharmony_ci    void SetSamePackage(const std::string& samePackage);
47020a203aSopenharmony_ci    std::string GetAction() const;
48020a203aSopenharmony_ci    void SetAction(const std::string& action);
49020a203aSopenharmony_ci
50020a203aSopenharmony_ciprivate:
51020a203aSopenharmony_ci    long window_;
52020a203aSopenharmony_ci    unsigned long code_;
53020a203aSopenharmony_ci    std::string scope_;
54020a203aSopenharmony_ci    std::string samePackage_;
55020a203aSopenharmony_ci    std::string domain_;
56020a203aSopenharmony_ci    std::string stringId_;
57020a203aSopenharmony_ci    std::string action_;
58020a203aSopenharmony_ci};
59020a203aSopenharmony_ci
60020a203aSopenharmony_ciclass FreezeRule {
61020a203aSopenharmony_cipublic:
62020a203aSopenharmony_ci    FreezeRule() : domain_(""), stringId_("") {};
63020a203aSopenharmony_ci    FreezeRule(const std::string& domain, const std::string& stringId)
64020a203aSopenharmony_ci        : domain_(domain), stringId_(stringId) {};
65020a203aSopenharmony_ci    ~FreezeRule()
66020a203aSopenharmony_ci    {
67020a203aSopenharmony_ci        results_.clear();
68020a203aSopenharmony_ci    }
69020a203aSopenharmony_ci
70020a203aSopenharmony_ci    std::string GetDomain() const;
71020a203aSopenharmony_ci    void SetDomain(const std::string& domain);
72020a203aSopenharmony_ci    std::string GetStringId() const;
73020a203aSopenharmony_ci    void SetStringId(const std::string& stringId);
74020a203aSopenharmony_ci    std::map<std::string, FreezeResult> GetMap() const;
75020a203aSopenharmony_ci
76020a203aSopenharmony_ci    void AddResult(const std::string& domain, const std::string& stringId, const FreezeResult& result);
77020a203aSopenharmony_ci    bool GetResult(const std::string& domain, const std::string& stringId, FreezeResult& result);
78020a203aSopenharmony_ci
79020a203aSopenharmony_ciprivate:
80020a203aSopenharmony_ci    std::string domain_;
81020a203aSopenharmony_ci    std::string stringId_;
82020a203aSopenharmony_ci    std::map<std::string, FreezeResult> results_;
83020a203aSopenharmony_ci};
84020a203aSopenharmony_ci
85020a203aSopenharmony_ciclass FreezeRuleCluster {
86020a203aSopenharmony_cipublic:
87020a203aSopenharmony_ci    FreezeRuleCluster();
88020a203aSopenharmony_ci    ~FreezeRuleCluster();
89020a203aSopenharmony_ci    FreezeRuleCluster& operator=(const FreezeRuleCluster&) = delete;
90020a203aSopenharmony_ci    FreezeRuleCluster(const FreezeRuleCluster&) = delete;
91020a203aSopenharmony_ci
92020a203aSopenharmony_ci    bool Init();
93020a203aSopenharmony_ci    bool CheckFileSize(const std::string& path);
94020a203aSopenharmony_ci    bool ParseRuleFile(const std::string& file);
95020a203aSopenharmony_ci    void ParseTagFreeze(xmlNode* tag);
96020a203aSopenharmony_ci    void ParseTagRules(xmlNode* tag);
97020a203aSopenharmony_ci    void ParseTagRule(xmlNode* tag);
98020a203aSopenharmony_ci    void ParseTagLinks(xmlNode* tag, FreezeRule& rule);
99020a203aSopenharmony_ci    void ParseTagEvent(xmlNode* tag, FreezeResult& result);
100020a203aSopenharmony_ci    void ParseTagResult(xmlNode* tag, FreezeResult& result);
101020a203aSopenharmony_ci    void ParseTagRelevance(xmlNode* tag, FreezeResult& result);
102020a203aSopenharmony_ci    template<typename T>
103020a203aSopenharmony_ci    T GetAttributeValue(xmlNode* node, const std::string& name);
104020a203aSopenharmony_ci    bool GetResult(const WatchPoint& watchPoint, std::vector<FreezeResult>& list);
105020a203aSopenharmony_ci    std::map<std::string, std::pair<std::string, bool>> GetApplicationPairs() const;
106020a203aSopenharmony_ci    std::map<std::string, std::pair<std::string, bool>> GetSystemPairs() const;
107020a203aSopenharmony_ci    std::map<std::string, std::pair<std::string, bool>> GetSysWarningPairs() const;
108020a203aSopenharmony_ci
109020a203aSopenharmony_ciprivate:
110020a203aSopenharmony_ci    std::map<std::string, FreezeRule> rules_;
111020a203aSopenharmony_ci    std::map<std::string, std::pair<std::string, bool>> applicationPairs_;
112020a203aSopenharmony_ci    std::map<std::string, std::pair<std::string, bool>> systemPairs_;
113020a203aSopenharmony_ci    std::map<std::string, std::pair<std::string, bool>> sysWarningPairs_;
114020a203aSopenharmony_ci};
115020a203aSopenharmony_ci} // namespace HiviewDFX
116020a203aSopenharmony_ci} // namespace OHOS
117020a203aSopenharmony_ci#endif
118