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 const String16
& getCData() const;
100 const String16
& getComment() const;
102 int32_t getStartLineNumber() const;
103 int32_t getEndLineNumber() const;
105 sp
<XMLNode
> searchElement(const String16
& tagNamespace
, const String16
& tagName
);
107 sp
<XMLNode
> getChildElement(const String16
& tagNamespace
, const String16
& tagName
);
109 status_t
addChild(const sp
<XMLNode
>& child
);
111 status_t
insertChildAt(const sp
<XMLNode
>& child
, size_t index
);
113 status_t
addAttribute(const String16
& ns
, const String16
& name
,
114 const String16
& value
);
116 void setAttributeResID(size_t attrIdx
, uint32_t resId
);
118 status_t
appendChars(const String16
& chars
);
120 status_t
appendComment(const String16
& comment
);
122 void setStartLineNumber(int32_t line
);
123 void setEndLineNumber(int32_t line
);
125 void removeWhitespace(bool stripAll
=true, const char** cDataTags
=NULL
);
127 void setUTF8(bool val
) { mUTF8
= val
; }
129 status_t
parseValues(const sp
<AaptAssets
>& assets
, ResourceTable
* table
);
131 status_t
assignResourceIds(const sp
<AaptAssets
>& assets
,
132 const ResourceTable
* table
= NULL
);
134 status_t
flatten(const sp
<AaptFile
>& dest
, bool stripComments
,
135 bool stripRawValues
) const;
137 void print(int indent
=0);
145 Vector
<sp
<XMLNode
> > stack
;
146 String16 pendingComment
;
150 startNamespace(void *userData
, const char *prefix
, const char *uri
);
152 startElement(void *userData
, const char *name
, const char **atts
);
154 characterData(void *userData
, const XML_Char
*s
, int len
);
156 endElement(void *userData
, const char *name
);
158 endNamespace(void *userData
, const char *prefix
);
161 commentData(void *userData
, const char *comment
);
163 // Creating an element node.
164 XMLNode(const String8
& filename
, const String16
& s1
, const String16
& s2
, bool isNamespace
);
166 // Creating a CDATA node.
167 XMLNode(const String8
& filename
);
169 status_t
collect_strings(StringPool
* dest
, Vector
<uint32_t>* outResIds
,
170 bool stripComments
, bool stripRawValues
) const;
172 status_t
collect_attr_strings(StringPool
* outPool
,
173 Vector
<uint32_t>* outResIds
, bool allAttrs
) const;
175 status_t
collect_resid_strings(StringPool
* outPool
,
176 Vector
<uint32_t>* outResIds
) const;
178 status_t
flatten_node(const StringPool
& strings
, const sp
<AaptFile
>& dest
,
179 bool stripComments
, bool stripRawValues
) const;
181 String16 mNamespacePrefix
;
182 String16 mNamespaceUri
;
183 String16 mElementName
;
184 Vector
<sp
<XMLNode
> > mChildren
;
185 Vector
<attribute_entry
> mAttributes
;
186 KeyedVector
<uint32_t, uint32_t> mAttributeOrder
;
187 uint32_t mNextAttributeIndex
;
189 Res_value mCharsValue
;
192 int32_t mStartLineNumber
;
193 int32_t mEndLineNumber
;
195 // Encode compiled XML with UTF-8 StringPools?