AAPT2: Remove usage of u16string
For legacy reasons, we kept around the use of UTF-16 internally
in AAPT2. We don't need this and this CL removes all instances of
std::u16string and StringPiece16. The only places still needed
are when interacting with the ResTable APIs that only operate in
UTF16.
Change-Id: I492475b84bb9014fa13bf992cff447ee7a5fe588
diff --git a/tools/aapt2/xml/XmlActionExecutor.cpp b/tools/aapt2/xml/XmlActionExecutor.cpp
index 0ef67ea..745079c 100644
--- a/tools/aapt2/xml/XmlActionExecutor.cpp
+++ b/tools/aapt2/xml/XmlActionExecutor.cpp
@@ -57,8 +57,7 @@
for (Element* childEl : el->getChildElements()) {
if (childEl->namespaceUri.empty()) {
- std::map<std::u16string, XmlNodeAction>::const_iterator iter =
- mMap.find(childEl->name);
+ std::map<std::string, XmlNodeAction>::const_iterator iter = mMap.find(childEl->name);
if (iter != mMap.end()) {
error |= !iter->second.execute(policy, diag, childEl);
continue;
@@ -91,7 +90,7 @@
}
if (el->namespaceUri.empty()) {
- std::map<std::u16string, XmlNodeAction>::const_iterator iter = mMap.find(el->name);
+ std::map<std::string, XmlNodeAction>::const_iterator iter = mMap.find(el->name);
if (iter != mMap.end()) {
return iter->second.execute(policy, &sourceDiag, el);
}
diff --git a/tools/aapt2/xml/XmlActionExecutor.h b/tools/aapt2/xml/XmlActionExecutor.h
index 36b94db..cad508c 100644
--- a/tools/aapt2/xml/XmlActionExecutor.h
+++ b/tools/aapt2/xml/XmlActionExecutor.h
@@ -55,7 +55,7 @@
* Find or create a child XmlNodeAction that will be performed for the child element
* with the name `name`.
*/
- XmlNodeAction& operator[](const std::u16string& name) {
+ XmlNodeAction& operator[](const std::string& name) {
return mMap[name];
}
@@ -70,7 +70,7 @@
bool execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag, Element* el) const;
- std::map<std::u16string, XmlNodeAction> mMap;
+ std::map<std::string, XmlNodeAction> mMap;
std::vector<ActionFuncWithDiag> mActions;
};
@@ -86,7 +86,7 @@
* Find or create a root XmlNodeAction that will be performed for the root XML element
* with the name `name`.
*/
- XmlNodeAction& operator[](const std::u16string& name) {
+ XmlNodeAction& operator[](const std::string& name) {
return mMap[name];
}
@@ -97,7 +97,7 @@
bool execute(XmlActionExecutorPolicy policy, IDiagnostics* diag, XmlResource* doc) const;
private:
- std::map<std::u16string, XmlNodeAction> mMap;
+ std::map<std::string, XmlNodeAction> mMap;
DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
};
diff --git a/tools/aapt2/xml/XmlActionExecutor_test.cpp b/tools/aapt2/xml/XmlActionExecutor_test.cpp
index ebf287a..106e856 100644
--- a/tools/aapt2/xml/XmlActionExecutor_test.cpp
+++ b/tools/aapt2/xml/XmlActionExecutor_test.cpp
@@ -22,8 +22,8 @@
TEST(XmlActionExecutorTest, BuildsAccessibleNestedPattern) {
XmlActionExecutor executor;
- XmlNodeAction& manifestAction = executor[u"manifest"];
- XmlNodeAction& applicationAction = manifestAction[u"application"];
+ XmlNodeAction& manifestAction = executor["manifest"];
+ XmlNodeAction& applicationAction = manifestAction["application"];
Element* manifestEl = nullptr;
manifestAction.action([&](Element* manifest) -> bool {
@@ -42,15 +42,15 @@
StdErrDiagnostics diag;
ASSERT_TRUE(executor.execute(XmlActionExecutorPolicy::None, &diag, doc.get()));
ASSERT_NE(nullptr, manifestEl);
- EXPECT_EQ(std::u16string(u"manifest"), manifestEl->name);
+ EXPECT_EQ(std::string("manifest"), manifestEl->name);
ASSERT_NE(nullptr, applicationEl);
- EXPECT_EQ(std::u16string(u"application"), applicationEl->name);
+ EXPECT_EQ(std::string("application"), applicationEl->name);
}
TEST(XmlActionExecutorTest, FailsWhenUndefinedHierarchyExists) {
XmlActionExecutor executor;
- executor[u"manifest"][u"application"];
+ executor["manifest"]["application"];
std::unique_ptr<XmlResource> doc = test::buildXmlDom(
"<manifest><application /><activity /></manifest>");
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 0ce333a..39bd5bf 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -33,13 +33,13 @@
struct Stack {
std::unique_ptr<xml::Node> root;
std::stack<xml::Node*> nodeStack;
- std::u16string pendingComment;
+ std::string pendingComment;
};
/**
* Extracts the namespace and name of an expanded element or attribute name.
*/
-static void splitName(const char* name, std::u16string* outNs, std::u16string* outName) {
+static void splitName(const char* name, std::string* outNs, std::string* outName) {
const char* p = name;
while (*p != 0 && *p != kXmlNamespaceSep) {
p++;
@@ -47,10 +47,10 @@
if (*p == 0) {
outNs->clear();
- *outName = util::utf8ToUtf16(name);
+ *outName = StringPiece(name).toString();
} else {
- *outNs = util::utf8ToUtf16(StringPiece(name, (p - name)));
- *outName = util::utf8ToUtf16(p + 1);
+ *outNs = StringPiece(name, (p - name)).toString();
+ *outName = StringPiece(p + 1).toString();
}
}
@@ -76,11 +76,11 @@
std::unique_ptr<Namespace> ns = util::make_unique<Namespace>();
if (prefix) {
- ns->namespacePrefix = util::utf8ToUtf16(prefix);
+ ns->namespacePrefix = StringPiece(prefix).toString();
}
if (uri) {
- ns->namespaceUri = util::utf8ToUtf16(uri);
+ ns->namespaceUri = StringPiece(uri).toString();
}
addToStack(stack, parser, std::move(ns));
@@ -109,7 +109,7 @@
while (*attrs) {
Attribute attribute;
splitName(*attrs++, &attribute.namespaceUri, &attribute.name);
- attribute.value = util::utf8ToUtf16(*attrs++);
+ attribute.value = StringPiece(*attrs++).toString();
// Insert in sorted order.
auto iter = std::lower_bound(el->attributes.begin(), el->attributes.end(), attribute,
@@ -144,14 +144,14 @@
if (!currentParent->children.empty()) {
Node* lastChild = currentParent->children.back().get();
if (Text* text = nodeCast<Text>(lastChild)) {
- text->text += util::utf8ToUtf16(StringPiece(s, len));
+ text->text += StringPiece(s, len).toString();
return;
}
}
}
std::unique_ptr<Text> text = util::make_unique<Text>();
- text->text = util::utf8ToUtf16(StringPiece(s, len));
+ text->text = StringPiece(s, len).toString();
addToStack(stack, parser, std::move(text));
}
@@ -162,7 +162,7 @@
if (!stack->pendingComment.empty()) {
stack->pendingComment += '\n';
}
- stack->pendingComment += util::utf8ToUtf16(comment);
+ stack->pendingComment += comment;
}
std::unique_ptr<XmlResource> inflate(std::istream* in, IDiagnostics* diag, const Source& source) {
@@ -209,17 +209,17 @@
size_t len;
const char16_t* str16 = parser->getAttributeNamespace(i, &len);
if (str16) {
- attr.namespaceUri.assign(str16, len);
+ attr.namespaceUri = util::utf16ToUtf8(StringPiece16(str16, len));
}
str16 = parser->getAttributeName(i, &len);
if (str16) {
- attr.name.assign(str16, len);
+ attr.name = util::utf16ToUtf8(StringPiece16(str16, len));
}
str16 = parser->getAttributeStringValue(i, &len);
if (str16) {
- attr.value.assign(str16, len);
+ attr.value = util::utf16ToUtf8(StringPiece16(str16, len));
}
el->attributes.push_back(std::move(attr));
}
@@ -250,12 +250,12 @@
size_t len;
const char16_t* str16 = tree.getNamespacePrefix(&len);
if (str16) {
- node->namespacePrefix.assign(str16, len);
+ node->namespacePrefix = util::utf16ToUtf8(StringPiece16(str16, len));
}
str16 = tree.getNamespaceUri(&len);
if (str16) {
- node->namespaceUri.assign(str16, len);
+ node->namespaceUri = util::utf16ToUtf8(StringPiece16(str16, len));
}
newNode = std::move(node);
break;
@@ -266,12 +266,12 @@
size_t len;
const char16_t* str16 = tree.getElementNamespace(&len);
if (str16) {
- node->namespaceUri.assign(str16, len);
+ node->namespaceUri = util::utf16ToUtf8(StringPiece16(str16, len));
}
str16 = tree.getElementName(&len);
if (str16) {
- node->name.assign(str16, len);
+ node->name = util::utf16ToUtf8(StringPiece16(str16, len));
}
copyAttributes(node.get(), &tree);
@@ -285,7 +285,7 @@
size_t len;
const char16_t* str16 = tree.getText(&len);
if (str16) {
- node->text.assign(str16, len);
+ node->text = util::utf16ToUtf8(StringPiece16(str16, len));
}
newNode = std::move(node);
break;
@@ -347,7 +347,7 @@
children.push_back(std::move(child));
}
-Attribute* Element::findAttribute(const StringPiece16& ns, const StringPiece16& name) {
+Attribute* Element::findAttribute(const StringPiece& ns, const StringPiece& name) {
for (auto& attr : attributes) {
if (ns == attr.namespaceUri && name == attr.name) {
return &attr;
@@ -356,13 +356,13 @@
return nullptr;
}
-Element* Element::findChild(const StringPiece16& ns, const StringPiece16& name) {
+Element* Element::findChild(const StringPiece& ns, const StringPiece& name) {
return findChildWithAttribute(ns, name, {}, {}, {});
}
-Element* Element::findChildWithAttribute(const StringPiece16& ns, const StringPiece16& name,
- const StringPiece16& attrNs, const StringPiece16& attrName,
- const StringPiece16& attrValue) {
+Element* Element::findChildWithAttribute(const StringPiece& ns, const StringPiece& name,
+ const StringPiece& attrNs, const StringPiece& attrName,
+ const StringPiece& attrValue) {
for (auto& childNode : children) {
Node* child = childNode.get();
while (nodeCast<Namespace>(child)) {
@@ -422,7 +422,7 @@
}
Maybe<ExtractedPackage> PackageAwareVisitor::transformPackageAlias(
- const StringPiece16& alias, const StringPiece16& localPackage) const {
+ const StringPiece& alias, const StringPiece& localPackage) const {
if (alias.empty()) {
return ExtractedPackage{ localPackage.toString(), false /* private */ };
}
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index b374d20..d083d82 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -41,7 +41,7 @@
Node* parent = nullptr;
size_t lineNumber = 0;
size_t columnNumber = 0;
- std::u16string comment;
+ std::string comment;
std::vector<std::unique_ptr<Node>> children;
virtual ~Node() = default;
@@ -63,8 +63,8 @@
* A Namespace XML node. Can only have one child.
*/
struct Namespace : public BaseNode<Namespace> {
- std::u16string namespacePrefix;
- std::u16string namespaceUri;
+ std::string namespacePrefix;
+ std::string namespaceUri;
};
struct AaptAttribute {
@@ -76,9 +76,9 @@
* An XML attribute.
*/
struct Attribute {
- std::u16string namespaceUri;
- std::u16string name;
- std::u16string value;
+ std::string namespaceUri;
+ std::string name;
+ std::string value;
Maybe<AaptAttribute> compiledAttribute;
std::unique_ptr<Item> compiledValue;
@@ -88,16 +88,16 @@
* An Element XML node.
*/
struct Element : public BaseNode<Element> {
- std::u16string namespaceUri;
- std::u16string name;
+ std::string namespaceUri;
+ std::string name;
std::vector<Attribute> attributes;
- Attribute* findAttribute(const StringPiece16& ns, const StringPiece16& name);
- xml::Element* findChild(const StringPiece16& ns, const StringPiece16& name);
- xml::Element* findChildWithAttribute(const StringPiece16& ns, const StringPiece16& name,
- const StringPiece16& attrNs,
- const StringPiece16& attrName,
- const StringPiece16& attrValue);
+ Attribute* findAttribute(const StringPiece& ns, const StringPiece& name);
+ xml::Element* findChild(const StringPiece& ns, const StringPiece& name);
+ xml::Element* findChildWithAttribute(const StringPiece& ns, const StringPiece& name,
+ const StringPiece& attrNs,
+ const StringPiece& attrName,
+ const StringPiece& attrValue);
std::vector<xml::Element*> getChildElements();
};
@@ -105,7 +105,7 @@
* A Text (CDATA) XML node. Can not have any children.
*/
struct Text : public BaseNode<Text> {
- std::u16string text;
+ std::string text;
};
/**
@@ -175,7 +175,7 @@
class PackageAwareVisitor : public Visitor, public IPackageDeclStack {
private:
struct PackageDecl {
- std::u16string prefix;
+ std::string prefix;
ExtractedPackage package;
};
@@ -186,7 +186,7 @@
void visit(Namespace* ns) override;
Maybe<ExtractedPackage> transformPackageAlias(
- const StringPiece16& alias, const StringPiece16& localPackage) const override;
+ const StringPiece& alias, const StringPiece& localPackage) const override;
};
// Implementations
diff --git a/tools/aapt2/xml/XmlDom_test.cpp b/tools/aapt2/xml/XmlDom_test.cpp
index 431ee2c..1909f75 100644
--- a/tools/aapt2/xml/XmlDom_test.cpp
+++ b/tools/aapt2/xml/XmlDom_test.cpp
@@ -43,8 +43,8 @@
xml::Namespace* ns = xml::nodeCast<xml::Namespace>(doc->root.get());
ASSERT_NE(ns, nullptr);
- EXPECT_EQ(ns->namespaceUri, u"http://schemas.android.com/apk/res/android");
- EXPECT_EQ(ns->namespacePrefix, u"android");
+ EXPECT_EQ(ns->namespaceUri, xml::kSchemaAndroid);
+ EXPECT_EQ(ns->namespacePrefix, "android");
}
} // namespace aapt
diff --git a/tools/aapt2/xml/XmlPullParser.cpp b/tools/aapt2/xml/XmlPullParser.cpp
index 323ec05..4a944f1 100644
--- a/tools/aapt2/xml/XmlPullParser.cpp
+++ b/tools/aapt2/xml/XmlPullParser.cpp
@@ -98,7 +98,7 @@
return mLastError;
}
-const std::u16string& XmlPullParser::getComment() const {
+const std::string& XmlPullParser::getComment() const {
return mEventQueue.front().data1;
}
@@ -110,14 +110,14 @@
return mEventQueue.front().depth;
}
-const std::u16string& XmlPullParser::getText() const {
+const std::string& XmlPullParser::getText() const {
if (getEvent() != Event::kText) {
return mEmpty;
}
return mEventQueue.front().data1;
}
-const std::u16string& XmlPullParser::getNamespacePrefix() const {
+const std::string& XmlPullParser::getNamespacePrefix() const {
const Event currentEvent = getEvent();
if (currentEvent != Event::kStartNamespace && currentEvent != Event::kEndNamespace) {
return mEmpty;
@@ -125,7 +125,7 @@
return mEventQueue.front().data1;
}
-const std::u16string& XmlPullParser::getNamespaceUri() const {
+const std::string& XmlPullParser::getNamespaceUri() const {
const Event currentEvent = getEvent();
if (currentEvent != Event::kStartNamespace && currentEvent != Event::kEndNamespace) {
return mEmpty;
@@ -134,7 +134,7 @@
}
Maybe<ExtractedPackage> XmlPullParser::transformPackageAlias(
- const StringPiece16& alias, const StringPiece16& localPackage) const {
+ const StringPiece& alias, const StringPiece& localPackage) const {
if (alias.empty()) {
return ExtractedPackage{ localPackage.toString(), false /* private */ };
}
@@ -152,7 +152,7 @@
return {};
}
-const std::u16string& XmlPullParser::getElementNamespace() const {
+const std::string& XmlPullParser::getElementNamespace() const {
const Event currentEvent = getEvent();
if (currentEvent != Event::kStartElement && currentEvent != Event::kEndElement) {
return mEmpty;
@@ -160,7 +160,7 @@
return mEventQueue.front().data1;
}
-const std::u16string& XmlPullParser::getElementName() const {
+const std::string& XmlPullParser::getElementName() const {
const Event currentEvent = getEvent();
if (currentEvent != Event::kStartElement && currentEvent != Event::kEndElement) {
return mEmpty;
@@ -186,31 +186,31 @@
/**
* Extracts the namespace and name of an expanded element or attribute name.
*/
-static void splitName(const char* name, std::u16string& outNs, std::u16string& outName) {
+static void splitName(const char* name, std::string& outNs, std::string& outName) {
const char* p = name;
while (*p != 0 && *p != kXmlNamespaceSep) {
p++;
}
if (*p == 0) {
- outNs = std::u16string();
- outName = util::utf8ToUtf16(name);
+ outNs = std::string();
+ outName = name;
} else {
- outNs = util::utf8ToUtf16(StringPiece(name, (p - name)));
- outName = util::utf8ToUtf16(p + 1);
+ outNs = StringPiece(name, (p - name)).toString();
+ outName = p + 1;
}
}
void XMLCALL XmlPullParser::startNamespaceHandler(void* userData, const char* prefix,
const char* uri) {
XmlPullParser* parser = reinterpret_cast<XmlPullParser*>(userData);
- std::u16string namespaceUri = uri != nullptr ? util::utf8ToUtf16(uri) : std::u16string();
+ std::string namespaceUri = uri != nullptr ? uri : std::string();
parser->mNamespaceUris.push(namespaceUri);
parser->mEventQueue.push(EventData{
Event::kStartNamespace,
XML_GetCurrentLineNumber(parser->mParser),
parser->mDepth++,
- prefix != nullptr ? util::utf8ToUtf16(prefix) : std::u16string(),
+ prefix != nullptr ? prefix : std::string(),
namespaceUri
});
}
@@ -227,7 +227,7 @@
while (*attrs) {
Attribute attribute;
splitName(*attrs++, attribute.namespaceUri, attribute.name);
- attribute.value = util::utf8ToUtf16(*attrs++);
+ attribute.value = *attrs++;
// Insert in sorted order.
auto iter = std::lower_bound(data.attributes.begin(), data.attributes.end(), attribute);
@@ -245,7 +245,7 @@
Event::kText,
XML_GetCurrentLineNumber(parser->mParser),
parser->mDepth,
- util::utf8ToUtf16(StringPiece(s, len))
+ StringPiece(s, len).toString()
});
}
@@ -268,7 +268,7 @@
Event::kEndNamespace,
XML_GetCurrentLineNumber(parser->mParser),
--(parser->mDepth),
- prefix != nullptr ? util::utf8ToUtf16(prefix) : std::u16string(),
+ prefix != nullptr ? prefix : std::string(),
parser->mNamespaceUris.top()
});
parser->mNamespaceUris.pop();
@@ -281,22 +281,22 @@
Event::kComment,
XML_GetCurrentLineNumber(parser->mParser),
parser->mDepth,
- util::utf8ToUtf16(comment)
+ comment
});
}
-Maybe<StringPiece16> findAttribute(const XmlPullParser* parser, const StringPiece16& name) {
- auto iter = parser->findAttribute(u"", name);
+Maybe<StringPiece> findAttribute(const XmlPullParser* parser, const StringPiece& name) {
+ auto iter = parser->findAttribute("", name);
if (iter != parser->endAttributes()) {
- return StringPiece16(util::trimWhitespace(iter->value));
+ return StringPiece(util::trimWhitespace(iter->value));
}
return {};
}
-Maybe<StringPiece16> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece16& name) {
- auto iter = parser->findAttribute(u"", name);
+Maybe<StringPiece> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece& name) {
+ auto iter = parser->findAttribute("", name);
if (iter != parser->endAttributes()) {
- StringPiece16 trimmed = util::trimWhitespace(iter->value);
+ StringPiece trimmed = util::trimWhitespace(iter->value);
if (!trimmed.empty()) {
return trimmed;
}
diff --git a/tools/aapt2/xml/XmlPullParser.h b/tools/aapt2/xml/XmlPullParser.h
index 7e7070e..ee51b36 100644
--- a/tools/aapt2/xml/XmlPullParser.h
+++ b/tools/aapt2/xml/XmlPullParser.h
@@ -80,28 +80,28 @@
// These are available for all nodes.
//
- const std::u16string& getComment() const;
+ const std::string& getComment() const;
size_t getLineNumber() const;
size_t getDepth() const;
/**
* Returns the character data for a Text event.
*/
- const std::u16string& getText() const;
+ const std::string& getText() const;
//
// Namespace prefix and URI are available for StartNamespace and EndNamespace.
//
- const std::u16string& getNamespacePrefix() const;
- const std::u16string& getNamespaceUri() const;
+ const std::string& getNamespacePrefix() const;
+ const std::string& getNamespaceUri() const;
//
// These are available for StartElement and EndElement.
//
- const std::u16string& getElementNamespace() const;
- const std::u16string& getElementName() const;
+ const std::string& getElementNamespace() const;
+ const std::string& getElementName() const;
/*
* Uses the current stack of namespaces to resolve the package. Eg:
@@ -115,7 +115,7 @@
* 'package' will be set to 'defaultPackage'.
*/
Maybe<ExtractedPackage> transformPackageAlias(
- const StringPiece16& alias, const StringPiece16& localPackage) const override;
+ const StringPiece& alias, const StringPiece& localPackage) const override;
//
// Remaining methods are for retrieving information about attributes
@@ -126,9 +126,9 @@
//
struct Attribute {
- std::u16string namespaceUri;
- std::u16string name;
- std::u16string value;
+ std::string namespaceUri;
+ std::string name;
+ std::string value;
int compare(const Attribute& rhs) const;
bool operator<(const Attribute& rhs) const;
@@ -141,7 +141,7 @@
const_iterator beginAttributes() const;
const_iterator endAttributes() const;
size_t getAttributeCount() const;
- const_iterator findAttribute(StringPiece16 namespaceUri, StringPiece16 name) const;
+ const_iterator findAttribute(StringPiece namespaceUri, StringPiece name) const;
private:
static void XMLCALL startNamespaceHandler(void* userData, const char* prefix, const char* uri);
@@ -155,8 +155,8 @@
Event event;
size_t lineNumber;
size_t depth;
- std::u16string data1;
- std::u16string data2;
+ std::string data1;
+ std::string data2;
std::vector<Attribute> attributes;
};
@@ -165,12 +165,12 @@
char mBuffer[16384];
std::queue<EventData> mEventQueue;
std::string mLastError;
- const std::u16string mEmpty;
+ const std::string mEmpty;
size_t mDepth;
- std::stack<std::u16string> mNamespaceUris;
+ std::stack<std::string> mNamespaceUris;
struct PackageDecl {
- std::u16string prefix;
+ std::string prefix;
ExtractedPackage package;
};
std::vector<PackageDecl> mPackageAliases;
@@ -179,13 +179,13 @@
/**
* Finds the attribute in the current element within the global namespace.
*/
-Maybe<StringPiece16> findAttribute(const XmlPullParser* parser, const StringPiece16& name);
+Maybe<StringPiece> findAttribute(const XmlPullParser* parser, const StringPiece& name);
/**
* Finds the attribute in the current element within the global namespace. The attribute's value
* must not be the empty string.
*/
-Maybe<StringPiece16> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece16& name);
+Maybe<StringPiece> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece& name);
//
// Implementation
@@ -270,12 +270,12 @@
return compare(rhs) != 0;
}
-inline XmlPullParser::const_iterator XmlPullParser::findAttribute(StringPiece16 namespaceUri,
- StringPiece16 name) const {
+inline XmlPullParser::const_iterator XmlPullParser::findAttribute(StringPiece namespaceUri,
+ StringPiece name) const {
const auto endIter = endAttributes();
const auto iter = std::lower_bound(beginAttributes(), endIter,
- std::pair<StringPiece16, StringPiece16>(namespaceUri, name),
- [](const Attribute& attr, const std::pair<StringPiece16, StringPiece16>& rhs) -> bool {
+ std::pair<StringPiece, StringPiece>(namespaceUri, name),
+ [](const Attribute& attr, const std::pair<StringPiece, StringPiece>& rhs) -> bool {
int cmp = attr.namespaceUri.compare(0, attr.namespaceUri.size(),
rhs.first.data(), rhs.first.size());
if (cmp < 0) return true;
diff --git a/tools/aapt2/xml/XmlPullParser_test.cpp b/tools/aapt2/xml/XmlPullParser_test.cpp
index 8fa2c6d..2c1fdc7 100644
--- a/tools/aapt2/xml/XmlPullParser_test.cpp
+++ b/tools/aapt2/xml/XmlPullParser_test.cpp
@@ -14,10 +14,10 @@
* limitations under the License.
*/
+#include "test/Test.h"
#include "util/StringPiece.h"
#include "xml/XmlPullParser.h"
-#include <gtest/gtest.h>
#include <sstream>
namespace aapt {
@@ -32,21 +32,21 @@
ASSERT_TRUE(xml::XmlPullParser::nextChildNode(&parser, depthOuter));
EXPECT_EQ(xml::XmlPullParser::Event::kStartElement, parser.getEvent());
- EXPECT_EQ(StringPiece16(u"a"), StringPiece16(parser.getElementName()));
+ EXPECT_EQ(StringPiece("a"), StringPiece(parser.getElementName()));
const size_t depthA = parser.getDepth();
ASSERT_TRUE(xml::XmlPullParser::nextChildNode(&parser, depthA));
EXPECT_EQ(xml::XmlPullParser::Event::kStartElement, parser.getEvent());
- EXPECT_EQ(StringPiece16(u"b"), StringPiece16(parser.getElementName()));
+ EXPECT_EQ(StringPiece("b"), StringPiece(parser.getElementName()));
const size_t depthB = parser.getDepth();
ASSERT_TRUE(xml::XmlPullParser::nextChildNode(&parser, depthB));
EXPECT_EQ(xml::XmlPullParser::Event::kStartElement, parser.getEvent());
- EXPECT_EQ(StringPiece16(u"c"), StringPiece16(parser.getElementName()));
+ EXPECT_EQ(StringPiece("c"), StringPiece(parser.getElementName()));
ASSERT_TRUE(xml::XmlPullParser::nextChildNode(&parser, depthB));
EXPECT_EQ(xml::XmlPullParser::Event::kStartElement, parser.getEvent());
- EXPECT_EQ(StringPiece16(u"e"), StringPiece16(parser.getElementName()));
+ EXPECT_EQ(StringPiece("e"), StringPiece(parser.getElementName()));
ASSERT_FALSE(xml::XmlPullParser::nextChildNode(&parser, depthOuter));
EXPECT_EQ(xml::XmlPullParser::Event::kEndDocument, parser.getEvent());
diff --git a/tools/aapt2/xml/XmlUtil.cpp b/tools/aapt2/xml/XmlUtil.cpp
index ab9f544..0e9d005 100644
--- a/tools/aapt2/xml/XmlUtil.cpp
+++ b/tools/aapt2/xml/XmlUtil.cpp
@@ -23,19 +23,25 @@
namespace aapt {
namespace xml {
-Maybe<ExtractedPackage> extractPackageFromNamespace(const std::u16string& namespaceUri) {
- if (util::stringStartsWith<char16_t>(namespaceUri, kSchemaPublicPrefix)) {
- StringPiece16 schemaPrefix = kSchemaPublicPrefix;
- StringPiece16 package = namespaceUri;
+std::string buildPackageNamespace(const StringPiece& package) {
+ std::string result = kSchemaPublicPrefix;
+ result.append(package.data(), package.size());
+ return result;
+}
+
+Maybe<ExtractedPackage> extractPackageFromNamespace(const std::string& namespaceUri) {
+ if (util::stringStartsWith(namespaceUri, kSchemaPublicPrefix)) {
+ StringPiece schemaPrefix = kSchemaPublicPrefix;
+ StringPiece package = namespaceUri;
package = package.substr(schemaPrefix.size(), package.size() - schemaPrefix.size());
if (package.empty()) {
return {};
}
return ExtractedPackage{ package.toString(), false /* isPrivate */ };
- } else if (util::stringStartsWith<char16_t>(namespaceUri, kSchemaPrivatePrefix)) {
- StringPiece16 schemaPrefix = kSchemaPrivatePrefix;
- StringPiece16 package = namespaceUri;
+ } else if (util::stringStartsWith(namespaceUri, kSchemaPrivatePrefix)) {
+ StringPiece schemaPrefix = kSchemaPrivatePrefix;
+ StringPiece package = namespaceUri;
package = package.substr(schemaPrefix.size(), package.size() - schemaPrefix.size());
if (package.empty()) {
return {};
@@ -43,13 +49,13 @@
return ExtractedPackage{ package.toString(), true /* isPrivate */ };
} else if (namespaceUri == kSchemaAuto) {
- return ExtractedPackage{ std::u16string(), true /* isPrivate */ };
+ return ExtractedPackage{ std::string(), true /* isPrivate */ };
}
return {};
}
void transformReferenceFromNamespace(IPackageDeclStack* declStack,
- const StringPiece16& localPackage, Reference* inRef) {
+ const StringPiece& localPackage, Reference* inRef) {
if (inRef->name) {
if (Maybe<ExtractedPackage> transformedPackage =
declStack->transformPackageAlias(inRef->name.value().package, localPackage)) {
diff --git a/tools/aapt2/xml/XmlUtil.h b/tools/aapt2/xml/XmlUtil.h
index 98e5520..f0d59b7 100644
--- a/tools/aapt2/xml/XmlUtil.h
+++ b/tools/aapt2/xml/XmlUtil.h
@@ -25,10 +25,10 @@
namespace aapt {
namespace xml {
-constexpr const char16_t* kSchemaAuto = u"http://schemas.android.com/apk/res-auto";
-constexpr const char16_t* kSchemaPublicPrefix = u"http://schemas.android.com/apk/res/";
-constexpr const char16_t* kSchemaPrivatePrefix = u"http://schemas.android.com/apk/prv/res/";
-constexpr const char16_t* kSchemaAndroid = u"http://schemas.android.com/apk/res/android";
+constexpr const char* kSchemaAuto = "http://schemas.android.com/apk/res-auto";
+constexpr const char* kSchemaPublicPrefix = "http://schemas.android.com/apk/res/";
+constexpr const char* kSchemaPrivatePrefix = "http://schemas.android.com/apk/prv/res/";
+constexpr const char* kSchemaAndroid = "http://schemas.android.com/apk/res/android";
/**
* Result of extracting a package name from a namespace URI declaration.
@@ -38,7 +38,7 @@
* The name of the package. This can be the empty string, which means that the package
* should be assumed to be the package being compiled.
*/
- std::u16string package;
+ std::string package;
/**
* True if the package's private namespace was declared. This means that private resources
@@ -55,7 +55,14 @@
* Special case: if namespaceUri is http://schemas.android.com/apk/res-auto,
* returns an empty package name.
*/
-Maybe<ExtractedPackage> extractPackageFromNamespace(const std::u16string& namespaceUri);
+Maybe<ExtractedPackage> extractPackageFromNamespace(const std::string& namespaceUri);
+
+/**
+ * Returns an XML Android namespace for the given package of the form:
+ *
+ * http://schemas.android.com/apk/res/<package>
+ */
+std::string buildPackageNamespace(const StringPiece& package);
/**
* Interface representing a stack of XML namespace declarations. When looking up the package
@@ -68,7 +75,7 @@
* Returns an ExtractedPackage struct if the alias given corresponds with a package declaration.
*/
virtual Maybe<ExtractedPackage> transformPackageAlias(
- const StringPiece16& alias, const StringPiece16& localPackage) const = 0;
+ const StringPiece& alias, const StringPiece& localPackage) const = 0;
};
/**
@@ -77,7 +84,7 @@
* the package declaration was private.
*/
void transformReferenceFromNamespace(IPackageDeclStack* declStack,
- const StringPiece16& localPackage, Reference* inRef);
+ const StringPiece& localPackage, Reference* inRef);
} // namespace xml
} // namespace aapt
diff --git a/tools/aapt2/xml/XmlUtil_test.cpp b/tools/aapt2/xml/XmlUtil_test.cpp
index 319e770..cbeb8bc 100644
--- a/tools/aapt2/xml/XmlUtil_test.cpp
+++ b/tools/aapt2/xml/XmlUtil_test.cpp
@@ -14,40 +14,37 @@
* limitations under the License.
*/
-#include "test/Common.h"
+#include "test/Test.h"
#include "xml/XmlUtil.h"
-#include <gtest/gtest.h>
-
namespace aapt {
TEST(XmlUtilTest, ExtractPackageFromNamespace) {
- AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(u"com.android"));
- AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(u"http://schemas.android.com/apk"));
- AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/res"));
- AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/res/"));
- AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(
- u"http://schemas.android.com/apk/prv/res/"));
+ AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("com.android"));
+ AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("http://schemas.android.com/apk"));
+ AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("http://schemas.android.com/apk/res"));
+ AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("http://schemas.android.com/apk/res/"));
+ AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("http://schemas.android.com/apk/prv/res/"));
Maybe<xml::ExtractedPackage> p =
- xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/res/a");
+ xml::extractPackageFromNamespace("http://schemas.android.com/apk/res/a");
AAPT_ASSERT_TRUE(p);
- EXPECT_EQ(std::u16string(u"a"), p.value().package);
+ EXPECT_EQ(std::string("a"), p.value().package);
EXPECT_FALSE(p.value().privateNamespace);
- p = xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/prv/res/android");
+ p = xml::extractPackageFromNamespace("http://schemas.android.com/apk/prv/res/android");
AAPT_ASSERT_TRUE(p);
- EXPECT_EQ(std::u16string(u"android"), p.value().package);
+ EXPECT_EQ(std::string("android"), p.value().package);
EXPECT_TRUE(p.value().privateNamespace);
- p = xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/prv/res/com.test");
+ p = xml::extractPackageFromNamespace("http://schemas.android.com/apk/prv/res/com.test");
AAPT_ASSERT_TRUE(p);
- EXPECT_EQ(std::u16string(u"com.test"), p.value().package);
+ EXPECT_EQ(std::string("com.test"), p.value().package);
EXPECT_TRUE(p.value().privateNamespace);
- p = xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/res-auto");
+ p = xml::extractPackageFromNamespace("http://schemas.android.com/apk/res-auto");
AAPT_ASSERT_TRUE(p);
- EXPECT_EQ(std::u16string(), p.value().package);
+ EXPECT_EQ(std::string(), p.value().package);
EXPECT_TRUE(p.value().privateNamespace);
}