summaryrefslogtreecommitdiffstats
path: root/Source/cmXMLWriter.h
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2015-05-28 13:56:53 (GMT)
committerCMake Topic Stage <kwrobot@kitware.com>2015-05-28 13:56:53 (GMT)
commit0c24c2311b3e98d21cc70bb2e62681c071fa03b4 (patch)
tree20c77d874cc8838c42a3141ec5541912a9c1b789 /Source/cmXMLWriter.h
parenta2312986af0356854d7cf9eac1d45f9d957abf72 (diff)
parentde2ef3053c37d0a958a92f8d763168d5b4e5dc17 (diff)
downloadCMake-0c24c2311b3e98d21cc70bb2e62681c071fa03b4.zip
CMake-0c24c2311b3e98d21cc70bb2e62681c071fa03b4.tar.gz
CMake-0c24c2311b3e98d21cc70bb2e62681c071fa03b4.tar.bz2
Merge topic 'ctest-xml-refactor'
de2ef305 cmCTest: Drop unused method overloads b04500a7 cmCTest{Test,MemCheck}Handler: Port to cmXMLWriter 8fbc509a cmCTestCoverageHandler: Port to cmXMLWriter 82455a9d cmCTestBuildHandler: Port to cmXMLWriter 1dbd86fd cmCTestLaunch: Port to cmXMLWriter a53bd63e cmCTest: Port GenerateNotesFile to cmXMLWriter 9c0bb7d8 cmCTestConfigureHandler: Port to cmXMLWriter 6cf5cc71 cmCTestUploadHandler: Port to cmXMLWriter ed42c203 cmCTestUpdateHandler: Port to cmXMLWriter 18825baf cmCTest: Port to cmXMLWriter f6413400 Add cmXMLWriter class to consolidate XML generation
Diffstat (limited to 'Source/cmXMLWriter.h')
-rw-r--r--Source/cmXMLWriter.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/Source/cmXMLWriter.h b/Source/cmXMLWriter.h
new file mode 100644
index 0000000..c38c0de
--- /dev/null
+++ b/Source/cmXMLWriter.h
@@ -0,0 +1,120 @@
+/*============================================================================
+ CMake - Cross Platform Makefile Generator
+ Copyright 2015 Daniel Pfeifer <daniel@pfeifer-mail.de>
+
+ Distributed under the OSI-approved BSD License (the "License");
+ see accompanying file Copyright.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the License for more information.
+============================================================================*/
+#ifndef cmXMLWiter_h
+#define cmXMLWiter_h
+
+#include "cmStandardIncludes.h"
+#include "cmXMLSafe.h"
+
+#include <ostream>
+#include <stack>
+#include <string>
+#include <vector>
+
+class cmXMLWriter
+{
+public:
+ cmXMLWriter(std::ostream& output, std::size_t level = 0);
+ ~cmXMLWriter();
+
+ void StartDocument(const char* encoding = "UTF-8");
+ void EndDocument();
+
+ void StartElement(std::string const& name);
+ void EndElement();
+
+ void BreakAttributes();
+
+ template <typename T>
+ void Attribute(const char* name, T const& value)
+ {
+ this->PreAttribute();
+ this->Output << name << "=\"" << SafeAttribute(value) << '"';
+ }
+
+ template <typename T>
+ void Element(std::string const& name, T const& value)
+ {
+ this->StartElement(name);
+ this->Content(value);
+ this->EndElement();
+ }
+
+ template <typename T>
+ void Content(T const& content)
+ {
+ this->PreContent();
+ this->Output << SafeContent(content);
+ }
+
+ void Comment(const char* comment);
+
+ void CData(std::string const& data);
+
+ void ProcessingInstruction(const char* target, const char* data);
+
+ void FragmentFile(const char* fname);
+
+private:
+ cmXMLWriter(const cmXMLWriter&);
+ cmXMLWriter& operator=(const cmXMLWriter&);
+
+ void ConditionalLineBreak(bool condition, std::size_t indent);
+
+ void PreAttribute();
+ void PreContent();
+
+ void CloseStartElement();
+
+private:
+ static cmXMLSafe SafeAttribute(const char* value)
+ {
+ return cmXMLSafe(value);
+ }
+
+ static cmXMLSafe SafeAttribute(std::string const& value)
+ {
+ return cmXMLSafe(value);
+ }
+
+ template <typename T>
+ static T SafeAttribute(T value)
+ {
+ return value;
+ }
+
+ static cmXMLSafe SafeContent(const char* value)
+ {
+ return cmXMLSafe(value).Quotes(false);
+ }
+
+ static cmXMLSafe SafeContent(std::string const& value)
+ {
+ return cmXMLSafe(value).Quotes(false);
+ }
+
+ template <typename T>
+ static T SafeContent(T value)
+ {
+ return value;
+ }
+
+private:
+ std::ostream& Output;
+ std::stack<std::string, std::vector<std::string> > Elements;
+ std::size_t Level;
+ bool ElementOpen;
+ bool BreakAttrib;
+ bool IsContent;
+};
+
+#endif