From 5a8fe978c3d90a5aced700af42b9394d4264cdfc Mon Sep 17 00:00:00 2001 From: Herb Derby Date: Tue, 14 Feb 2017 14:42:30 -0500 Subject: Remove include/xml from public API. Move SkDOM and ilk from include/xml to src/xml. I have looked for uses of SkDOM in the depot using cs/ and have found none, but this is not perfect. So, if this breaks external builds, revert it. TBR=reed@google.com Change-Id: I162a1977f0649b049c0f93f016701784d025996d Reviewed-on: https://skia-review.googlesource.com/8447 Reviewed-by: Herb Derby Reviewed-by: Mike Reed Reviewed-by: Florin Malita Commit-Queue: Herb Derby --- src/xml/SkDOM.h | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/xml/SkXMLParser.h | 87 +++++++++++++++++++++++++++++++++++++++++++++++ src/xml/SkXMLWriter.h | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 275 insertions(+) create mode 100644 src/xml/SkDOM.h create mode 100644 src/xml/SkXMLParser.h create mode 100644 src/xml/SkXMLWriter.h (limited to 'src/xml') diff --git a/src/xml/SkDOM.h b/src/xml/SkDOM.h new file mode 100644 index 0000000000..0ffb04232a --- /dev/null +++ b/src/xml/SkDOM.h @@ -0,0 +1,94 @@ +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkDOM_DEFINED +#define SkDOM_DEFINED + +#include "../private/SkChunkAlloc.h" +#include "../private/SkTemplates.h" +#include "SkScalar.h" +#include "SkTypes.h" + +struct SkDOMNode; +struct SkDOMAttr; + +class SkDOMParser; +class SkStream; +class SkXMLParser; + +class SkDOM : public SkNoncopyable { +public: + SkDOM(); + ~SkDOM(); + + typedef SkDOMNode Node; + typedef SkDOMAttr Attr; + + /** Returns null on failure + */ + const Node* build(SkStream&); + const Node* copy(const SkDOM& dom, const Node* node); + + const Node* getRootNode() const; + + SkXMLParser* beginParsing(); + const Node* finishParsing(); + + enum Type { + kElement_Type, + kText_Type + }; + Type getType(const Node*) const; + + const char* getName(const Node*) const; + const Node* getFirstChild(const Node*, const char elem[] = NULL) const; + const Node* getNextSibling(const Node*, const char elem[] = NULL) const; + + const char* findAttr(const Node*, const char attrName[]) const; + const Attr* getFirstAttr(const Node*) const; + const Attr* getNextAttr(const Node*, const Attr*) const; + const char* getAttrName(const Node*, const Attr*) const; + const char* getAttrValue(const Node*, const Attr*) const; + + // helpers for walking children + int countChildren(const Node* node, const char elem[] = NULL) const; + + // helpers for calling SkParse + bool findS32(const Node*, const char name[], int32_t* value) const; + bool findScalars(const Node*, const char name[], SkScalar value[], int count) const; + bool findHex(const Node*, const char name[], uint32_t* value) const; + bool findBool(const Node*, const char name[], bool*) const; + int findList(const Node*, const char name[], const char list[]) const; + + bool findScalar(const Node* node, const char name[], SkScalar value[]) const { + return this->findScalars(node, name, value, 1); + } + + bool hasAttr(const Node*, const char name[], const char value[]) const; + bool hasS32(const Node*, const char name[], int32_t value) const; + bool hasScalar(const Node*, const char name[], SkScalar value) const; + bool hasHex(const Node*, const char name[], uint32_t value) const; + bool hasBool(const Node*, const char name[], bool value) const; + + class AttrIter { + public: + AttrIter(const SkDOM&, const Node*); + const char* next(const char** value); + private: + const Attr* fAttr; + const Attr* fStop; + }; + +private: + SkChunkAlloc fAlloc; + Node* fRoot; + std::unique_ptr fParser; + + typedef SkNoncopyable INHERITED; +}; + +#endif diff --git a/src/xml/SkXMLParser.h b/src/xml/SkXMLParser.h new file mode 100644 index 0000000000..3f69013ce6 --- /dev/null +++ b/src/xml/SkXMLParser.h @@ -0,0 +1,87 @@ + +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#ifndef SkXMLParser_DEFINED +#define SkXMLParser_DEFINED + +#include "SkString.h" + +class SkStream; + +class SkDOM; +struct SkDOMNode; + +class SkXMLParserError { +public: + enum ErrorCode { + kNoError, + kEmptyFile, + kUnknownElement, + kUnknownAttributeName, + kErrorInAttributeValue, + kDuplicateIDs, + kUnknownError + }; + + SkXMLParserError(); + virtual ~SkXMLParserError(); + ErrorCode getErrorCode() const { return fCode; } + virtual void getErrorString(SkString* str) const; + int getLineNumber() const { return fLineNumber; } + int getNativeCode() const { return fNativeCode; } + bool hasError() const { return fCode != kNoError || fNativeCode != -1; } + bool hasNoun() const { return fNoun.size() > 0; } + void reset(); + void setCode(ErrorCode code) { fCode = code; } + void setNoun(const SkString& str) { fNoun.set(str); } + void setNoun(const char* ch) { fNoun.set(ch); } + void setNoun(const char* ch, size_t len) { fNoun.set(ch, len); } +protected: + ErrorCode fCode; +private: + int fLineNumber; + int fNativeCode; + SkString fNoun; + friend class SkXMLParser; +}; + +class SkXMLParser { +public: + SkXMLParser(SkXMLParserError* parserError = NULL); + virtual ~SkXMLParser(); + + /** Returns true for success + */ + bool parse(const char doc[], size_t len); + bool parse(SkStream& docStream); + bool parse(const SkDOM&, const SkDOMNode*); + + static void GetNativeErrorString(int nativeErrorCode, SkString* str); + +protected: + // override in subclasses; return true to stop parsing + virtual bool onStartElement(const char elem[]); + virtual bool onAddAttribute(const char name[], const char value[]); + virtual bool onEndElement(const char elem[]); + virtual bool onText(const char text[], int len); + +public: + // public for ported implementation, not meant for clients to call + bool startElement(const char elem[]); + bool addAttribute(const char name[], const char value[]); + bool endElement(const char elem[]); + bool text(const char text[], int len); + void* fParser; +protected: + SkXMLParserError* fError; +private: + void reportError(void* parser); +}; + +#endif diff --git a/src/xml/SkXMLWriter.h b/src/xml/SkXMLWriter.h new file mode 100644 index 0000000000..b1d513c508 --- /dev/null +++ b/src/xml/SkXMLWriter.h @@ -0,0 +1,94 @@ +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkXMLWriter_DEFINED +#define SkXMLWriter_DEFINED + +#include "../private/SkTDArray.h" +#include "SkString.h" +#include "SkDOM.h" + +class SkWStream; +class SkXMLParser; + +class SkXMLWriter { +public: + SkXMLWriter(bool doEscapeMarkup = true); + virtual ~SkXMLWriter(); + + void addS32Attribute(const char name[], int32_t value); + void addAttribute(const char name[], const char value[]); + void addAttributeLen(const char name[], const char value[], size_t length); + void addHexAttribute(const char name[], uint32_t value, int minDigits = 0); + void addScalarAttribute(const char name[], SkScalar value); + void addText(const char text[], size_t length); + void endElement() { this->onEndElement(); } + void startElement(const char elem[]); + void startElementLen(const char elem[], size_t length); + void writeDOM(const SkDOM&, const SkDOM::Node*, bool skipRoot); + void flush(); + virtual void writeHeader(); + +protected: + virtual void onStartElementLen(const char elem[], size_t length) = 0; + virtual void onAddAttributeLen(const char name[], const char value[], size_t length) = 0; + virtual void onAddText(const char text[], size_t length) = 0; + virtual void onEndElement() = 0; + + struct Elem { + Elem(const char name[], size_t len) + : fName(name, len) + , fHasChildren(false) + , fHasText(false) {} + + SkString fName; + bool fHasChildren; + bool fHasText; + }; + void doEnd(Elem* elem); + bool doStart(const char name[], size_t length); + Elem* getEnd(); + const char* getHeader(); + SkTDArray fElems; + +private: + bool fDoEscapeMarkup; + // illegal + SkXMLWriter& operator=(const SkXMLWriter&); +}; + +class SkXMLStreamWriter : public SkXMLWriter { +public: + SkXMLStreamWriter(SkWStream*); + virtual ~SkXMLStreamWriter(); + void writeHeader() override; + +protected: + void onStartElementLen(const char elem[], size_t length) override; + void onEndElement() override; + void onAddAttributeLen(const char name[], const char value[], size_t length) override; + void onAddText(const char text[], size_t length) override; + +private: + SkWStream& fStream; +}; + +class SkXMLParserWriter : public SkXMLWriter { +public: + SkXMLParserWriter(SkXMLParser*); + virtual ~SkXMLParserWriter(); +protected: + void onStartElementLen(const char elem[], size_t length) override; + void onEndElement() override; + void onAddAttributeLen(const char name[], const char value[], size_t length) override; + void onAddText(const char text[], size_t length) override; +private: + SkXMLParser& fParser; +}; + + +#endif -- cgit v1.2.3