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