michael@0: michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #ifndef SkXMLWriter_DEFINED michael@0: #define SkXMLWriter_DEFINED michael@0: michael@0: #include "SkTDArray.h" michael@0: #include "SkString.h" michael@0: #include "SkDOM.h" michael@0: michael@0: class SkWStream; michael@0: class SkXMLParser; michael@0: michael@0: class SkXMLWriter { michael@0: public: michael@0: SkXMLWriter(bool doEscapeMarkup = true); michael@0: virtual ~SkXMLWriter(); michael@0: michael@0: void addS32Attribute(const char name[], int32_t value); michael@0: void addAttribute(const char name[], const char value[]); michael@0: void addAttributeLen(const char name[], const char value[], size_t length); michael@0: void addHexAttribute(const char name[], uint32_t value, int minDigits = 0); michael@0: void addScalarAttribute(const char name[], SkScalar value); michael@0: void endElement() { this->onEndElement(); } michael@0: void startElement(const char elem[]); michael@0: void startElementLen(const char elem[], size_t length); michael@0: void writeDOM(const SkDOM&, const SkDOM::Node*, bool skipRoot); michael@0: void flush(); michael@0: virtual void writeHeader(); michael@0: michael@0: protected: michael@0: virtual void onStartElementLen(const char elem[], size_t length) = 0; michael@0: virtual void onAddAttributeLen(const char name[], const char value[], size_t length) = 0; michael@0: virtual void onEndElement() = 0; michael@0: michael@0: struct Elem { michael@0: SkString fName; michael@0: bool fHasChildren; michael@0: }; michael@0: void doEnd(Elem* elem); michael@0: bool doStart(const char name[], size_t length); michael@0: Elem* getEnd(); michael@0: const char* getHeader(); michael@0: SkTDArray fElems; michael@0: michael@0: private: michael@0: bool fDoEscapeMarkup; michael@0: // illegal michael@0: SkXMLWriter& operator=(const SkXMLWriter&); michael@0: }; michael@0: michael@0: class SkXMLStreamWriter : public SkXMLWriter { michael@0: public: michael@0: SkXMLStreamWriter(SkWStream*); michael@0: virtual ~SkXMLStreamWriter(); michael@0: virtual void writeHeader(); michael@0: SkDEBUGCODE(static void UnitTest();) michael@0: protected: michael@0: virtual void onStartElementLen(const char elem[], size_t length); michael@0: virtual void onEndElement(); michael@0: virtual void onAddAttributeLen(const char name[], const char value[], size_t length); michael@0: private: michael@0: SkWStream& fStream; michael@0: }; michael@0: michael@0: class SkXMLParserWriter : public SkXMLWriter { michael@0: public: michael@0: SkXMLParserWriter(SkXMLParser*); michael@0: virtual ~SkXMLParserWriter(); michael@0: protected: michael@0: virtual void onStartElementLen(const char elem[], size_t length); michael@0: virtual void onEndElement(); michael@0: virtual void onAddAttributeLen(const char name[], const char value[], size_t length); michael@0: private: michael@0: SkXMLParser& fParser; michael@0: }; michael@0: michael@0: michael@0: #endif