1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2006 The Android Open Source Project 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SkXMLWriter_DEFINED 9cb93a386Sopenharmony_ci#define SkXMLWriter_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkString.h" 12cb93a386Sopenharmony_ci#include "include/private/SkTDArray.h" 13cb93a386Sopenharmony_ci#include "src/xml/SkDOM.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ciclass SkWStream; 16cb93a386Sopenharmony_ciclass SkXMLParser; 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ciclass SkXMLWriter { 19cb93a386Sopenharmony_cipublic: 20cb93a386Sopenharmony_ci SkXMLWriter(bool doEscapeMarkup = true); 21cb93a386Sopenharmony_ci virtual ~SkXMLWriter(); 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci void addS32Attribute(const char name[], int32_t value); 24cb93a386Sopenharmony_ci void addAttribute(const char name[], const char value[]); 25cb93a386Sopenharmony_ci void addAttributeLen(const char name[], const char value[], size_t length); 26cb93a386Sopenharmony_ci void addHexAttribute(const char name[], uint32_t value, int minDigits = 0); 27cb93a386Sopenharmony_ci void addScalarAttribute(const char name[], SkScalar value); 28cb93a386Sopenharmony_ci void addText(const char text[], size_t length); 29cb93a386Sopenharmony_ci void endElement() { this->onEndElement(); } 30cb93a386Sopenharmony_ci void startElement(const char elem[]); 31cb93a386Sopenharmony_ci void startElementLen(const char elem[], size_t length); 32cb93a386Sopenharmony_ci void writeDOM(const SkDOM&, const SkDOM::Node*, bool skipRoot); 33cb93a386Sopenharmony_ci void flush(); 34cb93a386Sopenharmony_ci virtual void writeHeader(); 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ciprotected: 37cb93a386Sopenharmony_ci virtual void onStartElementLen(const char elem[], size_t length) = 0; 38cb93a386Sopenharmony_ci virtual void onAddAttributeLen(const char name[], const char value[], size_t length) = 0; 39cb93a386Sopenharmony_ci virtual void onAddText(const char text[], size_t length) = 0; 40cb93a386Sopenharmony_ci virtual void onEndElement() = 0; 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci struct Elem { 43cb93a386Sopenharmony_ci Elem(const char name[], size_t len) 44cb93a386Sopenharmony_ci : fName(name, len) 45cb93a386Sopenharmony_ci , fHasChildren(false) 46cb93a386Sopenharmony_ci , fHasText(false) {} 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci SkString fName; 49cb93a386Sopenharmony_ci bool fHasChildren; 50cb93a386Sopenharmony_ci bool fHasText; 51cb93a386Sopenharmony_ci }; 52cb93a386Sopenharmony_ci void doEnd(Elem* elem); 53cb93a386Sopenharmony_ci bool doStart(const char name[], size_t length); 54cb93a386Sopenharmony_ci Elem* getEnd(); 55cb93a386Sopenharmony_ci const char* getHeader(); 56cb93a386Sopenharmony_ci SkTDArray<Elem*> fElems; 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciprivate: 59cb93a386Sopenharmony_ci bool fDoEscapeMarkup; 60cb93a386Sopenharmony_ci // illegal 61cb93a386Sopenharmony_ci SkXMLWriter& operator=(const SkXMLWriter&); 62cb93a386Sopenharmony_ci}; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ciclass SkXMLStreamWriter : public SkXMLWriter { 65cb93a386Sopenharmony_cipublic: 66cb93a386Sopenharmony_ci enum : uint32_t { 67cb93a386Sopenharmony_ci kNoPretty_Flag = 0x01, 68cb93a386Sopenharmony_ci }; 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci SkXMLStreamWriter(SkWStream*, uint32_t flags = 0); 71cb93a386Sopenharmony_ci ~SkXMLStreamWriter() override; 72cb93a386Sopenharmony_ci void writeHeader() override; 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ciprotected: 75cb93a386Sopenharmony_ci void onStartElementLen(const char elem[], size_t length) override; 76cb93a386Sopenharmony_ci void onEndElement() override; 77cb93a386Sopenharmony_ci void onAddAttributeLen(const char name[], const char value[], size_t length) override; 78cb93a386Sopenharmony_ci void onAddText(const char text[], size_t length) override; 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ciprivate: 81cb93a386Sopenharmony_ci void newline(); 82cb93a386Sopenharmony_ci void tab(int lvl); 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci SkWStream& fStream; 85cb93a386Sopenharmony_ci const uint32_t fFlags; 86cb93a386Sopenharmony_ci}; 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ciclass SkXMLParserWriter : public SkXMLWriter { 89cb93a386Sopenharmony_cipublic: 90cb93a386Sopenharmony_ci SkXMLParserWriter(SkXMLParser*); 91cb93a386Sopenharmony_ci ~SkXMLParserWriter() override; 92cb93a386Sopenharmony_ciprotected: 93cb93a386Sopenharmony_ci void onStartElementLen(const char elem[], size_t length) override; 94cb93a386Sopenharmony_ci void onEndElement() override; 95cb93a386Sopenharmony_ci void onAddAttributeLen(const char name[], const char value[], size_t length) override; 96cb93a386Sopenharmony_ci void onAddText(const char text[], size_t length) override; 97cb93a386Sopenharmony_ciprivate: 98cb93a386Sopenharmony_ci SkXMLParser& fParser; 99cb93a386Sopenharmony_ci}; 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ci#endif 103