namespace hybrid {
namespace pkgmgr {
-bool StepMergeXml::LoadXmlDocument(const bf::path& wgt_xml_path,
- const bf::path& tpk_xml_path) {
+xmlDocPtr StepMergeXml::LoadXmlDocument(const bf::path& xml_path) {
// trim blanks
int keep_blanks = xmlKeepBlanksDefault(0);
- wgt_doc_ = xmlParseFile(wgt_xml_path.string().c_str());
- if (!wgt_doc_) {
- LOG(ERROR) << "Failed to parse file: " << wgt_xml_path;
+ xmlDocPtr doc_ptr = xmlParseFile(xml_path.string().c_str());
+ if (!doc_ptr) {
+ LOG(ERROR) << "Failed to parse file: " << xml_path;
xmlKeepBlanksDefault(keep_blanks);
- return false;
- }
- tpk_doc_ = xmlParseFile(tpk_xml_path.string().c_str());
- if (!tpk_doc_) {
- LOG(ERROR) << "Failed to parse file: " << tpk_xml_path;
- xmlKeepBlanksDefault(keep_blanks);
- return false;
+ return nullptr;
}
xmlKeepBlanksDefault(keep_blanks);
- return true;
+ return doc_ptr;
}
xmlNodePtr StepMergeXml::GetXmlNode(const xmlDocPtr doc,
reinterpret_cast<const xmlChar*>(attr_val.c_str()));
}
-bool StepMergeXml::SetTpkPrivilegeType() {
- xmlXPathContextPtr xpath_ctx = xmlXPathNewContext(tpk_doc_);
+bool StepMergeXml::SetTpkPrivilegeType(xmlDocPtr tpk_doc) {
+ xmlXPathContextPtr xpath_ctx = xmlXPathNewContext(tpk_doc);
if (!xpath_ctx) {
LOG(ERROR) << "Failed to create XPath context";
return false;
bf::path wgt_xml_path = context_->xml_path.get();
bf::path tpk_xml_path = context_->GetPkgPath() / "tizen-manifest.xml";
- if (!LoadXmlDocument(wgt_xml_path, tpk_xml_path))
+ xmlDocPtr wgt_doc = LoadXmlDocument(wgt_xml_path);
+ if (wgt_doc == nullptr)
return Step::Status::MANIFEST_ERROR;
- if (!SetTpkPrivilegeType())
+ auto wgt_doc_ptr = std::unique_ptr<std::remove_pointer<xmlDocPtr>::type,
+ decltype(xmlFreeDoc)*>(wgt_doc, xmlFreeDoc);
+
+ xmlDocPtr tpk_doc = LoadXmlDocument(tpk_xml_path);
+ if (tpk_doc == nullptr)
+ return Step::Status::MANIFEST_ERROR;
+
+ auto tpk_doc_ptr = std::unique_ptr<std::remove_pointer<xmlDocPtr>::type,
+ decltype(xmlFreeDoc)*>(tpk_doc, xmlFreeDoc);
+
+ if (!SetTpkPrivilegeType(tpk_doc))
return Step::Status::MANIFEST_ERROR;
for (auto& entry : kNeedMergeNodes) {
- xmlNodePtr tpk_node = GetXmlNode(tpk_doc_, entry);
+ xmlNodePtr tpk_node = GetXmlNode(tpk_doc, entry);
if (tpk_node == nullptr)
continue;
// TODO(s89.jang): If cannot find node from wgt doc, merge tpk node itself
// instead of merging its child nodes.
- xmlNodePtr wgt_node = GetXmlNode(wgt_doc_, entry);
+ xmlNodePtr wgt_node = GetXmlNode(wgt_doc, entry);
MergeXmlNode(wgt_node, tpk_node);
}
LOG(WARNING) << "Cannot find component type!";
continue;
}
- xmlNodePtr node = GetXmlNode(wgt_doc_, (*r).first, "appid", app->appid);
+ xmlNodePtr node = GetXmlNode(wgt_doc, (*r).first, "appid", app->appid);
SetXmlNodeAttribute(node, "exec", app->exec);
}
- if (xmlSaveFormatFile(wgt_xml_path.string().c_str(), wgt_doc_, 1) == -1) {
+ if (xmlSaveFormatFile(wgt_xml_path.string().c_str(), wgt_doc, 1) == -1) {
LOG(ERROR) << "Cannot write xml file";
return Step::Status::MANIFEST_ERROR;
}
public:
using Step::Step;
explicit StepMergeXml(common_installer::InstallerContext* context)
- : Step(context), wgt_doc_(nullptr), tpk_doc_(nullptr) {}
+ : Step(context) {}
Status process() override;
Status clean() override { return Status::OK; }
Status undo() override { return Status::OK; }
Status precheck() override;
private:
- bool LoadXmlDocument(const boost::filesystem::path& wgt_xml_path,
- const boost::filesystem::path& tpk_xml_path);
+ xmlDocPtr LoadXmlDocument(const boost::filesystem::path& xml_path);
xmlNodePtr GetXmlNode(const xmlDocPtr doc, const std::string& name,
const std::string& attr = {}, const std::string& attr_val = {});
void MergeXmlNode(xmlNodePtr node1, xmlNodePtr node2);
void SetXmlNodeAttribute(xmlNodePtr node, const std::string& attr,
const std::string& attr_val);
- bool SetTpkPrivilegeType();
-
- xmlDocPtr wgt_doc_;
- xmlDocPtr tpk_doc_;
+ bool SetTpkPrivilegeType(xmlDocPtr tpk_doc);
STEP_NAME(MergeXml);
};