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