cmWIXPatch.cxx 2.5 KB

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