File: XMLWriter.h

package info (click to toggle)
0ad 0.0.26-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 130,460 kB
  • sloc: cpp: 261,824; ansic: 198,392; javascript: 19,067; python: 14,557; sh: 7,629; perl: 4,072; xml: 849; makefile: 741; java: 533; ruby: 229; php: 190; pascal: 30; sql: 21; tcl: 4
file content (126 lines) | stat: -rw-r--r-- 3,554 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* Copyright (C) 2021 Wildfire Games.
 * This file is part of 0 A.D.
 *
 * 0 A.D. is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * 0 A.D. is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef INCLUDED_XMLWRITER
#define INCLUDED_XMLWRITER

/*
 *
 *System for writing simple XML files, with human-readable formatting.
 *
 *Example usage:
 *
 *	XMLWriter_File exampleFile;
 *	{
 *		XMLWriter_Element scenarioTag (exampleFile,"Scenario");
 *		{
 *			XMLWriter_Element entitiesTag (exampleFile,"Entities");
 *			for (...)
 *			{
 *				XMLWriter_Element entityTag (exampleFile,"Entity");
 *				{
 *					XMLWriter_Element templateTag (exampleFile,"Template");
 *					templateTag.Text(entity.name);
 *				}
 *				// Or equivalently:
 *				templateTag.Setting("Template", entity.name);
 *				{
 *					XMLWriter_Element positionTag (exampleFile,"Position");
 *					positionTag.Attribute("x", entity.x);
 *					positionTag.Attribute("y", entity.y);
 *					positionTag.Attribute("z", entity.z);
 *				}
 *				{
 *					XMLWriter_Element orientationTag (exampleFile,"Orientation");
 *					orientationTag.Attribute("angle", entity.angle);
 *				}
 *			}
 *		}
 *	}
 *	exampleFile.StoreVFS(g_VFS, "/test.xml");
 *
 *	In general, "{ XML_Element(name); ... }" means "<name> ... </name>" -- the
 *	scoping braces are important to indicate where an element ends. If you don't put
 *	them the tag won't be closed until the object's destructor is called, usually
 *	when it goes out of scope.
 *	xml_element_.Attribute/xml_element_.Setting are templated. To support more types, alter the
 *	end of XMLWriter.cpp.
 */

#include "lib/file/vfs/vfs.h"
#include "ps/CStr.h"

class XMBElement;
class XMBData;
class XMLWriter_Element;

class XMLWriter_File
{
public:
	XMLWriter_File();

	void SetPrettyPrint(bool enabled) { m_PrettyPrint = enabled; }

	void Comment(const char* text);

	void XMB(const XMBData& xmb);

	bool StoreVFS(const PIVFS& vfs, const VfsPath& pathname);
	const CStr8& GetOutput();

private:

	friend class XMLWriter_Element;

	void ElementXMB(const XMBData& xmb, XMBElement el);

	void ElementStart(XMLWriter_Element* element, const char* name);
	void ElementText(const char* text, bool cdata);
	template <typename T> void ElementAttribute(const char* name, const T& value, bool newelement);
	void ElementClose();
	void ElementEnd(const char* name, int type);

	CStr8 Indent();

	bool m_PrettyPrint;

	CStr m_Data;
	int m_Indent;
	XMLWriter_Element* m_LastElement;
};

class XMLWriter_Element
{
public:
	XMLWriter_Element(XMLWriter_File& file, const char* name);
	~XMLWriter_Element();

	template <typename constCharPtr> void Text(constCharPtr text, bool cdata);
	template <typename T> void Attribute(const char* name, T value) { m_File->ElementAttribute(name, value, false); }
	template <typename T> void Setting(const char* name, T value) { m_File->ElementAttribute(name, value, true); }
	void Close(int type);

private:

	friend class XMLWriter_File;

	XMLWriter_File* m_File;
	CStr m_Name;
	int m_Type;
};

#endif // INCLUDED_XMLWRITER