| // | 
 | // Copyright 2006 The Android Open Source Project | 
 | // | 
 | // Build resource files from raw assets. | 
 | // | 
 |  | 
 | #ifndef XML_NODE_H | 
 | #define XML_NODE_H | 
 |  | 
 | #include "StringPool.h" | 
 | #include "ResourceTable.h" | 
 |  | 
 | class XMLNode; | 
 |  | 
 | extern const char* const RESOURCES_ROOT_NAMESPACE; | 
 | extern const char* const RESOURCES_ANDROID_NAMESPACE; | 
 |  | 
 | bool isWhitespace(const char16_t* str); | 
 |  | 
 | String16 getNamespaceResourcePackage(String16 namespaceUri, bool* outIsPublic = NULL); | 
 |  | 
 | status_t parseStyledString(Bundle* bundle, | 
 |                            const char* fileName, | 
 |                            ResXMLTree* inXml, | 
 |                            const String16& endTag, | 
 |                            String16* outString, | 
 |                            Vector<StringPool::entry_style_span>* outSpans, | 
 |                            bool isFormatted, | 
 |                            bool isPseudolocalizable); | 
 |  | 
 | void printXMLBlock(ResXMLTree* block); | 
 |  | 
 | status_t parseXMLResource(const sp<AaptFile>& file, ResXMLTree* outTree, | 
 |                           bool stripAll=true, bool keepComments=false, | 
 |                           const char** cDataTags=NULL); | 
 |  | 
 | class XMLNode : public RefBase | 
 | { | 
 | public: | 
 |     static sp<XMLNode> parse(const sp<AaptFile>& file); | 
 |  | 
 |     static inline | 
 |     sp<XMLNode> newNamespace(const String8& filename, const String16& prefix, const String16& uri) { | 
 |         return new XMLNode(filename, prefix, uri, true); | 
 |     } | 
 |      | 
 |     static inline | 
 |     sp<XMLNode> newElement(const String8& filename, const String16& ns, const String16& name) { | 
 |         return new XMLNode(filename, ns, name, false); | 
 |     } | 
 |      | 
 |     static inline | 
 |     sp<XMLNode> newCData(const String8& filename) { | 
 |         return new XMLNode(filename); | 
 |     } | 
 |      | 
 |     enum type { | 
 |         TYPE_NAMESPACE, | 
 |         TYPE_ELEMENT, | 
 |         TYPE_CDATA | 
 |     }; | 
 |      | 
 |     type getType() const; | 
 |      | 
 |     const String16& getNamespacePrefix() const; | 
 |     const String16& getNamespaceUri() const; | 
 |      | 
 |     const String16& getElementNamespace() const; | 
 |     const String16& getElementName() const; | 
 |     const Vector<sp<XMLNode> >& getChildren() const; | 
 |  | 
 |     const String8& getFilename() const; | 
 |      | 
 |     struct attribute_entry { | 
 |         attribute_entry() : index(~(uint32_t)0), nameResId(0) | 
 |         { | 
 |             value.dataType = Res_value::TYPE_NULL; | 
 |         } | 
 |  | 
 |         bool needStringValue() const { | 
 |             return nameResId == 0 | 
 |                 || value.dataType == Res_value::TYPE_NULL | 
 |                 || value.dataType == Res_value::TYPE_STRING; | 
 |         } | 
 |          | 
 |         String16 ns; | 
 |         String16 name; | 
 |         String16 string; | 
 |         Res_value value; | 
 |         uint32_t index; | 
 |         uint32_t nameResId; | 
 |         mutable uint32_t namePoolIdx; | 
 |     }; | 
 |  | 
 |     const Vector<attribute_entry>& getAttributes() const; | 
 |  | 
 |     const attribute_entry* getAttribute(const String16& ns, const String16& name) const; | 
 |      | 
 |     attribute_entry* editAttribute(const String16& ns, const String16& name); | 
 |  | 
 |     const String16& getCData() const; | 
 |  | 
 |     const String16& getComment() const; | 
 |  | 
 |     int32_t getStartLineNumber() const; | 
 |     int32_t getEndLineNumber() const; | 
 |  | 
 |     sp<XMLNode> searchElement(const String16& tagNamespace, const String16& tagName); | 
 |      | 
 |     sp<XMLNode> getChildElement(const String16& tagNamespace, const String16& tagName); | 
 |      | 
 |     status_t addChild(const sp<XMLNode>& child); | 
 |  | 
 |     status_t insertChildAt(const sp<XMLNode>& child, size_t index); | 
 |  | 
 |     status_t addAttribute(const String16& ns, const String16& name, | 
 |                           const String16& value); | 
 |  | 
 |     void setAttributeResID(size_t attrIdx, uint32_t resId); | 
 |  | 
 |     status_t appendChars(const String16& chars); | 
 |  | 
 |     status_t appendComment(const String16& comment); | 
 |  | 
 |     void setStartLineNumber(int32_t line); | 
 |     void setEndLineNumber(int32_t line); | 
 |  | 
 |     void removeWhitespace(bool stripAll=true, const char** cDataTags=NULL); | 
 |  | 
 |     void setUTF8(bool val) { mUTF8 = val; } | 
 |  | 
 |     status_t parseValues(const sp<AaptAssets>& assets, ResourceTable* table); | 
 |  | 
 |     status_t assignResourceIds(const sp<AaptAssets>& assets, | 
 |                                const ResourceTable* table = NULL); | 
 |  | 
 |     status_t flatten(const sp<AaptFile>& dest, bool stripComments, | 
 |             bool stripRawValues) const; | 
 |  | 
 |     void print(int indent=0); | 
 |  | 
 | private: | 
 |     struct ParseState | 
 |     { | 
 |         String8 filename; | 
 |         XML_Parser parser; | 
 |         sp<XMLNode> root; | 
 |         Vector<sp<XMLNode> > stack; | 
 |         String16 pendingComment; | 
 |     }; | 
 |  | 
 |     static void XMLCALL | 
 |     startNamespace(void *userData, const char *prefix, const char *uri); | 
 |     static void XMLCALL | 
 |     startElement(void *userData, const char *name, const char **atts); | 
 |     static void XMLCALL | 
 |     characterData(void *userData, const XML_Char *s, int len); | 
 |     static void XMLCALL | 
 |     endElement(void *userData, const char *name); | 
 |     static void XMLCALL | 
 |     endNamespace(void *userData, const char *prefix); | 
 |      | 
 |     static void XMLCALL | 
 |     commentData(void *userData, const char *comment); | 
 |      | 
 |     // Creating an element node. | 
 |     XMLNode(const String8& filename, const String16& s1, const String16& s2, bool isNamespace); | 
 |      | 
 |     // Creating a CDATA node. | 
 |     XMLNode(const String8& filename); | 
 |      | 
 |     status_t collect_strings(StringPool* dest, Vector<uint32_t>* outResIds, | 
 |             bool stripComments, bool stripRawValues) const; | 
 |  | 
 |     status_t collect_attr_strings(StringPool* outPool, | 
 |         Vector<uint32_t>* outResIds, bool allAttrs) const; | 
 |          | 
 |     status_t collect_resid_strings(StringPool* outPool, | 
 |             Vector<uint32_t>* outResIds) const; | 
 |  | 
 |     status_t flatten_node(const StringPool& strings, const sp<AaptFile>& dest, | 
 |             bool stripComments, bool stripRawValues) const; | 
 |  | 
 |     String16 mNamespacePrefix; | 
 |     String16 mNamespaceUri; | 
 |     String16 mElementName; | 
 |     Vector<sp<XMLNode> > mChildren; | 
 |     Vector<attribute_entry> mAttributes; | 
 |     KeyedVector<uint32_t, uint32_t> mAttributeOrder; | 
 |     uint32_t mNextAttributeIndex; | 
 |     String16 mChars; | 
 |     Res_value mCharsValue; | 
 |     String16 mComment; | 
 |     String8 mFilename; | 
 |     int32_t mStartLineNumber; | 
 |     int32_t mEndLineNumber; | 
 |  | 
 |     // Encode compiled XML with UTF-8 StringPools? | 
 |     bool mUTF8; | 
 | }; | 
 |  | 
 | #endif |