cmWIXPatch.cxx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmWIXPatch.h"
  4. #include "cmCPackGenerator.h"
  5. cmWIXPatch::cmWIXPatch(cmCPackLog* logger)
  6. : Logger(logger)
  7. {
  8. }
  9. bool cmWIXPatch::LoadFragments(std::string const& patchFilePath)
  10. {
  11. cmWIXPatchParser parser(Fragments, Logger);
  12. if (!parser.ParseFile(patchFilePath.c_str())) {
  13. cmCPackLogger(cmCPackLog::LOG_ERROR,
  14. "Failed parsing XML patch file: '" << patchFilePath << "'"
  15. << std::endl);
  16. return false;
  17. }
  18. return true;
  19. }
  20. void cmWIXPatch::ApplyFragment(std::string const& id,
  21. cmWIXSourceWriter& writer)
  22. {
  23. cmWIXPatchParser::fragment_map_t::iterator i = Fragments.find(id);
  24. if (i == Fragments.end())
  25. return;
  26. const cmWIXPatchElement& fragment = i->second;
  27. for (auto const& attr : fragment.attributes) {
  28. writer.AddAttribute(attr.first, attr.second);
  29. }
  30. this->ApplyElementChildren(fragment, writer);
  31. Fragments.erase(i);
  32. }
  33. void cmWIXPatch::ApplyElementChildren(const cmWIXPatchElement& element,
  34. cmWIXSourceWriter& writer)
  35. {
  36. for (const auto& node : element.children) {
  37. switch (node->type()) {
  38. case cmWIXPatchNode::ELEMENT:
  39. ApplyElement(dynamic_cast<const cmWIXPatchElement&>(*node), writer);
  40. break;
  41. case cmWIXPatchNode::TEXT:
  42. writer.AddTextNode(dynamic_cast<const cmWIXPatchText&>(*node).text);
  43. break;
  44. }
  45. }
  46. }
  47. void cmWIXPatch::ApplyElement(const cmWIXPatchElement& element,
  48. cmWIXSourceWriter& writer)
  49. {
  50. writer.BeginElement(element.name);
  51. for (auto const& attr : element.attributes) {
  52. writer.AddAttribute(attr.first, attr.second);
  53. }
  54. this->ApplyElementChildren(element, writer);
  55. writer.EndElement(element.name);
  56. }
  57. bool cmWIXPatch::CheckForUnappliedFragments()
  58. {
  59. std::string fragmentList;
  60. for (auto const& fragment : Fragments) {
  61. if (!fragmentList.empty()) {
  62. fragmentList += ", ";
  63. }
  64. fragmentList += "'";
  65. fragmentList += fragment.first;
  66. fragmentList += "'";
  67. }
  68. if (!fragmentList.empty()) {
  69. cmCPackLogger(cmCPackLog::LOG_ERROR,
  70. "Some XML patch fragments did not have matching IDs: "
  71. << fragmentList << std::endl);
  72. return false;
  73. }
  74. return true;
  75. }