Fix making xmlDocPtr for tag plugin 32/214832/5
authorIlho Kim <ilho159.kim@samsung.com>
Fri, 27 Sep 2019 02:04:28 +0000 (11:04 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Fri, 27 Sep 2019 05:45:09 +0000 (14:45 +0900)
Check all depth's tags and make only necessary information to plugin

Change-Id: I644c045e1d4fef1300b75cb9dd2609db52b01c04
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
src/common/plugins/types/tag_plugin.cc

index 558d303..4c6f0b3 100644 (file)
@@ -53,6 +53,25 @@ std::string TagPlugin::GetFunctionName(ProcessType process,
   return pos->second;
 }
 
+xmlNodePtr MakePluginNode(xmlNodePtr node, const std::string& tag_name) {
+    xmlNodePtr ret_node = nullptr;
+    if (tag_name == reinterpret_cast<const char*>(node->name)) {
+        ret_node = xmlCopyNode(node, 1);
+        return ret_node;
+    }
+
+    for (xmlNodePtr child = xmlFirstElementChild(node);
+        child != nullptr; child = xmlNextElementSibling(child)) {
+      xmlNodePtr child_node = MakePluginNode(child, tag_name);
+      if (!child_node)
+        continue;
+      if (!ret_node)
+        ret_node = xmlCopyNode(node, 0);
+      xmlAddChild(ret_node, child_node);
+    }
+    return ret_node;
+}
+
 xmlDocPtr TagPlugin::CreateDocPtrForPlugin(xmlDocPtr doc_ptr,
     const std::string& tag_name) const {
   // Make copy of document and root node
@@ -62,16 +81,12 @@ xmlDocPtr TagPlugin::CreateDocPtrForPlugin(xmlDocPtr doc_ptr,
     return nullptr;
   }
   xmlDocPtr plugin_doc_ptr = xmlCopyDoc(doc_ptr, 0);
-  xmlNodePtr plugin_root_node = xmlCopyNode(root_node, 0);
-  xmlDocSetRootElement(plugin_doc_ptr, plugin_root_node);
-
-  // Append elements that matches the tag name to new doc
-  for (xmlNodePtr child = xmlFirstElementChild(root_node);
-       child != nullptr; child = xmlNextElementSibling(child)) {
-    if (tag_name == reinterpret_cast<const char*>(child->name)) {
-      xmlAddChild(plugin_root_node, xmlCopyNode(child, 1));
-    }
+  xmlNodePtr plugin_root_node = MakePluginNode(root_node, tag_name);
+  if (!plugin_root_node) {
+    LOG(ERROR) << "make plugin node fail";
+    return nullptr;
   }
+  xmlDocSetRootElement(plugin_doc_ptr, plugin_root_node);
   xmlSetTreeDoc(plugin_root_node, plugin_doc_ptr);
   return plugin_doc_ptr;
 }