]>
Commit | Line | Data |
---|---|---|
1 | // | |
2 | // Copyright 2006 The Android Open Source Project | |
3 | // | |
4 | // Build resource files from raw assets. | |
5 | // | |
6 | ||
7 | #ifndef XML_NODE_H | |
8 | #define XML_NODE_H | |
9 | ||
10 | #include "StringPool.h" | |
11 | #include "ResourceTable.h" | |
12 | ||
13 | class XMLNode; | |
14 | ||
15 | extern const char* const RESOURCES_ROOT_NAMESPACE; | |
16 | extern const char* const RESOURCES_ANDROID_NAMESPACE; | |
17 | ||
18 | bool isWhitespace(const char16_t* str); | |
19 | ||
20 | String16 getNamespaceResourcePackage(String16 namespaceUri, bool* outIsPublic = NULL); | |
21 | ||
22 | status_t parseStyledString(Bundle* bundle, | |
23 | const char* fileName, | |
24 | ResXMLTree* inXml, | |
25 | const String16& endTag, | |
26 | String16* outString, | |
27 | Vector<StringPool::entry_style_span>* outSpans, | |
28 | bool isPseudolocalizable); | |
29 | ||
30 | void printXMLBlock(ResXMLTree* block); | |
31 | ||
32 | status_t parseXMLResource(const sp<AaptFile>& file, ResXMLTree* outTree, | |
33 | bool stripAll=true, bool keepComments=false, | |
34 | const char** cDataTags=NULL); | |
35 | ||
36 | class XMLNode : public RefBase | |
37 | { | |
38 | public: | |
39 | static sp<XMLNode> parse(const sp<AaptFile>& file); | |
40 | ||
41 | static inline | |
42 | sp<XMLNode> newNamespace(const String8& filename, const String16& prefix, const String16& uri) { | |
43 | return new XMLNode(filename, prefix, uri, true); | |
44 | } | |
45 | ||
46 | static inline | |
47 | sp<XMLNode> newElement(const String8& filename, const String16& ns, const String16& name) { | |
48 | return new XMLNode(filename, ns, name, false); | |
49 | } | |
50 | ||
51 | static inline | |
52 | sp<XMLNode> newCData(const String8& filename) { | |
53 | return new XMLNode(filename); | |
54 | } | |
55 | ||
56 | enum type { | |
57 | TYPE_NAMESPACE, | |
58 | TYPE_ELEMENT, | |
59 | TYPE_CDATA | |
60 | }; | |
61 | ||
62 | type getType() const; | |
63 | ||
64 | const String16& getNamespacePrefix() const; | |
65 | const String16& getNamespaceUri() const; | |
66 | ||
67 | const String16& getElementNamespace() const; | |
68 | const String16& getElementName() const; | |
69 | const Vector<sp<XMLNode> >& getChildren() const; | |
70 | ||
71 | const String8& getFilename() const; | |
72 | ||
73 | struct attribute_entry { | |
74 | attribute_entry() : index(~(uint32_t)0), nameResId(0) | |
75 | { | |
76 | value.dataType = Res_value::TYPE_NULL; | |
77 | } | |
78 | ||
79 | bool needStringValue() const { | |
80 | return nameResId == 0 | |
81 | || value.dataType == Res_value::TYPE_NULL | |
82 | || value.dataType == Res_value::TYPE_STRING; | |
83 | } | |
84 | ||
85 | String16 ns; | |
86 | String16 name; | |
87 | String16 string; | |
88 | Res_value value; | |
89 | uint32_t index; | |
90 | uint32_t nameResId; | |
91 | mutable uint32_t namePoolIdx; | |
92 | }; | |
93 | ||
94 | const Vector<attribute_entry>& getAttributes() const; | |
95 | ||
96 | const attribute_entry* getAttribute(const String16& ns, const String16& name) const; | |
97 | ||
98 | attribute_entry* editAttribute(const String16& ns, const String16& name); | |
99 | ||
100 | const String16& getCData() const; | |
101 | ||
102 | const String16& getComment() const; | |
103 | ||
104 | int32_t getStartLineNumber() const; | |
105 | int32_t getEndLineNumber() const; | |
106 | ||
107 | sp<XMLNode> searchElement(const String16& tagNamespace, const String16& tagName); | |
108 | ||
109 | sp<XMLNode> getChildElement(const String16& tagNamespace, const String16& tagName); | |
110 | ||
111 | status_t addChild(const sp<XMLNode>& child); | |
112 | ||
113 | status_t insertChildAt(const sp<XMLNode>& child, size_t index); | |
114 | ||
115 | status_t addAttribute(const String16& ns, const String16& name, | |
116 | const String16& value); | |
117 | ||
118 | void setAttributeResID(size_t attrIdx, uint32_t resId); | |
119 | ||
120 | status_t appendChars(const String16& chars); | |
121 | ||
122 | status_t appendComment(const String16& comment); | |
123 | ||
124 | void setStartLineNumber(int32_t line); | |
125 | void setEndLineNumber(int32_t line); | |
126 | ||
127 | void removeWhitespace(bool stripAll=true, const char** cDataTags=NULL); | |
128 | ||
129 | void setUTF8(bool val) { mUTF8 = val; } | |
130 | ||
131 | status_t parseValues(const sp<AaptAssets>& assets, ResourceTable* table); | |
132 | ||
133 | status_t assignResourceIds(const sp<AaptAssets>& assets, | |
134 | const ResourceTable* table = NULL); | |
135 | ||
136 | status_t flatten(const sp<AaptFile>& dest, bool stripComments, | |
137 | bool stripRawValues) const; | |
138 | ||
139 | void print(int indent=0); | |
140 | ||
141 | private: | |
142 | struct ParseState | |
143 | { | |
144 | String8 filename; | |
145 | XML_Parser parser; | |
146 | sp<XMLNode> root; | |
147 | Vector<sp<XMLNode> > stack; | |
148 | String16 pendingComment; | |
149 | }; | |
150 | ||
151 | static void XMLCALL | |
152 | startNamespace(void *userData, const char *prefix, const char *uri); | |
153 | static void XMLCALL | |
154 | startElement(void *userData, const char *name, const char **atts); | |
155 | static void XMLCALL | |
156 | characterData(void *userData, const XML_Char *s, int len); | |
157 | static void XMLCALL | |
158 | endElement(void *userData, const char *name); | |
159 | static void XMLCALL | |
160 | endNamespace(void *userData, const char *prefix); | |
161 | ||
162 | static void XMLCALL | |
163 | commentData(void *userData, const char *comment); | |
164 | ||
165 | // Creating an element node. | |
166 | XMLNode(const String8& filename, const String16& s1, const String16& s2, bool isNamespace); | |
167 | ||
168 | // Creating a CDATA node. | |
169 | XMLNode(const String8& filename); | |
170 | ||
171 | status_t collect_strings(StringPool* dest, Vector<uint32_t>* outResIds, | |
172 | bool stripComments, bool stripRawValues) const; | |
173 | ||
174 | status_t collect_attr_strings(StringPool* outPool, | |
175 | Vector<uint32_t>* outResIds, bool allAttrs) const; | |
176 | ||
177 | status_t collect_resid_strings(StringPool* outPool, | |
178 | Vector<uint32_t>* outResIds) const; | |
179 | ||
180 | status_t flatten_node(const StringPool& strings, const sp<AaptFile>& dest, | |
181 | bool stripComments, bool stripRawValues) const; | |
182 | ||
183 | String16 mNamespacePrefix; | |
184 | String16 mNamespaceUri; | |
185 | String16 mElementName; | |
186 | Vector<sp<XMLNode> > mChildren; | |
187 | Vector<attribute_entry> mAttributes; | |
188 | KeyedVector<uint32_t, uint32_t> mAttributeOrder; | |
189 | uint32_t mNextAttributeIndex; | |
190 | String16 mChars; | |
191 | Res_value mCharsValue; | |
192 | String16 mComment; | |
193 | String8 mFilename; | |
194 | int32_t mStartLineNumber; | |
195 | int32_t mEndLineNumber; | |
196 | ||
197 | // Encode compiled XML with UTF-8 StringPools? | |
198 | bool mUTF8; | |
199 | }; | |
200 | ||
201 | #endif |