1 /*
2 * Copyright (C) 2024 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 "package_parser.h"
17 #include "wifi_logger.h"
18
19 namespace OHOS {
20 namespace Wifi {
21 DEFINE_WIFILOG_LABEL("PackageXmlParser");
22
~PackageXmlParser()23 PackageXmlParser::~PackageXmlParser()
24 {}
25
ParseInternal(xmlNodePtr node)26 bool PackageXmlParser::ParseInternal(xmlNodePtr node)
27 {
28 if (node == nullptr) {
29 WIFI_LOGE("ParseInternal node null");
30 return false;
31 }
32 if (xmlStrcmp(node->name, BAD_CAST(TAG_HEADER)) != 0) {
33 WIFI_LOGE("node name=%{public}s not equal WifiPackages", node->name);
34 return false;
35 }
36 mScanControlFilterMap.clear();
37 mCandidateFilterList.clear();
38 mCorePackageMap.clear();
39 mAclAuthList.clear();
40 mScanLimitPackage_.clear();
41 mLandscapeSwitchLimitList_.clear();
42 for (xmlNodePtr subNode = node->children; subNode != nullptr; subNode = subNode->next) {
43 std::string tagName = GetNodeValue(subNode);
44 if (tagName == TAG_SCAN_CONTROL) {
45 GetPackageMap(subNode, mScanControlFilterMap);
46 } else if (tagName == TAG_CANDIDATE_FILTER) {
47 GetPackageList(subNode, mCandidateFilterList);
48 } else if (tagName == TAG_CORE_PACKAGEINFO) {
49 GetPackageMap(subNode, mCorePackageMap);
50 } else if (tagName == TAG_ACL_AUTH) {
51 GetPackageList(subNode, mAclAuthList);
52 } else if (tagName == TAG_SCAN_LIMIT) {
53 GetPackageList(subNode, mScanLimitPackage_);
54 } else if (tagName == TAG_LANDSCAPE_SWITCH_LIMIT) {
55 GetPackageList(subNode, mLandscapeSwitchLimitList_);
56 } else {
57 WIFI_LOGI("unknow package tag.");
58 }
59 }
60 return true;
61 }
62
GetPackageMap(xmlNodePtr & innode,std::map<std::string,std::vector<PackageInfo>> & result)63 void PackageXmlParser::GetPackageMap(xmlNodePtr &innode, std::map<std::string, std::vector<PackageInfo>> &result)
64 {
65 for (xmlNodePtr node = innode->children; node != nullptr; node = node->next) {
66 std::string tagName = GetNodeValue(node);
67 std::vector<PackageInfo> packageNodeList;
68 GetPackageList(node, packageNodeList);
69 result.insert_or_assign(tagName, packageNodeList);
70 }
71 WIFI_LOGI("%{public}s out,result size:%{public}d!", __FUNCTION__, (int)result.size());
72 }
73
GetPackageList(xmlNodePtr & innode,std::vector<PackageInfo> & packageNodeList)74 void PackageXmlParser::GetPackageList(xmlNodePtr &innode, std::vector<PackageInfo> &packageNodeList)
75 {
76 for (xmlNodePtr node = innode->children; node != nullptr; node = node->next) {
77 PackageInfo info;
78 ParseFinalNode(node, info);
79 if (!info.name.empty()) {
80 packageNodeList.emplace_back(info);
81 }
82 }
83 }
84
ParseFinalNode(xmlNodePtr & innode,PackageInfo & info)85 void PackageXmlParser::ParseFinalNode(xmlNodePtr &innode, PackageInfo &info)
86 {
87 xmlChar* name = xmlGetProp(innode, BAD_CAST(PARAM_NAME));
88 if (name != nullptr) {
89 info.name = std::string(reinterpret_cast<char *>(name));
90 xmlFree(name);
91 }
92 xmlChar* appid = xmlGetProp(innode, BAD_CAST(PARAM_APPID));
93 if (appid != nullptr) {
94 info.appid = std::string(reinterpret_cast<char *>(appid));
95 xmlFree(appid);
96 }
97 }
98
GetScanControlPackages(std::map<std::string,std::vector<PackageInfo>> & packageMap)99 void PackageXmlParser::GetScanControlPackages(std::map<std::string, std::vector<PackageInfo>> &packageMap)
100 {
101 packageMap = mScanControlFilterMap;
102 }
103
GetCandidateFilterPackages(std::vector<PackageInfo> & packageList)104 void PackageXmlParser::GetCandidateFilterPackages(std::vector<PackageInfo> &packageList)
105 {
106 packageList = mCandidateFilterList;
107 }
108
GetCorePackages(std::map<std::string,std::vector<PackageInfo>> & packageMap)109 void PackageXmlParser::GetCorePackages(std::map<std::string, std::vector<PackageInfo>> &packageMap)
110 {
111 packageMap = mCorePackageMap;
112 }
113
GetAclAuthPackages(std::vector<PackageInfo> & packageList)114 void PackageXmlParser::GetAclAuthPackages(std::vector<PackageInfo> &packageList)
115 {
116 packageList = mAclAuthList;
117 }
118
GetScanLimitPackages(std::vector<PackageInfo> & packageList)119 void PackageXmlParser::GetScanLimitPackages(std::vector<PackageInfo> &packageList)
120 {
121 packageList = mScanLimitPackage_;
122 }
123
GetLandscapeSwitchLimitList(std::vector<PackageInfo> & packageList)124 void PackageXmlParser::GetLandscapeSwitchLimitList(std::vector<PackageInfo> &packageList)
125 {
126 packageList = mLandscapeSwitchLimitList_;
127 }
128 }
129 }