cmWIXPatch.cxx 2.8 KB

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