Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bdb52436 authored by Adam Lesinski's avatar Adam Lesinski Committed by Android Git Automerger
Browse files

am 2f519532: Merge "Add namespace handling in attribute values" into mnc-dev

* commit '2f519532':
  Add namespace handling in attribute values
parents 7f5ea4a5 2f519532
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -40,10 +40,10 @@ sources := \
	ManifestValidator.cpp \
	Png.cpp \
	ResChunkPullParser.cpp \
	Resolver.cpp \
	Resource.cpp \
	ResourceParser.cpp \
	ResourceTable.cpp \
	ResourceTableResolver.cpp \
	ResourceValues.cpp \
	SdkConstants.cpp \
	StringPool.cpp \
+8 −13
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ using namespace android;
 * given a mapping from resource ID to resource name.
 */
struct ReferenceIdToNameVisitor : ValueVisitor {
    ReferenceIdToNameVisitor(const std::shared_ptr<Resolver>& resolver,
    ReferenceIdToNameVisitor(const std::shared_ptr<IResolver>& resolver,
                             std::map<ResourceId, ResourceName>* cache) :
            mResolver(resolver), mCache(cache) {
    }
@@ -96,30 +96,25 @@ private:
            reference.name = cacheIter->second;
            reference.id = 0;
        } else {
            const android::ResTable& table = mResolver->getResTable();
            android::ResTable::resource_name resourceName;
            if (table.getResourceName(reference.id.id, false, &resourceName)) {
                const ResourceType* type = parseResourceType(StringPiece16(resourceName.type,
                                                                           resourceName.typeLen));
                assert(type);
                reference.name.package.assign(resourceName.package, resourceName.packageLen);
                reference.name.type = *type;
                reference.name.entry.assign(resourceName.name, resourceName.nameLen);
                reference.id = 0;
            Maybe<ResourceName> result = mResolver->findName(reference.id);
            if (result) {
                reference.name = result.value();

                // Add to cache.
                mCache->insert({reference.id, reference.name});

                reference.id = 0;
            }
        }
    }

    std::shared_ptr<Resolver> mResolver;
    std::shared_ptr<IResolver> mResolver;
    std::map<ResourceId, ResourceName>* mCache;
};


BinaryResourceParser::BinaryResourceParser(const std::shared_ptr<ResourceTable>& table,
                                           const std::shared_ptr<Resolver>& resolver,
                                           const std::shared_ptr<IResolver>& resolver,
                                           const Source& source,
                                           const void* data,
                                           size_t len) :
+2 −2
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ public:
     * add any resources parsed to `table`. `source` is for logging purposes.
     */
    BinaryResourceParser(const std::shared_ptr<ResourceTable>& table,
                         const std::shared_ptr<Resolver>& resolver,
                         const std::shared_ptr<IResolver>& resolver,
                         const Source& source,
                         const void* data, size_t len);

@@ -92,7 +92,7 @@ private:

    std::shared_ptr<ResourceTable> mTable;

    std::shared_ptr<Resolver> mResolver;
    std::shared_ptr<IResolver> mResolver;

    const Source mSource;

+64 −9
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */

#include "BinaryXmlPullParser.h"
#include "Maybe.h"
#include "Util.h"

#include <androidfw/ResourceTypes.h>
#include <memory>
@@ -77,12 +79,31 @@ XmlPullParser::Event BinaryXmlPullParser::next() {
    mEvent = codeToEvent(code);
    switch (mEvent) {
        case Event::kStartNamespace:
        case Event::kEndNamespace:
        case Event::kEndNamespace: {
            data = mParser->getNamespacePrefix(&len);
            if (data) {
                mStr1.assign(data, len);
            } else {
                mStr1.clear();
            }
            data = mParser->getNamespaceUri(&len);
            if (data) {
                mStr2.assign(data, len);
            } else {
                mStr2.clear();
            }

            Maybe<std::u16string> result = util::extractPackageFromNamespace(mStr2);
            if (result) {
                if (mEvent == Event::kStartNamespace) {
                    mPackageAliases.emplace_back(mStr1, result.value());
                } else {
                    assert(mPackageAliases.back().second == result.value());
                    mPackageAliases.pop_back();
                }
            }
            break;
        }

        case Event::kStartElement:
            copyAttributes();
@@ -90,14 +111,26 @@ XmlPullParser::Event BinaryXmlPullParser::next() {

        case Event::kEndElement:
            data = mParser->getElementNamespace(&len);
            if (data) {
                mStr1.assign(data, len);
            } else {
                mStr1.clear();
            }
            data = mParser->getElementName(&len);
            if (data) {
                mStr2.assign(data, len);
            } else {
                mStr2.clear();
            }
            break;

        case Event::kText:
            data = mParser->getText(&len);
            if (data) {
                mStr1.assign(data, len);
            } else {
                mStr1.clear();
            }
            break;

        default:
@@ -155,6 +188,22 @@ const std::u16string& BinaryXmlPullParser::getNamespaceUri() const {
    return sEmpty;
}

bool BinaryXmlPullParser::applyPackageAlias(std::u16string* package,
                                            const std::u16string& defaultPackage) const {
    const auto endIter = mPackageAliases.rend();
    for (auto iter = mPackageAliases.rbegin(); iter != endIter; ++iter) {
        if (iter->first == *package) {
            if (iter->second.empty()) {
                *package = defaultPackage;
            } else {
                *package = iter->second;
            }
            return true;
        }
    }
    return false;
}

const std::u16string& BinaryXmlPullParser::getElementNamespace() const {
    if (!mHasComment && (mEvent == XmlPullParser::Event::kStartElement ||
            mEvent == XmlPullParser::Event::kEndElement)) {
@@ -191,11 +240,17 @@ void BinaryXmlPullParser::copyAttributes() {
            XmlPullParser::Attribute attr;
            size_t len;
            const char16_t* str = mParser->getAttributeNamespace(i, &len);
            if (str) {
                attr.namespaceUri.assign(str, len);
            }
            str = mParser->getAttributeName(i, &len);
            if (str) {
                attr.name.assign(str, len);
            }
            str = mParser->getAttributeStringValue(i, &len);
            if (str) {
                attr.value.assign(str, len);
            }
            mAttributes.push_back(std::move(attr));
        }
    }
+17 −14
Original line number Diff line number Diff line
@@ -34,25 +34,27 @@ public:
    BinaryXmlPullParser(const std::shared_ptr<android::ResXMLTree>& parser);
    BinaryXmlPullParser(const BinaryXmlPullParser& rhs) = delete;

    Event getEvent() const;
    const std::string& getLastError() const;
    Event next();
    Event getEvent() const override;
    const std::string& getLastError() const override;
    Event next() override;

    const std::u16string& getComment() const;
    size_t getLineNumber() const;
    size_t getDepth() const;
    const std::u16string& getComment() const override;
    size_t getLineNumber() const override;
    size_t getDepth() const override;

    const std::u16string& getText() const;
    const std::u16string& getText() const override;

    const std::u16string& getNamespacePrefix() const;
    const std::u16string& getNamespaceUri() const;
    const std::u16string& getNamespacePrefix() const override;
    const std::u16string& getNamespaceUri() const override;
    bool applyPackageAlias(std::u16string* package, const std::u16string& defaultpackage)
            const override;

    const std::u16string& getElementNamespace() const;
    const std::u16string& getElementName() const;
    const std::u16string& getElementNamespace() const override;
    const std::u16string& getElementName() const override;

    const_iterator beginAttributes() const;
    const_iterator endAttributes() const;
    size_t getAttributeCount() const;
    const_iterator beginAttributes() const override;
    const_iterator endAttributes() const override;
    size_t getAttributeCount() const override;

private:
    void copyAttributes();
@@ -66,6 +68,7 @@ private:
    const std::u16string sEmpty;
    const std::string sEmpty8;
    size_t mDepth;
    std::vector<std::pair<std::u16string, std::u16string>> mPackageAliases;
};

} // namespace aapt
Loading