Properly mangle file names
Change-Id: I49c0f82e8c06f056198eb64b8369d83403b74321
diff --git a/tools/aapt2/TableFlattener.cpp b/tools/aapt2/TableFlattener.cpp
index 67c56e7..4aadadc 100644
--- a/tools/aapt2/TableFlattener.cpp
+++ b/tools/aapt2/TableFlattener.cpp
@@ -43,8 +43,7 @@
*/
class MapFlattener : public ConstValueVisitor {
public:
- MapFlattener(BigBuffer* out, const FlatEntry& flatEntry,
- std::vector<std::pair<ResourceNameRef, uint32_t>>& symbols) :
+ MapFlattener(BigBuffer* out, const FlatEntry& flatEntry, SymbolEntryVector* symbols) :
mOut(out), mSymbols(symbols) {
mMap = mOut->nextBlock<android::ResTable_map_entry>();
mMap->key.index = flatEntry.entryKey;
@@ -65,7 +64,7 @@
void flattenParent(const Reference& ref) {
if (!ref.id.isValid()) {
- mSymbols.push_back({
+ mSymbols->push_back({
ResourceNameRef(ref.name),
(mOut->size() - mMap->size) + sizeof(*mMap) - sizeof(android::ResTable_entry)
});
@@ -80,7 +79,7 @@
// Write the key.
if (!Res_INTERNALID(key.id.id) && !key.id.isValid()) {
- mSymbols.push_back(std::make_pair(ResourceNameRef(key.name),
+ mSymbols->push_back(std::make_pair(ResourceNameRef(key.name),
mOut->size() - sizeof(*outMapEntry)));
}
outMapEntry->name.ident = key.id.id;
@@ -90,7 +89,7 @@
if (outMapEntry->value.data == 0x0) {
visitFunc<Reference>(value, [&](const Reference& reference) {
- mSymbols.push_back(std::make_pair(ResourceNameRef(reference.name),
+ mSymbols->push_back(std::make_pair(ResourceNameRef(reference.name),
mOut->size() - sizeof(outMapEntry->value.data)));
});
}
@@ -188,16 +187,47 @@
private:
BigBuffer* mOut;
- std::vector<std::pair<ResourceNameRef, uint32_t>>& mSymbols;
+ SymbolEntryVector* mSymbols;
android::ResTable_map_entry* mMap;
};
+/**
+ * Flattens a value, with special handling for References.
+ */
+struct ValueFlattener : ConstValueVisitor {
+ ValueFlattener(BigBuffer* out, SymbolEntryVector* symbols) :
+ result(false), mOut(out), mOutValue(nullptr), mSymbols(symbols) {
+ mOutValue = mOut->nextBlock<android::Res_value>();
+ }
+
+ virtual void visit(const Reference& ref, ValueVisitorArgs& a) override {
+ visitItem(ref, a);
+ if (mOutValue->data == 0x0) {
+ mSymbols->push_back({
+ ResourceNameRef(ref.name),
+ mOut->size() - sizeof(mOutValue->data)});
+ }
+ }
+
+ virtual void visitItem(const Item& item, ValueVisitorArgs&) override {
+ result = item.flatten(*mOutValue);
+ mOutValue->size = sizeof(*mOutValue);
+ }
+
+ bool result;
+
+private:
+ BigBuffer* mOut;
+ android::Res_value* mOutValue;
+ SymbolEntryVector* mSymbols;
+};
+
TableFlattener::TableFlattener(Options options)
: mOptions(options) {
}
bool TableFlattener::flattenValue(BigBuffer* out, const FlatEntry& flatEntry,
- std::vector<std::pair<ResourceNameRef, uint32_t>>& symbolEntries) {
+ SymbolEntryVector* symbols) {
if (flatEntry.value.isItem()) {
android::ResTable_entry* entry = out->nextBlock<android::ResTable_entry>();
@@ -218,30 +248,16 @@
ResTable_entry_source* sourceBlock = out->nextBlock<ResTable_entry_source>();
sourceBlock->pathIndex = flatEntry.sourcePathKey;
sourceBlock->line = flatEntry.sourceLine;
-
entry->size += sizeof(*sourceBlock);
}
- android::Res_value* outValue = out->nextBlock<android::Res_value>();
-
- const Item& item = static_cast<const Item&>(flatEntry.value);
- if (!item.flatten(*outValue)) {
- return false;
- }
-
- if (outValue->data == 0x0) {
- visitFunc<Reference>(item, [&](const Reference& reference) {
- symbolEntries.push_back({
- ResourceNameRef(reference.name),
- out->size() - sizeof(outValue->data)
- });
- });
- }
- outValue->size = sizeof(*outValue);
- return true;
+ const Item* item = static_cast<const Item*>(&flatEntry.value);
+ ValueFlattener flattener(out, symbols);
+ item->accept(flattener, {});
+ return flattener.result;
}
- MapFlattener flattener(out, flatEntry, symbolEntries);
+ MapFlattener flattener(out, flatEntry, symbols);
flatEntry.value.accept(flattener, {});
return true;
}
@@ -263,7 +279,7 @@
return false;
}
- std::vector<std::pair<ResourceNameRef, uint32_t>> symbolEntries;
+ SymbolEntryVector symbolEntries;
StringPool typePool;
StringPool keyPool;
@@ -401,7 +417,7 @@
for (const FlatEntry& flatEntry : entry.second) {
assert(flatEntry.entry.entryId < type->entries.size());
indices[flatEntry.entry.entryId] = typeBlock.size() - entryStart;
- if (!flattenValue(&typeBlock, flatEntry, symbolEntries)) {
+ if (!flattenValue(&typeBlock, flatEntry, &symbolEntries)) {
Logger::error()
<< "failed to flatten resource '"
<< ResourceNameRef {