ResourceFilter.cpp revision e6b680364dd992907a8d2037685a2e500d188dfb
1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch//
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2011 The Android Open Source Project
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch//
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Build resource files from raw assets.
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ResourceFilter.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)status_t
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)ResourceFilter::parse(const char* arg)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (arg == NULL) {
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        return 0;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* p = arg;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* q;
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    while (true) {
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        q = strchr(p, ',');
21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        if (q == NULL) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            q = p + strlen(p);
238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        }
248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        String8 part(p, q-p);
268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        if (part == "zz_ZZ") {
288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            mContainsPseudo = true;
298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        }
308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        int axis;
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        uint32_t value;
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        if (AaptGroupEntry::parseNamePart(part, &axis, &value)) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "Invalid configuration: %s\n", arg);
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            fprintf(stderr, "                       ");
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            for (int i=0; i<p-arg; i++) {
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                fprintf(stderr, " ");
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            for (int i=0; i<q-p; i++) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(stderr, "^");
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fprintf(stderr, "\n");
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            return 1;
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ssize_t index = mData.indexOfKey(axis);
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        if (index < 0) {
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mData.add(axis, SortedVector<uint32_t>());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SortedVector<uint32_t>& sv = mData.editValueFor(axis);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sv.add(value);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // if it's a locale with a region, also match an unmodified locale of the
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // same language
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (axis == AXIS_LANGUAGE) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (value & 0xffff0000) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                sv.add(value & 0x0000ffff);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p = q;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!*p) break;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p++;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NO_ERROR;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ResourceFilter::isEmpty() const
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return mData.size() == 0;
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ResourceFilter::match(int axis, uint32_t value) const
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == 0) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // they didn't specify anything so take everything
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssize_t index = mData.indexOfKey(axis);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (index < 0) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // we didn't request anything on this axis so take everything
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SortedVector<uint32_t>& sv = mData.valueAt(index);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return sv.indexOf(value) >= 0;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourceFilter::match(int axis, const ResTable_config& config) const
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return match(axis, AaptGroupEntry::getConfigValueForAxis(config, axis));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ResourceFilter::match(const ResTable_config& config) const
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i=AXIS_START; i<=AXIS_END; i++) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!match(i, AaptGroupEntry::getConfigValueForAxis(config, i))) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst SortedVector<uint32_t>* ResourceFilter::configsForAxis(int axis) const
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ssize_t index = mData.indexOfKey(axis);
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (index < 0) {
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        return NULL;
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return &mData.valueAt(index);
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)