cmWIXPatch.cxx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. auto i = Fragments.find(id);
  24. if (i == Fragments.end()) {
  25. return;
  26. }
  27. const cmWIXPatchElement& fragment = i->second;
  28. for (auto const& attr : fragment.attributes) {
  29. writer.AddAttribute(attr.first, attr.second);
  30. }
  31. this->ApplyElementChildren(fragment, writer);
  32. Fragments.erase(i);
  33. }
  34. void cmWIXPatch::ApplyElementChildren(const cmWIXPatchElement& element,
  35. cmWIXSourceWriter& writer)
  36. {
  37. for (const auto& node : element.children) {
  38. switch (node->type()) {
  39. case cmWIXPatchNode::ELEMENT:
  40. ApplyElement(dynamic_cast<const cmWIXPatchElement&>(*node), writer);
  41. break;
  42. case cmWIXPatchNode::TEXT:
  43. writer.AddTextNode(dynamic_cast<const cmWIXPatchText&>(*node).text);
  44. break;
  45. }
  46. }
  47. }
  48. void cmWIXPatch::ApplyElement(const cmWIXPatchElement& element,
  49. cmWIXSourceWriter& writer)
  50. {
  51. writer.BeginElement(element.name);
  52. for (auto const& attr : element.attributes) {
  53. writer.AddAttribute(attr.first, attr.second);
  54. }
  55. this->ApplyElementChildren(element, writer);
  56. writer.EndElement(element.name);
  57. }
  58. bool cmWIXPatch::CheckForUnappliedFragments()
  59. {
  60. std::string fragmentList;
  61. for (auto const& fragment : Fragments) {
  62. if (!fragmentList.empty()) {
  63. fragmentList += ", ";
  64. }
  65. fragmentList += '\'';
  66. fragmentList += fragment.first;
  67. fragmentList += '\'';
  68. }
  69. if (!fragmentList.empty()) {
  70. cmCPackLogger(cmCPackLog::LOG_ERROR,
  71. "Some XML patch fragments did not have matching IDs: "
  72. << fragmentList << std::endl);
  73. return false;
  74. }
  75. return true;
  76. }