00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkXMLWriter_DEFINED
00018 #define SkXMLWriter_DEFINED
00019
00020 #include "SkTDArray.h"
00021 #include "SkString.h"
00022 #include "SkDOM.h"
00023
00024 class SkWStream;
00025 class SkXMLParser;
00026
00027 class SkXMLWriter {
00028 public:
00029 SkXMLWriter(bool doEscapeMarkup = true);
00030 virtual ~SkXMLWriter();
00031
00032 void addS32Attribute(const char name[], int32_t value);
00033 void addAttribute(const char name[], const char value[]);
00034 void addAttributeLen(const char name[], const char value[], size_t length);
00035 void addHexAttribute(const char name[], uint32_t value, int minDigits = 0);
00036 void addScalarAttribute(const char name[], SkScalar value);
00037 void endElement() { this->onEndElement(); }
00038 void startElement(const char elem[]);
00039 void startElementLen(const char elem[], size_t length);
00040 void writeDOM(const SkDOM&, const SkDOM::Node*, bool skipRoot);
00041 void flush();
00042 virtual void writeHeader();
00043
00044 protected:
00045 virtual void onStartElementLen(const char elem[], size_t length) = 0;
00046 virtual void onAddAttributeLen(const char name[], const char value[], size_t length) = 0;
00047 virtual void onEndElement() = 0;
00048
00049 struct Elem {
00050 SkString fName;
00051 bool fHasChildren;
00052 };
00053 void doEnd(Elem* elem);
00054 bool doStart(const char name[], size_t length);
00055 Elem* getEnd();
00056 const char* getHeader();
00057 SkTDArray<Elem*> fElems;
00058
00059 private:
00060 bool fDoEscapeMarkup;
00061
00062 SkXMLWriter& operator=(const SkXMLWriter&);
00063 };
00064
00065 class SkXMLStreamWriter : public SkXMLWriter {
00066 public:
00067 SkXMLStreamWriter(SkWStream*);
00068 virtual ~SkXMLStreamWriter();
00069 virtual void writeHeader();
00070 SkDEBUGCODE(static void UnitTest();)
00071 protected:
00072 virtual void onStartElementLen(const char elem[], size_t length);
00073 virtual void onEndElement();
00074 virtual void onAddAttributeLen(const char name[], const char value[], size_t length);
00075 private:
00076 SkWStream& fStream;
00077 };
00078
00079 class SkXMLParserWriter : public SkXMLWriter {
00080 public:
00081 SkXMLParserWriter(SkXMLParser*);
00082 virtual ~SkXMLParserWriter();
00083 protected:
00084 virtual void onStartElementLen(const char elem[], size_t length);
00085 virtual void onEndElement();
00086 virtual void onAddAttributeLen(const char name[], const char value[], size_t length);
00087 private:
00088 SkXMLParser& fParser;
00089 };
00090
00091
00092 #endif
00093