1 /*
2 * Copyright (c) 2025 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 "camera_xml_parser.h"
17
18 #include <dlfcn.h>
19 #include <string>
20 #include <map>
21 #include <set>
22 #include <atomic>
23 #include <mutex>
24 #include <libxml/parser.h>
25 #include <libxml/tree.h>
26
27 #include "camera_log.h"
28 namespace OHOS {
29 namespace CameraStandard {
30
31 static const int8_t SUCCESS = 0;
32 static const int8_t FAIL = -1;
33
34 class CameraXmlNodeInner : public CameraXmlNode {
35 public:
36 CameraXmlNodeInner();
37 CameraXmlNodeInner(const CameraXmlNodeInner &obj);
38 CameraXmlNodeInner &operator=(const CameraXmlNodeInner &obj);
39 ~CameraXmlNodeInner() override;
40
41 std::shared_ptr<CameraXmlNode> GetChildrenNode() override;
42 std::shared_ptr<CameraXmlNode> GetCopyNode() override;
43 int32_t Config(const char *fileName, const char *encoding, int32_t options) override;
44 void MoveToNext() override;
45 void MoveToChildren() override;
46
47 bool IsNodeValid() override;
48 bool CompareName(const char *propName) override;
49 bool IsElementNode() override;
50 bool HasProp(const char *propName) override;
51 int32_t GetProp(const char *propName, std::string &result) override;
52 int32_t GetContent(std::string &result) override;
53 std::string GetName() override;
54
55 void FreeDoc() override;
56 void FreeProp(char *propName) override;
57 void CleanUpParser() override;
58
59 private:
60 int32_t StrcmpXml(const xmlChar *propName1, const xmlChar *propName2);
61 xmlDoc *doc_ = nullptr;
62 xmlNode *curNode_ = nullptr;
63 };
64
Create()65 std::shared_ptr<CameraXmlNode> CameraXmlNode::Create()
66 {
67 return std::make_shared<CameraXmlNodeInner>();
68 }
69
GetChildrenNode()70 std::shared_ptr<CameraXmlNode> CameraXmlNodeInner::GetChildrenNode()
71 {
72 std::shared_ptr<CameraXmlNodeInner> copyNode = std::make_shared<CameraXmlNodeInner>(*this);
73 copyNode->MoveToChildren();
74 return copyNode;
75 }
76
GetCopyNode()77 std::shared_ptr<CameraXmlNode> CameraXmlNodeInner::GetCopyNode()
78 {
79 return std::make_shared<CameraXmlNodeInner>(*this);
80 }
81
CameraXmlNodeInner()82 CameraXmlNodeInner::CameraXmlNodeInner() {}
83
CameraXmlNodeInner(const CameraXmlNodeInner & obj)84 CameraXmlNodeInner::CameraXmlNodeInner(const CameraXmlNodeInner &obj)
85 {
86 // only the main node has doc and freedoc() when destruct
87 doc_ = nullptr;
88 curNode_ = obj.curNode_;
89 }
90
operator =(const CameraXmlNodeInner & obj)91 CameraXmlNodeInner &CameraXmlNodeInner::operator=(const CameraXmlNodeInner &obj)
92 {
93 // only the main node has doc and freedoc() when destruct
94 doc_ = nullptr;
95 curNode_ = obj.curNode_;
96 return *this;
97 }
98
~CameraXmlNodeInner()99 CameraXmlNodeInner::~CameraXmlNodeInner()
100 {
101 if (doc_ != nullptr) {
102 xmlFreeDoc(doc_);
103 xmlCleanupParser();
104 doc_ = nullptr;
105 }
106 curNode_ = nullptr;
107 }
108
Config(const char * fileName,const char * encoding,int32_t options)109 int32_t CameraXmlNodeInner::Config(const char *fileName, const char *encoding, int32_t options)
110 {
111 doc_ = xmlReadFile(fileName, encoding, options);
112 CHECK_ERROR_RETURN_RET_LOG(doc_ == nullptr, FAIL, "xmlReadFile failed! fileName :%{public}s", fileName);
113 curNode_ = xmlDocGetRootElement(doc_);
114 CHECK_ERROR_RETURN_RET_LOG(curNode_ == nullptr, FAIL, "xmlDocGetRootElement failed!");
115 return SUCCESS;
116 }
117
MoveToNext()118 void CameraXmlNodeInner::MoveToNext()
119 {
120 CHECK_ERROR_RETURN_LOG(curNode_ == nullptr, "curNode_ is nullptr! Cannot MoveToNext!");
121 curNode_ = curNode_->next;
122 }
123
MoveToChildren()124 void CameraXmlNodeInner::MoveToChildren()
125 {
126 CHECK_ERROR_RETURN_LOG(curNode_ == nullptr, "curNode_ is nullptr! Cannot MoveToChildren!");
127 curNode_ = curNode_->children;
128 }
129
IsNodeValid()130 bool CameraXmlNodeInner::IsNodeValid()
131 {
132 return curNode_ != nullptr;
133 }
134
135 // need check curNode_ isvalid before use
HasProp(const char * propName)136 bool CameraXmlNodeInner::HasProp(const char *propName)
137 {
138 return xmlHasProp(curNode_, reinterpret_cast<const xmlChar*>(propName));
139 }
140
141 // need check curNode_ isvalid before use
GetProp(const char * propName,std::string & result)142 int32_t CameraXmlNodeInner::GetProp(const char *propName, std::string &result)
143 {
144 result = "";
145 xmlChar *tempValue = xmlGetProp(curNode_, reinterpret_cast<const xmlChar*>(propName));
146 CHECK_ERROR_RETURN_RET_LOG(tempValue == nullptr, FAIL, "GetProp Fail! curNode has no prop: %{public}s", propName);
147 result = reinterpret_cast<char*>(tempValue);
148 return SUCCESS;
149 }
150
GetContent(std::string & result)151 int32_t CameraXmlNodeInner::GetContent(std::string &result)
152 {
153 xmlChar *tempContent = xmlNodeGetContent(curNode_);
154 CHECK_ERROR_RETURN_RET_LOG(tempContent == nullptr, FAIL, "GetContent Fail!");
155 result = reinterpret_cast<char*>(tempContent);
156 return SUCCESS;
157 }
158
GetName()159 std::string CameraXmlNodeInner::GetName()
160 {
161 CHECK_ERROR_RETURN_RET_LOG(curNode_ == nullptr, "", "curNode_ is nullptr! Cannot GetName!");
162 return reinterpret_cast<char*>(const_cast<xmlChar*>(curNode_->name));
163 }
164
FreeDoc()165 void CameraXmlNodeInner::FreeDoc()
166 {
167 if (doc_ != nullptr) {
168 xmlFreeDoc(doc_);
169 doc_ = nullptr;
170 }
171 }
172
FreeProp(char * propName)173 void CameraXmlNodeInner::FreeProp(char *propName)
174 {
175 xmlFree(reinterpret_cast<xmlChar*>(propName));
176 }
177
CleanUpParser()178 void CameraXmlNodeInner::CleanUpParser()
179 {
180 xmlCleanupParser();
181 }
182
StrcmpXml(const xmlChar * propName1,const xmlChar * propName2)183 int32_t CameraXmlNodeInner::StrcmpXml(const xmlChar *propName1, const xmlChar *propName2)
184 {
185 return xmlStrcmp(propName1, propName2);
186 }
187
CompareName(const char * propName)188 bool CameraXmlNodeInner::CompareName(const char *propName)
189 {
190 CHECK_ERROR_RETURN_RET_LOG(curNode_ == nullptr, false, "curNode_ is nullptr! Cannot CompareName!");
191 return curNode_->type == XML_ELEMENT_NODE &&
192 (StrcmpXml(curNode_->name, reinterpret_cast<const xmlChar*>(propName)) == 0);
193 }
194
IsElementNode()195 bool CameraXmlNodeInner::IsElementNode()
196 {
197 CHECK_ERROR_RETURN_RET_LOG(curNode_ == nullptr, false, "curNode_ is nullptr! Cannot CompareElementNode!");
198 return curNode_->type == XML_ELEMENT_NODE;
199 }
200
201 } // namespace CameraStandard
202 } // namespace OHOS
203