summaryrefslogtreecommitdiffstats
path: root/tools/aapt/Resource.cpp
diff options
context:
space:
mode:
authorRobert Greenwalt <robdroid@android.com>2009-06-05 18:53:26 -0700
committerRobert Greenwalt <robdroid@android.com>2009-06-08 09:10:29 -0700
commitfa5c7e1dfede7e26260789dd2de5175497e9659b (patch)
treececa995a4e4ed0429ea337c0a931f7c3febf8556 /tools/aapt/Resource.cpp
parent1e3d1b4b83452286b000b8cd1997e5aef97fe2a7 (diff)
downloadframeworks_base-fa5c7e1dfede7e26260789dd2de5175497e9659b.zip
frameworks_base-fa5c7e1dfede7e26260789dd2de5175497e9659b.tar.gz
frameworks_base-fa5c7e1dfede7e26260789dd2de5175497e9659b.tar.bz2
Catch when a file resource (non values) added in an overlay.
File resources are assigned resource id's and if an overlay adds one it renumbers things and breaks compatability. Used to segfault if you tried before, but now catches it and lets you know what file caused the problem.
Diffstat (limited to 'tools/aapt/Resource.cpp')
-rw-r--r--tools/aapt/Resource.cpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index 49ccf71..027e3ab 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -433,7 +433,7 @@ static void checkForIds(const String8& path, ResXMLParser& parser)
}
}
-static void applyFileOverlay(const sp<AaptAssets>& assets,
+static bool applyFileOverlay(const sp<AaptAssets>& assets,
const sp<ResourceTypeSet>& baseSet,
const char *resType)
{
@@ -441,7 +441,7 @@ static void applyFileOverlay(const sp<AaptAssets>& assets,
// Also add any found only in the overlay.
sp<AaptAssets> overlay = assets->getOverlay();
String8 resTypeString(resType);
-
+
// work through the linked list of overlays
while (overlay.get()) {
KeyedVector<String8, sp<ResourceTypeSet> >* overlayRes = overlay->getResources();
@@ -456,7 +456,7 @@ static void applyFileOverlay(const sp<AaptAssets>& assets,
size_t overlayCount = overlaySet->size();
for (size_t overlayIndex=0; overlayIndex<overlayCount; overlayIndex++) {
size_t baseIndex = baseSet->indexOfKey(overlaySet->keyAt(overlayIndex));
- if (baseIndex != UNKNOWN_ERROR) {
+ if (baseIndex < UNKNOWN_ERROR) {
// look for same flavor. For a given file (strings.xml, for example)
// there may be a locale specific or other flavors - we want to match
// the same flavor.
@@ -482,9 +482,10 @@ static void applyFileOverlay(const sp<AaptAssets>& assets,
}
} else {
// this group doesn't exist (a file that's only in the overlay)
- // add it
- baseSet->add(overlaySet->keyAt(overlayIndex),
- overlaySet->valueAt(overlayIndex));
+ fprintf(stderr, "aapt: error: "
+ "*** Resource file '%s' exists only in an overlay\n",
+ overlaySet->keyAt(overlayIndex).string());
+ return false;
}
}
// this overlay didn't have resources for this type
@@ -492,7 +493,7 @@ static void applyFileOverlay(const sp<AaptAssets>& assets,
// try next overlay
overlay = overlay->getOverlay();
}
- return;
+ return true;
}
void addTagAttribute(const sp<XMLNode>& node, const char* ns8,
@@ -618,13 +619,15 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets)
current = current->getOverlay();
}
// apply the overlay files to the base set
- applyFileOverlay(assets, drawables, "drawable");
- applyFileOverlay(assets, layouts, "layout");
- applyFileOverlay(assets, anims, "anim");
- applyFileOverlay(assets, xmls, "xml");
- applyFileOverlay(assets, raws, "raw");
- applyFileOverlay(assets, colors, "color");
- applyFileOverlay(assets, menus, "menu");
+ if (!applyFileOverlay(assets, drawables, "drawable") ||
+ !applyFileOverlay(assets, layouts, "layout") ||
+ !applyFileOverlay(assets, anims, "anim") ||
+ !applyFileOverlay(assets, xmls, "xml") ||
+ !applyFileOverlay(assets, raws, "raw") ||
+ !applyFileOverlay(assets, colors, "color") ||
+ !applyFileOverlay(assets, menus, "menu")) {
+ return UNKNOWN_ERROR;
+ }
bool hasErrors = false;