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