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