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)