| /* |
| * Copyright (C) 2006 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef SkDOM_DEFINED |
| #define SkDOM_DEFINED |
| |
| #include "SkChunkAlloc.h" |
| #include "SkMath.h" |
| #include "SkScalar.h" |
| #include "SkTemplates.h" |
| |
| struct SkDOMNode; |
| struct SkDOMAttr; |
| |
| class SkDOM { |
| public: |
| SkDOM(); |
| ~SkDOM(); |
| |
| typedef SkDOMNode Node; |
| typedef SkDOMAttr Attr; |
| |
| /** Returns null on failure |
| */ |
| const Node* build(const char doc[], size_t len); |
| const Node* copy(const SkDOM& dom, const Node* node); |
| |
| const Node* getRootNode() const; |
| |
| 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 class SkDOM&, const Node*); |
| const char* next(const char** value); |
| private: |
| const Attr* fAttr; |
| const Attr* fStop; |
| }; |
| |
| SkDEBUGCODE(void dump(const Node* node = NULL, int tabLevel = 0) const;) |
| SkDEBUGCODE(static void UnitTest();) |
| |
| private: |
| SkChunkAlloc fAlloc; |
| Node* fRoot; |
| friend class AttrIter; |
| friend class SkDOMParser; |
| }; |
| |
| #endif |
| |