2 // Copyright 2006 The Android Open Source Project
4 // Build resource files from raw assets.
10 #include "StringPool.h"
11 #include "ResourceTable.h"
15 extern const char* const RESOURCES_ROOT_NAMESPACE
;
16 extern const char* const RESOURCES_ANDROID_NAMESPACE
;
18 bool isWhitespace(const char16_t* str
);
20 String16
getNamespaceResourcePackage(String16 namespaceUri
, bool* outIsPublic
= NULL
);
22 status_t
parseStyledString(Bundle
* bundle
,
25 const String16
& endTag
,
27 Vector
<StringPool::entry_style_span
>* outSpans
,
28 bool isPseudolocalizable
);
30 void printXMLBlock(ResXMLTree
* block
);
32 status_t
parseXMLResource(const sp
<AaptFile
>& file
, ResXMLTree
* outTree
,
33 bool stripAll
=true, bool keepComments
=false,
34 const char** cDataTags
=NULL
);
36 class XMLNode
: public RefBase
39 static sp
<XMLNode
> parse(const sp
<AaptFile
>& file
);
42 sp
<XMLNode
> newNamespace(const String8
& filename
, const String16
& prefix
, const String16
& uri
) {
43 return new XMLNode(filename
, prefix
, uri
, true);
47 sp
<XMLNode
> newElement(const String8
& filename
, const String16
& ns
, const String16
& name
) {
48 return new XMLNode(filename
, ns
, name
, false);
52 sp
<XMLNode
> newCData(const String8
& filename
) {
53 return new XMLNode(filename
);
64 const String16
& getNamespacePrefix() const;
65 const String16
& getNamespaceUri() const;
67 const String16
& getElementNamespace() const;
68 const String16
& getElementName() const;
69 const Vector
<sp
<XMLNode
> >& getChildren() const;
71 const String8
& getFilename() const;
73 struct attribute_entry
{
74 attribute_entry() : index(~(uint32_t)0), nameResId(0)
76 value
.dataType
= Res_value::TYPE_NULL
;
79 bool needStringValue() const {
81 || value
.dataType
== Res_value::TYPE_NULL
82 || value
.dataType
== Res_value::TYPE_STRING
;
91 mutable uint32_t namePoolIdx
;
94 const Vector
<attribute_entry
>& getAttributes() const;
96 const attribute_entry
* getAttribute(const String16
& ns
, const String16
& name
) const;
98 attribute_entry
* editAttribute(const String16
& ns
, const String16
& name
);
100 const String16
& getCData() const;
102 const String16
& getComment() const;
104 int32_t getStartLineNumber() const;
105 int32_t getEndLineNumber() const;
107 sp
<XMLNode
> searchElement(const String16
& tagNamespace
, const String16
& tagName
);
109 sp
<XMLNode
> getChildElement(const String16
& tagNamespace
, const String16
& tagName
);
111 status_t
addChild(const sp
<XMLNode
>& child
);
113 status_t
insertChildAt(const sp
<XMLNode
>& child
, size_t index
);
115 status_t
addAttribute(const String16
& ns
, const String16
& name
,
116 const String16
& value
);
118 void setAttributeResID(size_t attrIdx
, uint32_t resId
);
120 status_t
appendChars(const String16
& chars
);
122 status_t
appendComment(const String16
& comment
);
124 void setStartLineNumber(int32_t line
);
125 void setEndLineNumber(int32_t line
);
127 void removeWhitespace(bool stripAll
=true, const char** cDataTags
=NULL
);
129 void setUTF8(bool val
) { mUTF8
= val
; }
131 status_t
parseValues(const sp
<AaptAssets
>& assets
, ResourceTable
* table
);
133 status_t
assignResourceIds(const sp
<AaptAssets
>& assets
,
134 const ResourceTable
* table
= NULL
);
136 status_t
flatten(const sp
<AaptFile
>& dest
, bool stripComments
,
137 bool stripRawValues
) const;
139 void print(int indent
=0);
147 Vector
<sp
<XMLNode
> > stack
;
148 String16 pendingComment
;
152 startNamespace(void *userData
, const char *prefix
, const char *uri
);
154 startElement(void *userData
, const char *name
, const char **atts
);
156 characterData(void *userData
, const XML_Char
*s
, int len
);
158 endElement(void *userData
, const char *name
);
160 endNamespace(void *userData
, const char *prefix
);
163 commentData(void *userData
, const char *comment
);
165 // Creating an element node.
166 XMLNode(const String8
& filename
, const String16
& s1
, const String16
& s2
, bool isNamespace
);
168 // Creating a CDATA node.
169 XMLNode(const String8
& filename
);
171 status_t
collect_strings(StringPool
* dest
, Vector
<uint32_t>* outResIds
,
172 bool stripComments
, bool stripRawValues
) const;
174 status_t
collect_attr_strings(StringPool
* outPool
,
175 Vector
<uint32_t>* outResIds
, bool allAttrs
) const;
177 status_t
collect_resid_strings(StringPool
* outPool
,
178 Vector
<uint32_t>* outResIds
) const;
180 status_t
flatten_node(const StringPool
& strings
, const sp
<AaptFile
>& dest
,
181 bool stripComments
, bool stripRawValues
) const;
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
;
191 Res_value mCharsValue
;
194 int32_t mStartLineNumber
;
195 int32_t mEndLineNumber
;
197 // Encode compiled XML with UTF-8 StringPools?