]> git.saurik.com Git - android/aapt.git/commitdiff
am fa5c7e1d: Catch when a file resource (non values) added in an overlay.
authorRobert Greenwalt <robdroid@android.com>
Mon, 8 Jun 2009 18:06:48 +0000 (11:06 -0700)
committerThe Android Open Source Project <initial-contribution@android.com>
Mon, 8 Jun 2009 18:06:48 +0000 (11:06 -0700)
Merge commit 'fa5c7e1dfede7e26260789dd2de5175497e9659b'

* commit 'fa5c7e1dfede7e26260789dd2de5175497e9659b':
  Catch when a file resource (non values) added in an overlay.

1  2 
Resource.cpp

diff --combined Resource.cpp
index 76b9d0ab7c9fb71820a325787d8a6b6a85a667b3,027e3ab3883d6601b43f94158085125981601343..81db3233ea4d3d3301679dd8327df9ea663d546e
@@@ -45,6 -45,13 +45,6 @@@ static String8 parseResourceName(const 
      }
  }
  
 -class ResourceTypeSet : public RefBase,
 -                        public KeyedVector<String8,sp<AaptGroup> >
 -{
 -public:
 -    ResourceTypeSet();
 -};
 -
  ResourceTypeSet::ResourceTypeSet()
      :RefBase(),
       KeyedVector<String8,sp<AaptGroup> >()
@@@ -426,7 -433,7 +426,7 @@@ static void checkForIds(const String8& 
      }
  }
  
- static void applyFileOverlay(const sp<AaptAssets>& assets, 
+ static bool applyFileOverlay(const sp<AaptAssets>& assets,
                               const sp<ResourceTypeSet>& baseSet,
                               const char *resType)
  {
      // 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();
              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.
                      }
                  } 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
          // try next overlay
          overlay = overlay->getOverlay();
      }
-     return;
+     return true;
  }
  
  void addTagAttribute(const sp<XMLNode>& node, const char* ns8,
@@@ -611,13 -619,15 +612,15 @@@ status_t buildResources(Bundle* bundle
          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;
  
                  printf("  Writing public definitions to %s.\n", bundle->getPublicOutputFile());
              }
              table.writePublicDefinitions(String16(assets->getPackage()), fp);
 +            fclose(fp);
          }
  
          NOISY(
              return err;
          }
      }
 -
      return err;
  }