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     status_t 
parseValues(const sp
<AaptAssets
>& assets
, ResourceTable
* table
); 
 129     status_t 
assignResourceIds(const sp
<AaptAssets
>& assets
, 
 130                                const ResourceTable
* table 
= NULL
); 
 132     status_t 
flatten(const sp
<AaptFile
>& dest
, bool stripComments
, 
 133             bool stripRawValues
) const; 
 135     void print(int indent
=0); 
 143         Vector
<sp
<XMLNode
> > stack
; 
 144         String16 pendingComment
; 
 148     startNamespace(void *userData
, const char *prefix
, const char *uri
); 
 150     startElement(void *userData
, const char *name
, const char **atts
); 
 152     characterData(void *userData
, const XML_Char 
*s
, int len
); 
 154     endElement(void *userData
, const char *name
); 
 156     endNamespace(void *userData
, const char *prefix
); 
 159     commentData(void *userData
, const char *comment
); 
 161     // Creating an element node. 
 162     XMLNode(const String8
& filename
, const String16
& s1
, const String16
& s2
, bool isNamespace
); 
 164     // Creating a CDATA node. 
 165     XMLNode(const String8
& filename
); 
 167     status_t 
collect_strings(StringPool
* dest
, Vector
<uint32_t>* outResIds
, 
 168             bool stripComments
, bool stripRawValues
) const; 
 170     status_t 
collect_attr_strings(StringPool
* outPool
, 
 171         Vector
<uint32_t>* outResIds
, bool allAttrs
) const; 
 173     status_t 
collect_resid_strings(StringPool
* outPool
, 
 174             Vector
<uint32_t>* outResIds
) const; 
 176     status_t 
flatten_node(const StringPool
& strings
, const sp
<AaptFile
>& dest
, 
 177             bool stripComments
, bool stripRawValues
) const; 
 179     String16 mNamespacePrefix
; 
 180     String16 mNamespaceUri
; 
 181     String16 mElementName
; 
 182     Vector
<sp
<XMLNode
> > mChildren
; 
 183     Vector
<attribute_entry
> mAttributes
; 
 184     KeyedVector
<uint32_t, uint32_t> mAttributeOrder
; 
 185     uint32_t mNextAttributeIndex
; 
 187     Res_value mCharsValue
; 
 190     int32_t mStartLineNumber
; 
 191     int32_t mEndLineNumber
;