]> git.saurik.com Git - android/aapt.git/commitdiff
am 63e43ba5: Merge "Fix for issue 9656 - custom xml attributes in Android Libraries"
authorJean-Baptiste Queru <jbq@google.com>
Thu, 23 Feb 2012 20:57:03 +0000 (12:57 -0800)
committerAndroid Git Automerger <android-git-automerger@android.com>
Thu, 23 Feb 2012 20:57:03 +0000 (12:57 -0800)
* commit '63e43ba56a95708c229eec539a544967f1bbb7d7':
  Fix for issue 9656 - custom xml attributes in Android Libraries

1  2 
XMLNode.cpp

diff --combined XMLNode.cpp
index 95a68d174580712c02e18331a4d510439a96aff4,d9782b01f0e61b641bdfe702ffb1a7e43eb86bd3..9ee6c84718d20e9a47af8578bd63033a7a0c171a
@@@ -21,6 -21,7 +21,7 @@@
  
  const char* const RESOURCES_ROOT_NAMESPACE = "http://schemas.android.com/apk/res/";
  const char* const RESOURCES_ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android";
+ const char* const RESOURCES_AUTO_PACKAGE_NAMESPACE = "http://schemas.android.com/apk/res/auto";
  const char* const RESOURCES_ROOT_PRV_NAMESPACE = "http://schemas.android.com/apk/prv/res/";
  
  const char* const XLIFF_XMLNS = "urn:oasis:names:tc:xliff:document:1.2";
@@@ -44,16 -45,20 +45,21 @@@ bool isWhitespace(const char16_t* str
  }
  
  static const String16 RESOURCES_PREFIX(RESOURCES_ROOT_NAMESPACE);
+ static const String16 RESOURCES_PREFIX_AUTO_PACKAGE(RESOURCES_AUTO_PACKAGE_NAMESPACE);
  static const String16 RESOURCES_PRV_PREFIX(RESOURCES_ROOT_PRV_NAMESPACE);
 +static const String16 RESOURCES_TOOLS_NAMESPACE("http://schemas.android.com/tools");
  
- String16 getNamespaceResourcePackage(String16 namespaceUri, bool* outIsPublic)
+ String16 getNamespaceResourcePackage(String16 appPackage, String16 namespaceUri, bool* outIsPublic)
  {
      //printf("%s starts with %s?\n", String8(namespaceUri).string(),
      //       String8(RESOURCES_PREFIX).string());
      size_t prefixSize;
      bool isPublic = true;
-     if (namespaceUri.startsWith(RESOURCES_PREFIX)) {
+     if(namespaceUri.startsWith(RESOURCES_PREFIX_AUTO_PACKAGE)) {
+         NOISY(printf("Using default application package: %s -> %s\n", String8(namespaceUri).string(), String8(appPackage).string()));
+         isPublic = true;
+         return appPackage;
+     } else if (namespaceUri.startsWith(RESOURCES_PREFIX)) {
          prefixSize = RESOURCES_PREFIX.size();
      } else if (namespaceUri.startsWith(RESOURCES_PRV_PREFIX)) {
          isPublic = false;
@@@ -762,16 -767,13 +768,16 @@@ status_t XMLNode::addAttribute(const St
          SourcePos(mFilename, getStartLineNumber()).error("Child to CDATA node.");
          return UNKNOWN_ERROR;
      }
 -    attribute_entry e;
 -    e.index = mNextAttributeIndex++;
 -    e.ns = ns;
 -    e.name = name;
 -    e.string = value;
 -    mAttributes.add(e);
 -    mAttributeOrder.add(e.index, mAttributes.size()-1);
 +
 +    if (ns != RESOURCES_TOOLS_NAMESPACE) {
 +        attribute_entry e;
 +        e.index = mNextAttributeIndex++;
 +        e.ns = ns;
 +        e.name = name;
 +        e.string = value;
 +        mAttributes.add(e);
 +        mAttributeOrder.add(e.index, mAttributes.size()-1);
 +    }
      return NO_ERROR;
  }
  
@@@ -926,7 -928,7 +932,7 @@@ status_t XMLNode::assignResourceIds(con
              const attribute_entry& e = mAttributes.itemAt(i);
              if (e.ns.size() <= 0) continue;
              bool nsIsPublic;
-             String16 pkg(getNamespaceResourcePackage(e.ns, &nsIsPublic));
+             String16 pkg(getNamespaceResourcePackage(String16(assets->getPackage()), e.ns, &nsIsPublic));
              NOISY(printf("Elem %s %s=\"%s\": namespace(%s) %s ===> %s\n",
                      String8(getElementName()).string(),
                      String8(e.name).string(),
@@@ -1219,13 -1221,11 +1225,13 @@@ status_t XMLNode::collect_strings(Strin
      collect_attr_strings(dest, outResIds, true);
      
      int i;
 -    if (mNamespacePrefix.size() > 0) {
 -        dest->add(mNamespacePrefix, true);
 -    }
 -    if (mNamespaceUri.size() > 0) {
 -        dest->add(mNamespaceUri, true);
 +    if (RESOURCES_TOOLS_NAMESPACE != mNamespaceUri) {
 +        if (mNamespacePrefix.size() > 0) {
 +            dest->add(mNamespacePrefix, true);
 +        }
 +        if (mNamespaceUri.size() > 0) {
 +            dest->add(mNamespaceUri, true);
 +        }
      }
      if (mElementName.size() > 0) {
          dest->add(mElementName, true);
@@@ -1344,7 -1344,6 +1350,7 @@@ status_t XMLNode::flatten_node(const St
      const void* extData = NULL;
      size_t extSize = 0;
      ResXMLTree_attribute attr;
 +    bool writeCurrentNode = true;
  
      const size_t NA = mAttributes.size();
      const size_t NC = mChildren.size();
      const String16 style16("style");
  
      const type type = getType();
 -    
 +
      memset(&node, 0, sizeof(node));
      memset(&attr, 0, sizeof(attr));
      node.header.headerSize = htods(sizeof(node));
              }
          }
      } else if (type == TYPE_NAMESPACE) {
 -        node.header.type = htods(RES_XML_START_NAMESPACE_TYPE);
 -        extData = &namespaceExt;
 -        extSize = sizeof(namespaceExt);
 -        memset(&namespaceExt, 0, sizeof(namespaceExt));
 -        if (mNamespacePrefix.size() > 0) {
 -            namespaceExt.prefix.index = htodl(strings.offsetForString(mNamespacePrefix));
 +        if (mNamespaceUri == RESOURCES_TOOLS_NAMESPACE) {
 +            writeCurrentNode = false;
          } else {
 -            namespaceExt.prefix.index = htodl((uint32_t)-1);
 +            node.header.type = htods(RES_XML_START_NAMESPACE_TYPE);
 +            extData = &namespaceExt;
 +            extSize = sizeof(namespaceExt);
 +            memset(&namespaceExt, 0, sizeof(namespaceExt));
 +            if (mNamespacePrefix.size() > 0) {
 +                namespaceExt.prefix.index = htodl(strings.offsetForString(mNamespacePrefix));
 +            } else {
 +                namespaceExt.prefix.index = htodl((uint32_t)-1);
 +            }
 +            namespaceExt.prefix.index = htodl(strings.offsetForString(mNamespacePrefix));
 +            namespaceExt.uri.index = htodl(strings.offsetForString(mNamespaceUri));
          }
 -        namespaceExt.prefix.index = htodl(strings.offsetForString(mNamespacePrefix));
 -        namespaceExt.uri.index = htodl(strings.offsetForString(mNamespaceUri));
          LOG_ALWAYS_FATAL_IF(NA != 0, "Namespace nodes can't have attributes!");
      } else if (type == TYPE_CDATA) {
          node.header.type = htods(RES_XML_CDATA_TYPE);
  
      node.header.size = htodl(sizeof(node) + extSize + (sizeof(attr)*NA));
  
 -    dest->writeData(&node, sizeof(node));
 -    if (extSize > 0) {
 -        dest->writeData(extData, extSize);
 +    if (writeCurrentNode) {
 +        dest->writeData(&node, sizeof(node));
 +        if (extSize > 0) {
 +            dest->writeData(extData, extSize);
 +        }
      }
  
      for (i=0; i<NA; i++) {
          dest->writeData(&node, sizeof(node));
          dest->writeData(&endElementExt, sizeof(endElementExt));
      } else if (type == TYPE_NAMESPACE) {
 -        node.header.type = htods(RES_XML_END_NAMESPACE_TYPE);
 -        node.lineNumber = htodl(getEndLineNumber());
 -        node.comment.index = htodl((uint32_t)-1);
 -        node.header.size = htodl(sizeof(node)+extSize);
 -        dest->writeData(&node, sizeof(node));
 -        dest->writeData(extData, extSize);
 +        if (writeCurrentNode) {
 +            node.header.type = htods(RES_XML_END_NAMESPACE_TYPE);
 +            node.lineNumber = htodl(getEndLineNumber());
 +            node.comment.index = htodl((uint32_t)-1);
 +            node.header.size = htodl(sizeof(node)+extSize);
 +            dest->writeData(&node, sizeof(node));
 +            dest->writeData(extData, extSize);
 +        }
      }
  
      return NO_ERROR;