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