]> git.saurik.com Git - android/aapt.git/commitdiff
am 5580e44c: Merge "Support changing style parent in overlays"
authorJean-Baptiste Queru <jbq@google.com>
Fri, 5 Nov 2010 21:05:41 +0000 (14:05 -0700)
committerAndroid Git Automerger <android-git-automerger@android.com>
Fri, 5 Nov 2010 21:05:41 +0000 (14:05 -0700)
* commit '5580e44c250944f5cd011b2682eea5cc2de9706c':
  Support changing style parent in overlays

1  2 
ResourceTable.cpp

diff --combined ResourceTable.cpp
index 29644a69b4c7bee075b5616658312ff696a7dea0,82c143d335878c4725eed33a85abf77fb70632c1..fc576a67f10d383d5ef6ffa8ba3e469979f10288
@@@ -573,8 -573,6 +573,8 @@@ status_t parseAndAddBag(Bundle* bundle
                          const String16& parentIdent,
                          const String16& itemIdent,
                          int32_t curFormat,
 +                        bool isFormatted,
 +                        const String16& product,
                          bool pseudolocalize,
                          const bool overwrite,
                          ResourceTable* outTable)
      String16 str;
      Vector<StringPool::entry_style_span> spans;
      err = parseStyledString(bundle, in->getPrintableSource().string(),
 -                            block, item16, &str, &spans,
 +                            block, item16, &str, &spans, isFormatted,
                              pseudolocalize);
      if (err != NO_ERROR) {
          return err;
      return err;
  }
  
 +/*
 + * Returns true if needle is one of the elements in the comma-separated list
 + * haystack, false otherwise.
 + */
 +bool isInProductList(const String16& needle, const String16& haystack) {
 +    const char16_t *needle2 = needle.string();
 +    const char16_t *haystack2 = haystack.string();
 +    size_t needlesize = needle.size();
 +
 +    while (*haystack2 != '\0') {
 +        if (strncmp16(haystack2, needle2, needlesize) == 0) {
 +            if (haystack2[needlesize] == '\0' || haystack2[needlesize] == ',') {
 +                return true;
 +            }
 +        }
 +
 +        while (*haystack2 != '\0' && *haystack2 != ',') {
 +            haystack2++;
 +        }
 +        if (*haystack2 == ',') {
 +            haystack2++;
 +        }
 +    }
 +
 +    return false;
 +}
  
  status_t parseAndAddEntry(Bundle* bundle,
                          const sp<AaptFile>& in,
                          const String16& curTag,
                          bool curIsStyled,
                          int32_t curFormat,
 +                        bool isFormatted,
 +                        const String16& product,
                          bool pseudolocalize,
                          const bool overwrite,
                          ResourceTable* outTable)
      Vector<StringPool::entry_style_span> spans;
      err = parseStyledString(bundle, in->getPrintableSource().string(), block,
                              curTag, &str, curIsStyled ? &spans : NULL,
 -                            pseudolocalize);
 +                            isFormatted, pseudolocalize);
  
      if (err < NO_ERROR) { 
          return err;
      }
  
 +    /*
 +     * If a product type was specified on the command line
 +     * and also in the string, and the two are not the same,
 +     * return without adding the string.
 +     */
 +
 +    const char *bundleProduct = bundle->getProduct();
 +    if (bundleProduct == NULL) {
 +        bundleProduct = "";
 +    }
 +
 +    if (product.size() != 0) {
 +        /*
 +         * If the command-line-specified product is empty, only "default"
 +         * matches.  Other variants are skipped.  This is so generation
 +         * of the R.java file when the product is not known is predictable.
 +         */
 +
 +        if (bundleProduct[0] == '\0') {
 +            if (strcmp16(String16("default").string(), product.string()) != 0) {
 +                return NO_ERROR;
 +            }
 +        } else {
 +            /*
 +             * The command-line product is not empty.
 +             * If the product for this string is on the command-line list,
 +             * it matches.  "default" also matches, but only if nothing
 +             * else has matched already.
 +             */
 +
 +            if (isInProductList(product, String16(bundleProduct))) {
 +                ;
 +            } else if (strcmp16(String16("default").string(), product.string()) == 0 &&
 +                       !outTable->hasBagOrEntry(myPackage, curType, ident)) {
 +                ;
 +            } else {
 +                return NO_ERROR;
 +            }
 +        }
 +    }
 +
      NOISY(printf("Adding resource entry l=%c%c c=%c%c orien=%d d=%d id=%s: %s\n",
                   config.language[0], config.language[1],
                   config.country[0], config.country[1],
@@@ -780,18 -709,12 +780,18 @@@ status_t compileResourceFile(Bundle* bu
      // useful attribute names and special values
      const String16 name16("name");
      const String16 translatable16("translatable");
 +    const String16 formatted16("formatted");
      const String16 false16("false");
  
      const String16 myPackage(assets->getPackage());
  
      bool hasErrors = false;
 -    
 +
 +    bool fileIsTranslatable = true;
 +    if (strstr(in->getPrintableSource().string(), "donottranslate") != NULL) {
 +        fileIsTranslatable = false;
 +    }
 +
      DefaultKeyedVector<String16, uint32_t> nextPublicId(0);
  
      ResXMLTree::event_code_t code;
              bool curIsBagReplaceOnOverwrite = false;
              bool curIsStyled = false;
              bool curIsPseudolocalizable = false;
 +            bool curIsFormatted = fileIsTranslatable;
              bool localHasErrors = false;
  
              if (strcmp16(block.getElementName(&len), skip16.string()) == 0) {
                  String8 locale(rawLocale);
                  String16 name;
                  String16 translatable;
 +                String16 formatted;
  
                  size_t n = block.getAttributeCount();
                  for (size_t i = 0; i < n; i++) {
                          name.setTo(block.getAttributeStringValue(i, &length));
                      } else if (strcmp16(attr, translatable16.string()) == 0) {
                          translatable.setTo(block.getAttributeStringValue(i, &length));
 +                    } else if (strcmp16(attr, formatted16.string()) == 0) {
 +                        formatted.setTo(block.getAttributeStringValue(i, &length));
                      }
                  }
                  
                  if (name.size() > 0) {
                      if (translatable == false16) {
 +                        curIsFormatted = false;
                          // Untranslatable strings must only exist in the default [empty] locale
                          if (locale.size() > 0) {
                              fprintf(stderr, "aapt: warning: string '%s' in %s marked untranslatable but exists"
                      } else {
                          outTable->addLocalization(name, locale);
                      }
 +
 +                    if (formatted == false16) {
 +                        curIsFormatted = false;
 +                    }
                  }
  
                  curTag = &string16;
                  hasErrors = localHasErrors = true;
              }
  
 +            String16 product;
 +            identIdx = block.indexOfAttribute(NULL, "product");
 +            if (identIdx >= 0) {
 +                product = String16(block.getAttributeStringValue(identIdx, &len));
 +            }
 +
              String16 comment(block.getComment(&len) ? block.getComment(&len) : nulStr);
              
              if (curIsBag) {
                          block.getPosition(&parserPosition);
  
                          err = parseAndAddBag(bundle, in, &block, curParams, myPackage, curType,
 -                                ident, parentIdent, itemIdent, curFormat, 
 -                                false, overwrite, outTable);
 +                                ident, parentIdent, itemIdent, curFormat, curIsFormatted,
 +                                product, false, overwrite, outTable);
                          if (err == NO_ERROR) {
                              if (curIsPseudolocalizable && localeIsDefined(curParams)
                                      && bundle->getPseudolocalize()) {
  #if 1
                                  block.setPosition(parserPosition);
                                  err = parseAndAddBag(bundle, in, &block, pseudoParams, myPackage,
 -                                        curType, ident, parentIdent, itemIdent, curFormat, true,
 -                                        overwrite, outTable);
 +                                        curType, ident, parentIdent, itemIdent, curFormat,
 +                                        curIsFormatted, product, true, overwrite, outTable);
  #endif
                              }
                          } 
                  block.getPosition(&parserPosition);
  
                  err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident,
 -                        *curTag, curIsStyled, curFormat, false, overwrite, outTable);
 +                        *curTag, curIsStyled, curFormat, curIsFormatted,
 +                        product, false, overwrite, outTable);
  
                  if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR?
                      hasErrors = localHasErrors = true;
                          // pseudolocalize here
                          block.setPosition(parserPosition);
                          err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType,
 -                                ident, *curTag, curIsStyled, curFormat, true, overwrite, outTable);
 +                                ident, *curTag, curIsStyled, curFormat,
 +                                curIsFormatted, product,
 +                                true, overwrite, outTable);
                          if (err != NO_ERROR) {
                              hasErrors = localHasErrors = true;
                          }
@@@ -1724,13 -1629,6 +1724,6 @@@ status_t ResourceTable::startBag(const 
      
      // If a parent is explicitly specified, set it.
      if (bagParent.size() > 0) {
-         String16 curPar = e->getParent();
-         if (curPar.size() > 0 && curPar != bagParent) {
-             sourcePos.error("Conflicting parents specified, was '%s', now '%s'\n",
-                             String8(e->getParent()).string(),
-                             String8(bagParent).string());
-             return UNKNOWN_ERROR;
-         }
          e->setParent(bagParent);
      }
  
@@@ -1778,13 -1676,6 +1771,6 @@@ status_t ResourceTable::addBag(const So
  
      // If a parent is explicitly specified, set it.
      if (bagParent.size() > 0) {
-         String16 curPar = e->getParent();
-         if (curPar.size() > 0 && curPar != bagParent) {
-             sourcePos.error("Conflicting parents specified, was '%s', now '%s'\n",
-                     String8(e->getParent()).string(),
-                     String8(bagParent).string());
-             return UNKNOWN_ERROR;
-         }
          e->setParent(bagParent);
      }