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

Commit 648b7c99 authored by Christopher Lais's avatar Christopher Lais Committed by Steve Kondik
Browse files

aapt: Reorder strings

DO NOT UPLOAD.  THIS IS A HUGE HACK.
Need to rewrite to not use std::set (SortedVector is too slow).
THIS IS A HUGE HACK EVEN WITHOUT std::set.
parent c602e3e3
Loading
Loading
Loading
Loading
+43 −4
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@
#include <utils/ResourceTypes.h>
#include <stdarg.h>

#include <set>

#define NOISY(x) //x

status_t compileXmlFile(const sp<AaptAssets>& assets,
@@ -2492,6 +2494,34 @@ ResourceFilter::match(const ResTable_config& config)
    return true;
}

class entry_sort_t {
public:
	sp<ResourceTable::Package> p;
	sp<ResourceTable::Type> t;
	sp<ResourceTable::ConfigList> c;
	ResourceTable::ConfigDescription config;
	sp<ResourceTable::Entry> e;

	entry_sort_t() { }
	entry_sort_t(
		sp<ResourceTable::Package> p,
		sp<ResourceTable::Type> t,
		sp<ResourceTable::ConfigList> c,
		const ResourceTable::ConfigDescription &config,
		sp<ResourceTable::Entry> e)
	: p(p), t(t), c(c), config(config), e(e) { }

	bool operator < (const entry_sort_t &o) const {
		int cmp;
		if ((cmp = compare_type(config, o.config))) return cmp < 0;
		if ((cmp = compare_type(t, o.t))) return cmp < 0;
		if ((cmp = compare_type(e, o.e))) return cmp < 0;
		if ((cmp = compare_type(c, o.c))) return cmp < 0;
		if ((cmp = compare_type(p, o.p))) return cmp < 0;
		return false;
	}
};

status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
{
    ResourceFilter filter;
@@ -2503,6 +2533,8 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
    const size_t N = mOrderedPackages.size();
    size_t pi;

    std::set< entry_sort_t > sortedEntries;

    // Iterate through all data, collecting all values (strings,
    // references, etc).
    StringPool valueStrings;
@@ -2542,10 +2574,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
                        continue;
                    }
                    e->setNameIndex(keyStrings.add(e->getName(), true));
                    status_t err = e->prepareFlatten(&valueStrings, this);
                    if (err != NO_ERROR) {
                        return err;
                    }
                    sortedEntries.insert(entry_sort_t(p, t, c, config, e));
                }
            }
        }
@@ -2554,6 +2583,16 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
        p->setKeyStrings(keyStrings.createStringBlock());
    }

    for (std::set< entry_sort_t >::iterator ei=sortedEntries.begin(); ei!=sortedEntries.end(); ++ei) {
        sp<Entry> e = ei->e;
        status_t err = e->prepareFlatten(&valueStrings, this);
        if (err != NO_ERROR) {
            return err;
        }
    }

    sortedEntries.clear();

    ssize_t strAmt = 0;
    
    // Now build the array of package chunks.