1#ifndef _XEXMLWRITER_HPP 2#define _XEXMLWRITER_HPP 3/*------------------------------------------------------------------------- 4 * drawElements Quality Program Test Executor 5 * ------------------------------------------ 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief XML Writer. 24 *//*--------------------------------------------------------------------*/ 25 26#include "xeDefs.hpp" 27 28#include <ostream> 29#include <vector> 30#include <string> 31#include <streambuf> 32 33namespace xe 34{ 35namespace xml 36{ 37 38class EscapeStreambuf : public std::streambuf 39{ 40public: 41 EscapeStreambuf (std::ostream& dst) : m_dst(dst) {} 42 43protected: 44 std::streamsize xsputn (const char* s, std::streamsize count); 45 int overflow (int ch = -1); 46 47private: 48 std::ostream& m_dst; 49}; 50 51class Writer 52{ 53public: 54 struct BeginElement 55 { 56 std::string element; 57 BeginElement (const char* element_) : element(element_) {} 58 }; 59 60 struct Attribute 61 { 62 std::string name; 63 std::string value; 64 Attribute (const char* name_, const char* value_) : name(name_), value(value_) {} 65 Attribute (const char* name_, const std::string& value_) : name(name_), value(value_) {} 66 Attribute (const std::string& name_, const std::string& value_) : name(name_), value(value_) {} 67 }; 68 69 static const struct EndElementType {} EndElement; 70 71 Writer (std::ostream& dst); 72 ~Writer (void); 73 74 Writer& operator<< (const BeginElement& begin); 75 Writer& operator<< (const Attribute& attribute); 76 Writer& operator<< (const EndElementType& end); 77 78 template <typename T> 79 Writer& operator<< (const T& value); //!< Write data. 80 81private: 82 Writer (const Writer& other); 83 Writer& operator= (const Writer& other); 84 85 enum State 86 { 87 STATE_DATA = 0, 88 STATE_ELEMENT, 89 STATE_ELEMENT_END, 90 91 STATE_LAST 92 }; 93 94 std::ostream& m_rawDst; 95 EscapeStreambuf m_dataBuf; 96 std::ostream m_dataStr; 97 State m_state; 98 std::vector<std::string> m_elementStack; 99}; 100 101template <typename T> 102Writer& Writer::operator<< (const T& value) 103{ 104 if (m_state == STATE_ELEMENT) 105 m_rawDst << ">"; 106 107 m_dataStr << value; 108 m_state = STATE_DATA; 109 110 return *this; 111} 112 113} // xml 114} // xe 115 116#endif // _XEXMLWRITER_HPP 117