2 * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 ////////////////////////////////////////////////////////////////////////////////////////////////////
18 /// \ingroup tag_NS_XmlParser
19 /// \brief This file contains implementation of CXmlNode class.
21 ////////////////////////////////////////////////////////////////////////////////////////////////////
23 ////////////////////////////////////////////////////////////////////////////////////////////////////
25 ////////////////////////////////////////////////////////////////////////////////////////////////////
26 #include <native_service/ns_xmlparser_if.h>
28 #include "ns_xmlconfig_parser_frameworkunifiedlog.h"
31 ////////////////////////////////////////////////////////////////////////////////////////////////
34 ////////////////////////////////////////////////////////////////////////////////////////////////
35 CXmlNode::CXmlNode(): m_pXmlNodePtr(NULL) {
36 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
37 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
40 ////////////////////////////////////////////////////////////////////////////////////////////////
42 /// Parameterized Constructor
43 ////////////////////////////////////////////////////////////////////////////////////////////////
44 CXmlNode::CXmlNode(xmlNodePtr f_pXmlNodePtr): m_pXmlNodePtr(f_pXmlNodePtr) {
45 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
46 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
49 ////////////////////////////////////////////////////////////////////////////////////////////////
52 ////////////////////////////////////////////////////////////////////////////////////////////////
53 CXmlNode::~CXmlNode() {
54 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
55 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
58 ////////////////////////////////////////////////////////////////////////////////////////////////
60 /// Sets the xmlNodePtr in class
61 ////////////////////////////////////////////////////////////////////////////////////////////////
62 VOID CXmlNode::SetXmlNodePtr(xmlNodePtr f_pXmlNodePtr) {
63 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
64 m_pXmlNodePtr = f_pXmlNodePtr;
65 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
68 ////////////////////////////////////////////////////////////////////////////////////////////////
70 /// Checks whether the node is valid or not
71 ////////////////////////////////////////////////////////////////////////////////////////////////
72 BOOL CXmlNode::IsNull() {
73 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
76 if (NULL == m_pXmlNodePtr) {
80 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
84 ////////////////////////////////////////////////////////////////////////////////////////////////
86 /// Gets the type of node
87 ////////////////////////////////////////////////////////////////////////////////////////////////
88 EFrameworkunifiedXmlNodeTypes CXmlNode::Type() {
89 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
90 EFrameworkunifiedXmlNodeTypes l_eNodeType = FRAMEWORKUNIFIED_XML_NODE_NONE;
92 if (NULL != m_pXmlNodePtr) {
93 switch (m_pXmlNodePtr->type) {
94 case XML_ELEMENT_NODE:
95 l_eNodeType = FRAMEWORKUNIFIED_XML_ELEMENT_NODE;
97 case XML_ATTRIBUTE_NODE:
98 l_eNodeType = FRAMEWORKUNIFIED_XML_ATTRIBUTE_NODE;
101 l_eNodeType = FRAMEWORKUNIFIED_XML_TEXT_NODE;
103 case XML_CDATA_SECTION_NODE:
104 l_eNodeType = FRAMEWORKUNIFIED_XML_CDATA_SECTION_NODE;
106 case XML_ENTITY_REF_NODE:
107 l_eNodeType = FRAMEWORKUNIFIED_XML_ENTITY_REF_NODE;
109 case XML_ENTITY_NODE:
110 l_eNodeType = FRAMEWORKUNIFIED_XML_ENTITY_NODE;
113 l_eNodeType = FRAMEWORKUNIFIED_XML_PI_NODE;
115 case XML_COMMENT_NODE:
116 l_eNodeType = FRAMEWORKUNIFIED_XML_COMMENT_NODE;
118 case XML_DOCUMENT_NODE:
119 l_eNodeType = FRAMEWORKUNIFIED_XML_DOCUMENT_NODE;
121 case XML_DOCUMENT_TYPE_NODE:
122 l_eNodeType = FRAMEWORKUNIFIED_XML_DOCUMENT_TYPE_NODE;
124 case XML_DOCUMENT_FRAG_NODE:
125 l_eNodeType = FRAMEWORKUNIFIED_XML_DOCUMENT_FRAG_NODE;
127 case XML_NOTATION_NODE:
128 l_eNodeType = FRAMEWORKUNIFIED_XML_NOTATION_NODE;
130 case XML_HTML_DOCUMENT_NODE:
131 l_eNodeType = FRAMEWORKUNIFIED_XML_HTML_DOCUMENT_NODE;
134 l_eNodeType = FRAMEWORKUNIFIED_XML_DTD_NODE;
136 case XML_ELEMENT_DECL:
137 l_eNodeType = FRAMEWORKUNIFIED_XML_ELEMENT_DECL;
139 case XML_ATTRIBUTE_DECL:
140 l_eNodeType = FRAMEWORKUNIFIED_XML_ATTRIBUTE_DECL;
142 case XML_ENTITY_DECL:
143 l_eNodeType = FRAMEWORKUNIFIED_XML_ENTITY_DECL;
145 case XML_NAMESPACE_DECL:
146 l_eNodeType = FRAMEWORKUNIFIED_XML_NAMESPACE_DECL;
148 case XML_XINCLUDE_START:
149 l_eNodeType = FRAMEWORKUNIFIED_XML_XINCLUDE_START;
151 case XML_XINCLUDE_END:
152 l_eNodeType = FRAMEWORKUNIFIED_XML_XINCLUDE_END;
159 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
163 ////////////////////////////////////////////////////////////////////////////////////////////////
165 /// Gets the name of node
166 ////////////////////////////////////////////////////////////////////////////////////////////////
167 std::string CXmlNode::Name() {
168 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
169 std::string l_cNodeName = "";
171 if (NULL != m_pXmlNodePtr && NULL != m_pXmlNodePtr->name) {
172 l_cNodeName = std::string((PCSTR)m_pXmlNodePtr->name); // LCOV_EXCL_BR_LINE 11: except branch
175 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
179 ////////////////////////////////////////////////////////////////////////////////////////////////
181 /// Gets the content of node
182 ////////////////////////////////////////////////////////////////////////////////////////////////
183 std::string CXmlNode::GetContent() {
184 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
185 std::string l_cText = "";
187 if ((NULL != m_pXmlNodePtr) &&
188 (NULL != m_pXmlNodePtr->children) &&
189 (XML_TEXT_NODE == m_pXmlNodePtr->children->type) &&
190 (NULL == m_pXmlNodePtr->children->next)) {
191 xmlChar * p_xmlText = xmlNodeGetContent(m_pXmlNodePtr);
192 l_cText = std::string((PCSTR)p_xmlText); // LCOV_EXCL_BR_LINE 11: except branch
193 xmlFree(p_xmlText); // LCOV_EXCL_BR_LINE 11: except branch
196 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
200 ////////////////////////////////////////////////////////////////////////////////////////////////
202 /// Sets or updates the content of current node.
203 ////////////////////////////////////////////////////////////////////////////////////////////////
204 EFrameworkunifiedStatus CXmlNode::SetContent(std::string f_cUpdatedText) {
205 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
206 EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK;
208 if (NULL != m_pXmlNodePtr) {
209 xmlNodeSetContent(m_pXmlNodePtr, (const xmlChar *)f_cUpdatedText.c_str());
211 l_eStatus = eFrameworkunifiedStatusNullPointer;
214 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
218 ////////////////////////////////////////////////////////////////////////////////////////////////
219 /// GetAttributeValue
220 /// Gets the attribute's value for the key.
221 ////////////////////////////////////////////////////////////////////////////////////////////////
222 EFrameworkunifiedStatus CXmlNode::GetAttributeValue(std::string f_cKey, std::string &f_cAttributeValue) {
223 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
224 EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK;
226 if (NULL != m_pXmlNodePtr) {
227 xmlChar *l_pAttrValue = xmlGetProp(m_pXmlNodePtr,
228 (const xmlChar *)f_cKey.c_str());
229 if (NULL != l_pAttrValue) {
230 f_cAttributeValue.assign((PCSTR)l_pAttrValue);
232 xmlFree(l_pAttrValue);
235 l_eStatus = eFrameworkunifiedStatusNullPointer;
236 FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Attribute key :: %s not found", f_cKey.c_str());
239 l_eStatus = eFrameworkunifiedStatusNullPointer;
240 FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Node ptr is NULL"); // LCOV_EXCL_BR_LINE 15:marco defined in "native_service/ns_logger_if.h"
243 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
247 ////////////////////////////////////////////////////////////////////////////////////////////////
248 /// SetAttributeValue
249 /// Sets the attribute's value for the key
250 ////////////////////////////////////////////////////////////////////////////////////////////////
251 EFrameworkunifiedStatus CXmlNode::SetAttributeValue(std::string f_cKey, std::string f_cValue) {
252 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
253 EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK;
255 FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "SetAttributeValue feature is not available,"
256 "Reason: This API is not supported by libxml2 present in PosixBasedOS001"); // LCOV_EXCL_BR_LINE 15:marco defined in "native_service/ns_logger_if.h"
258 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
262 ////////////////////////////////////////////////////////////////////////////////////////////////
264 /// Add new attribute to the node
265 ////////////////////////////////////////////////////////////////////////////////////////////////
266 EFrameworkunifiedStatus CXmlNode::AddNewAttribute(std::string f_cKey, std::string f_cAttributeValue) {
267 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
268 EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK;
269 xmlChar* p_key = reinterpret_cast<xmlChar*>(const_cast<char*>(f_cKey.c_str()));
270 xmlChar* p_value = reinterpret_cast<xmlChar*>(const_cast<char*>(f_cAttributeValue.c_str()));
271 if (NULL != m_pXmlNodePtr) {
272 if (NULL == xmlNewNsProp(m_pXmlNodePtr,
276 l_eStatus = eFrameworkunifiedStatusNullPointer;
277 FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Unable to add new property :: %s", f_cKey.c_str());
280 l_eStatus = eFrameworkunifiedStatusNullPointer;
281 FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Node ptr is NULL"); // LCOV_EXCL_BR_LINE 15:marco defined in "native_service/ns_logger_if.h"
284 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
288 ////////////////////////////////////////////////////////////////////////////////////////////////
290 /// Removes the attribute from the node with the specified key
291 ////////////////////////////////////////////////////////////////////////////////////////////////
292 EFrameworkunifiedStatus CXmlNode::RemoveAttribute(std::string f_cKey) {
293 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
294 EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK;
296 FRAMEWORKUNIFIEDLOG(ZONE_NS_WAR, __FUNCTION__, "RemoveAttribute feature is not available,"
297 "Reason: This API is not supported by libxml2 present in PosixBasedOS001"); // LCOV_EXCL_BR_LINE 15:marco defined in "native_service/ns_logger_if.h"
299 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
303 ////////////////////////////////////////////////////////////////////////////////////////////////
304 /// GetAttributeItems
305 /// Gets the list of all the attribute's key and value of the node
306 ////////////////////////////////////////////////////////////////////////////////////////////////
307 TAttrList CXmlNode::GetAttributeItems() {
308 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
309 TAttrList l_cAttrList;
311 std::string l_cValue;
313 if (NULL != m_pXmlNodePtr) {
314 for (xmlAttrPtr l_pAttr = m_pXmlNodePtr->properties;
316 l_pAttr = l_pAttr->next) {
317 l_cKey = (PCSTR)l_pAttr->name;
320 if (NULL != l_pAttr->children) {
321 l_cValue = (PCSTR)l_pAttr->children->content;
324 CXmlAttr l_pXmlAttr(l_cKey, l_cValue);
325 l_cAttrList.push_back(l_pXmlAttr); // LCOV_EXCL_BR_LINE 11: except branch
329 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
333 ////////////////////////////////////////////////////////////////////////////////////////////////
335 /// Gets the parent node
336 ////////////////////////////////////////////////////////////////////////////////////////////////
337 CXmlNode CXmlNode::Parent() {
338 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
341 if (NULL != m_pXmlNodePtr && NULL != m_pXmlNodePtr->parent) {
342 if (XML_ELEMENT_NODE == m_pXmlNodePtr->parent->type) {
343 l_pXmlNode.SetXmlNodePtr(m_pXmlNodePtr->parent); // LCOV_EXCL_BR_LINE 11: except branch
347 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
351 ////////////////////////////////////////////////////////////////////////////////////////////////
353 /// Gets the first child of node
354 ////////////////////////////////////////////////////////////////////////////////////////////////
355 CXmlNode CXmlNode::FirstChild() {
356 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
359 if (NULL != m_pXmlNodePtr) {
360 for (xmlNodePtr l_pNodePtr = m_pXmlNodePtr->children;
362 l_pNodePtr = l_pNodePtr->next) {
363 if (XML_ELEMENT_NODE == l_pNodePtr->type) {
364 l_pXmlNode.SetXmlNodePtr(l_pNodePtr); // LCOV_EXCL_BR_LINE 11: except branch
370 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
374 ////////////////////////////////////////////////////////////////////////////////////////////////
376 /// Gets the last child of node
377 ////////////////////////////////////////////////////////////////////////////////////////////////
378 CXmlNode CXmlNode::LastChild() {
379 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
382 if (NULL != m_pXmlNodePtr) {
383 for (xmlNodePtr l_pNodePtr = m_pXmlNodePtr->last;
385 l_pNodePtr = l_pNodePtr->prev) {
386 if (XML_ELEMENT_NODE == l_pNodePtr->type) {
387 l_pXmlNode.SetXmlNodePtr(l_pNodePtr); // LCOV_EXCL_BR_LINE 11: except branch
393 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
397 ////////////////////////////////////////////////////////////////////////////////////////////////
399 /// Gets the list of all the child node of current node
400 ////////////////////////////////////////////////////////////////////////////////////////////////
401 TNodeList CXmlNode::Children() {
402 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
403 TNodeList l_pNodeList;
405 if (NULL != m_pXmlNodePtr) {
406 for (xmlNodePtr l_pNodePtr = m_pXmlNodePtr->children;
408 l_pNodePtr = l_pNodePtr->next) {
409 if (XML_ELEMENT_NODE == l_pNodePtr->type) {
410 CXmlNode l_pXmlNode(l_pNodePtr);
411 l_pNodeList.push_back(l_pXmlNode);
416 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
420 ////////////////////////////////////////////////////////////////////////////////////////////////
422 /// Gets the next sibling node of current node
423 ////////////////////////////////////////////////////////////////////////////////////////////////
424 CXmlNode CXmlNode::NextSibling() {
425 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
428 if (NULL != m_pXmlNodePtr) {
429 for (xmlNodePtr l_pNodePtr = m_pXmlNodePtr->next;
431 l_pNodePtr = l_pNodePtr->next) {
432 if (XML_ELEMENT_NODE == l_pNodePtr->type) {
433 l_pXmlNode.SetXmlNodePtr(l_pNodePtr); // LCOV_EXCL_BR_LINE 11: except branch
439 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
443 ////////////////////////////////////////////////////////////////////////////////////////////////
445 /// Gets the previous sibling node of current node
446 ////////////////////////////////////////////////////////////////////////////////////////////////
447 CXmlNode CXmlNode::PrevSibling() {
448 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
451 if (NULL != m_pXmlNodePtr) {
452 for (xmlNodePtr l_pNodePtr = m_pXmlNodePtr->prev;
454 l_pNodePtr = l_pNodePtr->prev) {
455 if (XML_ELEMENT_NODE == l_pNodePtr->type) {
456 l_pXmlNode.SetXmlNodePtr(l_pNodePtr); // LCOV_EXCL_BR_LINE 11: except branch
462 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
466 ////////////////////////////////////////////////////////////////////////////////////////////////
468 /// Finds the first immediate sub node matching tag as f_cNodeName.
469 ////////////////////////////////////////////////////////////////////////////////////////////////
470 CXmlNode CXmlNode::FindChildNode(std::string f_cNodeName) {
471 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
474 if (NULL != m_pXmlNodePtr) {
475 for (xmlNodePtr l_pNodePtr = m_pXmlNodePtr->children;
477 l_pNodePtr = l_pNodePtr->next) {
478 if ((XML_ELEMENT_NODE == m_pXmlNodePtr->type) &&
479 (0 == f_cNodeName.compare((PCSTR)l_pNodePtr->name))) {
480 l_pXmlNode.SetXmlNodePtr(l_pNodePtr); // LCOV_EXCL_BR_LINE 11: except branch
486 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
490 ////////////////////////////////////////////////////////////////////////////////////////////////
491 /// FindAllChildNodes
492 /// Gets the list of all the immediate sub node matching tag as f_cNodeName.
493 ////////////////////////////////////////////////////////////////////////////////////////////////
494 TNodeList CXmlNode::FindAllChildNodes(std::string f_cNodeName) {
495 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
496 TNodeList l_pNodeList;
498 if (NULL != m_pXmlNodePtr) {
499 for (xmlNodePtr l_pNodePtr = m_pXmlNodePtr->children;
501 l_pNodePtr = l_pNodePtr->next) {
502 if ((XML_ELEMENT_NODE == m_pXmlNodePtr->type) &&
503 (0 == f_cNodeName.compare((PCSTR)l_pNodePtr->name))) {
504 CXmlNode l_pXmlNode(l_pNodePtr);
505 l_pNodeList.push_back(l_pXmlNode);
510 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
514 ////////////////////////////////////////////////////////////////////////////////////////////////
515 /// GetContentOfChildNode
516 /// Finds the first level sub node matching tag as f_cNodeName.
517 ////////////////////////////////////////////////////////////////////////////////////////////////
518 EFrameworkunifiedStatus CXmlNode::GetContentOfChildNode(std::string f_cNodeName, std::string &f_cContent) {
519 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
520 EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK;
522 CXmlNode l_pXmlNode = FindChildNode(f_cNodeName);
524 if (!l_pXmlNode.IsNull()) {
525 f_cContent.assign(l_pXmlNode.GetContent());
527 l_eStatus = eFrameworkunifiedStatusFail;
530 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
534 ////////////////////////////////////////////////////////////////////////////////////////////////
536 /// Adds sub node to the current node
537 ////////////////////////////////////////////////////////////////////////////////////////////////
538 CXmlNode CXmlNode::AddChildNode(std::string f_cNodeName, std::string f_cText) {
539 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
541 // pointer of child node
542 xmlNodePtr l_pChildNode = NULL;
544 // content of child node
545 xmlChar *l_cNodeContent = NULL;
547 // validate the node name
548 if (NULL != m_pXmlNodePtr && 0 < f_cNodeName.length()) {
549 if (0 < f_cText.length()) {
550 xmlChar* p_text = reinterpret_cast<xmlChar*>(const_cast<char*>(f_cText.c_str()));
551 l_cNodeContent = p_text;
554 if (NULL == (l_pChildNode = xmlNewDocNode(m_pXmlNodePtr->doc,
556 (const xmlChar *)f_cNodeName.c_str(),
558 FRAMEWORKUNIFIEDLOG(ZONE_NS_ERR, __FUNCTION__, "Error creating child node");
560 l_pChildNode->type = XML_ELEMENT_NODE;
561 l_pChildNode->parent = m_pXmlNodePtr;
562 l_pChildNode->doc = m_pXmlNodePtr->doc;
564 // if there is no other child to the parent
565 if (m_pXmlNodePtr->children == NULL) {
566 m_pXmlNodePtr->children = l_pChildNode;
567 m_pXmlNodePtr->last = l_pChildNode;
568 } else { // else add the new child to the end of children list
570 xmlNodePtr l_pTempNode = m_pXmlNodePtr->last;
571 l_pTempNode->next = l_pChildNode;
572 l_pChildNode->prev = l_pTempNode;
574 m_pXmlNodePtr->last = l_pChildNode;
579 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
580 return CXmlNode(l_pChildNode);
583 ////////////////////////////////////////////////////////////////////////////////////////////////
585 /// Adds new node as sibling to the current node
586 ////////////////////////////////////////////////////////////////////////////////////////////////
587 CXmlNode CXmlNode::AddSiblingNode(std::string f_cNodeName, std::string f_cText) {
588 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
590 xmlNodePtr l_pNewNode = NULL;
591 xmlNodePtr l_pSiblingNode = NULL;
593 if (NULL != m_pXmlNodePtr &&
594 !this->Parent().IsNull()) { // check whether the node is root node
595 if (NULL != (l_pNewNode = xmlNewNode(NULL,
596 (const xmlChar *)f_cNodeName.c_str()))) {
597 if (0 < f_cText.length()) {
598 xmlChar* p_text = reinterpret_cast<xmlChar*>(const_cast<char*>(f_cText.c_str()));
599 xmlNodeSetContent(l_pNewNode, p_text);
602 l_pSiblingNode = xmlAddSibling(m_pXmlNodePtr,
607 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
608 return CXmlNode(l_pSiblingNode);
611 ////////////////////////////////////////////////////////////////////////////////////////////////
613 /// Removes the child node from current node
614 ////////////////////////////////////////////////////////////////////////////////////////////////
615 EFrameworkunifiedStatus CXmlNode::RemoveChildNode(std::string f_cNodeName) {
616 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
617 EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK;
619 CXmlNode l_pXmlNode = FindChildNode(f_cNodeName);
620 if (!l_pXmlNode.IsNull()) {
621 xmlUnlinkNode(l_pXmlNode.m_pXmlNodePtr);
622 xmlFreeNode(l_pXmlNode.m_pXmlNodePtr);
624 l_eStatus = eFrameworkunifiedStatusNullPointer;
627 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");
631 ////////////////////////////////////////////////////////////////////////////////////////////////
633 /// Clears the contents, attributes of node
634 ////////////////////////////////////////////////////////////////////////////////////////////////
635 EFrameworkunifiedStatus CXmlNode::ClearNode() {
636 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+");
637 EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK;
639 if (NULL != m_pXmlNodePtr) {
640 for (xmlNodePtr l_pXmlNode = m_pXmlNodePtr->children;
642 l_pXmlNode = m_pXmlNodePtr->children) {
643 xmlUnlinkNode(l_pXmlNode);
644 xmlFreeNode(l_pXmlNode);
647 for (xmlAttrPtr l_pXmlAttr = m_pXmlNodePtr->properties;
649 l_pXmlAttr = m_pXmlNodePtr->properties) {
650 xmlRemoveProp(l_pXmlAttr);
653 l_eStatus = eFrameworkunifiedStatusNullPointer;
656 FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-");