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 for (xmlNodePtr subNode = node->children; subNode != nullptr; subNode = subNode->next) {
41 std::string tagName = GetNodeValue(subNode);
42 if (tagName == TAG_SCAN_CONTROL) {
43 GetPackageMap(subNode, mScanControlFilterMap);
44 } else if (tagName == TAG_CANDIDATE_FILTER) {
45 GetPackageList(subNode, mCandidateFilterList);
46 } else if (tagName == TAG_CORE_PACKAGEINFO) {
47 GetPackageMap(subNode, mCorePackageMap);
48 } else if (tagName == TAG_ACL_AUTH) {
49 GetPackageList(subNode, mAclAuthList);
50 } else {
51 WIFI_LOGI("unknow package tag.");
52 }
53 }
54 return true;
55 }
56
GetPackageMap(xmlNodePtr & innode,std::map<std::string,std::vector<PackageInfo>> & result)57 void PackageXmlParser::GetPackageMap(xmlNodePtr &innode, std::map<std::string, std::vector<PackageInfo>> &result)
58 {
59 for (xmlNodePtr node = innode->children; node != nullptr; node = node->next) {
60 std::string tagName = GetNodeValue(node);
61 std::vector<PackageInfo> packageNodeList;
62 GetPackageList(node, packageNodeList);
63 result.insert_or_assign(tagName, packageNodeList);
64 }
65 WIFI_LOGI("%{public}s out,result size:%{public}d!", __FUNCTION__, (int)result.size());
66 }
67
GetPackageList(xmlNodePtr & innode,std::vector<PackageInfo> & packageNodeList)68 void PackageXmlParser::GetPackageList(xmlNodePtr &innode, std::vector<PackageInfo> &packageNodeList)
69 {
70 for (xmlNodePtr node = innode->children; node != nullptr; node = node->next) {
71 PackageInfo info;
72 ParseFinalNode(node, info);
73 if (!info.name.empty()) {
74 packageNodeList.emplace_back(info);
75 }
76 }
77 }
78
ParseFinalNode(xmlNodePtr & innode,PackageInfo & info)79 void PackageXmlParser::ParseFinalNode(xmlNodePtr &innode, PackageInfo &info)
80 {
81 xmlChar* name = xmlGetProp(innode, BAD_CAST(PARAM_NAME));
82 if (name != nullptr) {
83 info.name = std::string(reinterpret_cast<char *>(name));
84 xmlFree(name);
85 }
86 xmlChar* appid = xmlGetProp(innode, BAD_CAST(PARAM_APPID));
87 if (appid != nullptr) {
88 info.appid = std::string(reinterpret_cast<char *>(appid));
89 xmlFree(appid);
90 }
91 }
92
GetScanControlPackages(std::map<std::string,std::vector<PackageInfo>> & packageMap)93 void PackageXmlParser::GetScanControlPackages(std::map<std::string, std::vector<PackageInfo>> &packageMap)
94 {
95 packageMap = mScanControlFilterMap;
96 }
97
GetCandidateFilterPackages(std::vector<PackageInfo> & packageList)98 void PackageXmlParser::GetCandidateFilterPackages(std::vector<PackageInfo> &packageList)
99 {
100 packageList = mCandidateFilterList;
101 }
102
GetCorePackages(std::map<std::string,std::vector<PackageInfo>> & packageMap)103 void PackageXmlParser::GetCorePackages(std::map<std::string, std::vector<PackageInfo>> &packageMap)
104 {
105 packageMap = mCorePackageMap;
106 }
107
GetAclAuthPackages(std::vector<PackageInfo> & packageList)108 void PackageXmlParser::GetAclAuthPackages(std::vector<PackageInfo> &packageList)
109 {
110 packageList = mAclAuthList;
111 }
112 }
113 }