cmWIXPatch.cxx 2.3 KB

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