• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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