SkXMLWriter.h 2.8 KB

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