| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmWIXPatch.h" |
| |
| #include <CPack/cmCPackGenerator.h> |
| |
| cmWIXPatch::cmWIXPatch(cmCPackLog* logger) |
| : Logger(logger) |
| { |
| } |
| |
| bool cmWIXPatch::LoadFragments(std::string const& patchFilePath) |
| { |
| cmWIXPatchParser parser(Fragments, Logger); |
| if (!parser.ParseFile(patchFilePath.c_str())) { |
| cmCPackLogger(cmCPackLog::LOG_ERROR, "Failed parsing XML patch file: '" |
| << patchFilePath << "'" << std::endl); |
| return false; |
| } |
| |
| return true; |
| } |
| |
| void cmWIXPatch::ApplyFragment(std::string const& id, |
| cmWIXSourceWriter& writer) |
| { |
| cmWIXPatchParser::fragment_map_t::iterator i = Fragments.find(id); |
| if (i == Fragments.end()) |
| return; |
| |
| const cmWIXPatchElement& fragment = i->second; |
| |
| this->ApplyElementChildren(fragment, writer); |
| |
| Fragments.erase(i); |
| } |
| |
| void cmWIXPatch::ApplyElementChildren(const cmWIXPatchElement& element, |
| cmWIXSourceWriter& writer) |
| { |
| for (cmWIXPatchElement::child_list_t::const_iterator j = |
| element.children.begin(); |
| j != element.children.end(); ++j) { |
| cmWIXPatchNode* node = *j; |
| |
| switch (node->type()) { |
| case cmWIXPatchNode::ELEMENT: |
| ApplyElement(dynamic_cast<const cmWIXPatchElement&>(*node), writer); |
| break; |
| case cmWIXPatchNode::TEXT: |
| writer.AddTextNode(dynamic_cast<const cmWIXPatchText&>(*node).text); |
| break; |
| } |
| } |
| } |
| |
| void cmWIXPatch::ApplyElement(const cmWIXPatchElement& element, |
| cmWIXSourceWriter& writer) |
| { |
| writer.BeginElement(element.name); |
| |
| for (cmWIXPatchElement::attributes_t::const_iterator i = |
| element.attributes.begin(); |
| i != element.attributes.end(); ++i) { |
| writer.AddAttribute(i->first, i->second); |
| } |
| |
| this->ApplyElementChildren(element, writer); |
| |
| writer.EndElement(element.name); |
| } |
| |
| bool cmWIXPatch::CheckForUnappliedFragments() |
| { |
| std::string fragmentList; |
| for (cmWIXPatchParser::fragment_map_t::const_iterator i = Fragments.begin(); |
| i != Fragments.end(); ++i) { |
| if (!fragmentList.empty()) { |
| fragmentList += ", "; |
| } |
| |
| fragmentList += "'"; |
| fragmentList += i->first; |
| fragmentList += "'"; |
| } |
| |
| if (!fragmentList.empty()) { |
| cmCPackLogger(cmCPackLog::LOG_ERROR, |
| "Some XML patch fragments did not have matching IDs: " |
| << fragmentList << std::endl); |
| return false; |
| } |
| |
| return true; |
| } |