cmWIXPatch.cxx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*============================================================================
  2. CMake - Cross Platform Makefile Generator
  3. Copyright 2014 Kitware, Inc., Insight Software Consortium
  4. Distributed under the OSI-approved BSD License (the "License");
  5. see accompanying file Copyright.txt for details.
  6. This software is distributed WITHOUT ANY WARRANTY; without even the
  7. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8. See the License for more information.
  9. ============================================================================*/
  10. #include "cmWIXPatch.h"
  11. #include <CPack/cmCPackGenerator.h>
  12. cmWIXPatch::cmWIXPatch(cmCPackLog* logger)
  13. : Logger(logger)
  14. {
  15. }
  16. bool cmWIXPatch::LoadFragments(std::string const& patchFilePath)
  17. {
  18. cmWIXPatchParser parser(Fragments, Logger);
  19. if (!parser.ParseFile(patchFilePath.c_str())) {
  20. cmCPackLogger(cmCPackLog::LOG_ERROR, "Failed parsing XML patch file: '"
  21. << patchFilePath << "'" << std::endl);
  22. return false;
  23. }
  24. return true;
  25. }
  26. void cmWIXPatch::ApplyFragment(std::string const& id,
  27. cmWIXSourceWriter& writer)
  28. {
  29. cmWIXPatchParser::fragment_map_t::iterator i = Fragments.find(id);
  30. if (i == Fragments.end())
  31. return;
  32. const cmWIXPatchElement& fragment = i->second;
  33. this->ApplyElementChildren(fragment, writer);
  34. Fragments.erase(i);
  35. }
  36. void cmWIXPatch::ApplyElementChildren(const cmWIXPatchElement& element,
  37. cmWIXSourceWriter& writer)
  38. {
  39. for (cmWIXPatchElement::child_list_t::const_iterator j =
  40. element.children.begin();
  41. j != element.children.end(); ++j) {
  42. cmWIXPatchNode* node = *j;
  43. switch (node->type()) {
  44. case cmWIXPatchNode::ELEMENT:
  45. ApplyElement(dynamic_cast<const cmWIXPatchElement&>(*node), writer);
  46. break;
  47. case cmWIXPatchNode::TEXT:
  48. writer.AddTextNode(dynamic_cast<const cmWIXPatchText&>(*node).text);
  49. break;
  50. }
  51. }
  52. }
  53. void cmWIXPatch::ApplyElement(const cmWIXPatchElement& element,
  54. cmWIXSourceWriter& writer)
  55. {
  56. writer.BeginElement(element.name);
  57. for (cmWIXPatchElement::attributes_t::const_iterator i =
  58. element.attributes.begin();
  59. i != element.attributes.end(); ++i) {
  60. writer.AddAttribute(i->first, i->second);
  61. }
  62. this->ApplyElementChildren(element, writer);
  63. writer.EndElement(element.name);
  64. }
  65. bool cmWIXPatch::CheckForUnappliedFragments()
  66. {
  67. std::string fragmentList;
  68. for (cmWIXPatchParser::fragment_map_t::const_iterator i = Fragments.begin();
  69. i != Fragments.end(); ++i) {
  70. if (!fragmentList.empty()) {
  71. fragmentList += ", ";
  72. }
  73. fragmentList += "'";
  74. fragmentList += i->first;
  75. fragmentList += "'";
  76. }
  77. if (!fragmentList.empty()) {
  78. cmCPackLogger(cmCPackLog::LOG_ERROR,
  79. "Some XML patch fragments did not have matching IDs: "
  80. << fragmentList << std::endl);
  81. return false;
  82. }
  83. return true;
  84. }