2 Copyright (C) 2001-2006, William Joseph.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #if !defined(INCLUDED_XML_XMLWRITER_H)
23 #define INCLUDED_XML_XMLWRITER_H
29 class BufferedTextOutputStream : public TextOutputStream
31 static const int m_bufsize = 1024;
32 TextOutputStream& m_ostream;
33 char m_buffer[m_bufsize];
37 const char* end() const
47 m_ostream.write(m_buffer, m_pos - m_buffer);
51 BufferedTextOutputStream(TextOutputStream& ostream) : m_ostream(ostream), m_pos(m_buffer), m_end(m_buffer+m_bufsize)
54 ~BufferedTextOutputStream()
58 void write(const char c)
66 std::size_t write(const char* buffer, std::size_t length)
68 const char*const end = buffer + length;
69 for(const char* p = buffer; p != end; ++p)
77 class XMLEntityOutputStream
79 BufferedTextOutputStream m_ostream;
81 XMLEntityOutputStream(TextOutputStream& ostream)
85 void write(const char c)
89 void writeEscaped(const char c)
125 std::size_t write(const char* buffer, std::size_t length)
127 const char*const end = buffer + length;
128 for(const char* p = buffer; p != end; ++p)
137 inline XMLEntityOutputStream& operator<<(XMLEntityOutputStream& ostream, const T& t)
139 return ostream_write(ostream, t);
143 class XMLStreamWriter : public XMLImporter, public XMLAttrVisitor
154 : m_state(eStartElement)
159 XMLEntityOutputStream m_ostream;
160 std::vector<state_t> m_elements;
162 void write_cdata(const char* buffer, std::size_t length)
164 m_ostream << ConvertLocaleToUTF8(StringRange(buffer, buffer + length));
166 void write_string(const char* string)
170 void write_quoted_string(const char* string)
172 m_ostream.write('"');
174 m_ostream.write('"');
177 XMLStreamWriter(TextOutputStream& ostream)
180 m_elements.push_back(state_t());
181 m_elements.back().m_state = state_t::eContent;
182 m_ostream.write('<');
183 m_ostream.write('?');
185 visit("version", "1.0");
186 m_ostream.write('?');
187 m_ostream.write('>');
190 void pushElement(const XMLElement& element)
192 if(m_elements.back().m_state == state_t::eStartElement)
194 m_elements.back().m_state = state_t::eContent;
195 m_ostream.write('>');
198 m_elements.push_back(state_t());
200 m_ostream.write('<');
201 write_string(element.name());
202 element.forEachAttribute(*this);
204 void popElement(const char* name)
206 if(m_elements.back().m_state == state_t::eStartElement)
208 m_ostream.write('/');
209 m_ostream.write('>');
213 m_ostream.write('<');
214 m_ostream.write('/');
216 m_ostream.write('>');
219 std::size_t write(const char* data, std::size_t length)
221 if(m_elements.back().m_state == state_t::eStartElement)
223 m_elements.back().m_state = state_t::eContent;
224 m_ostream.write('>');
226 write_cdata(data, length);
230 void visit(const char* name, const char* value)
232 m_ostream.write(' ');
234 m_ostream.write('=');
235 write_quoted_string(value);