ResourceFilter.cpp revision 788fa41482b9d398591b7db8b0b01839029611ad
1e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// 2e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// Copyright 2011 The Android Open Source Project 3e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// 4e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// Build resource files from raw assets. 5e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// 6e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 7e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#include "ResourceFilter.h" 8e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 9e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatus_t 10e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornResourceFilter::parse(const char* arg) 11e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 12e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (arg == NULL) { 13e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return 0; 14e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 15e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 16e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const char* p = arg; 17e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn const char* q; 18e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 19e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn while (true) { 20e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn q = strchr(p, ','); 21e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (q == NULL) { 22e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn q = p + strlen(p); 23e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 24e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 25e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn String8 part(p, q-p); 26e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 27e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (part == "zz_ZZ") { 28e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn mContainsPseudo = true; 29e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 30e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn int axis; 31788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath AxisValue value; 32788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath if (!AaptGroupEntry::parseFilterNamePart(part, &axis, &value)) { 33e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, "Invalid configuration: %s\n", arg); 34e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, " "); 35e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (int i=0; i<p-arg; i++) { 36e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, " "); 37e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 38e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (int i=0; i<q-p; i++) { 39e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, "^"); 40e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 41e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, "\n"); 42e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return 1; 43e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 44e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 45e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ssize_t index = mData.indexOfKey(axis); 46e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (index < 0) { 47788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath mData.add(axis, SortedVector<AxisValue>()); 48e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 49788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath SortedVector<AxisValue>& sv = mData.editValueFor(axis); 50e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn sv.add(value); 51788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath 52788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath // If it's a locale with a region, script or variant, we should also match an 53788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath // unmodified locale of the same language 54788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath if (axis == AXIS_LOCALE) { 55788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath if (value.localeValue.region[0] || value.localeValue.script[0] || 56788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath value.localeValue.variant[0]) { 57788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath AxisValue copy; 58788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath memcpy(copy.localeValue.language, value.localeValue.language, 59788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath sizeof(value.localeValue.language)); 60788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath sv.add(copy); 61e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 62e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 63e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn p = q; 64e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!*p) break; 65e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn p++; 66e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 67e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 68e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return NO_ERROR; 69e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 70e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 71e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 72e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornResourceFilter::isEmpty() const 73e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 74e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return mData.size() == 0; 75e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 76e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 77e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 78788fa41482b9d398591b7db8b0b01839029611adNarayan KamathResourceFilter::match(int axis, const AxisValue& value) const 79e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 80788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath if (value.intValue == 0 && (value.localeValue.language[0] == 0)) { 81e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // they didn't specify anything so take everything 82e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return true; 83e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 84e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ssize_t index = mData.indexOfKey(axis); 85e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (index < 0) { 86e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // we didn't request anything on this axis so take everything 87e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return true; 88e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 89788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath const SortedVector<AxisValue>& sv = mData.valueAt(index); 90e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return sv.indexOf(value) >= 0; 91e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 92e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 93e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 94e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornResourceFilter::match(int axis, const ResTable_config& config) const 95e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 96e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return match(axis, AaptGroupEntry::getConfigValueForAxis(config, axis)); 97e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 98e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 99e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 100e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornResourceFilter::match(const ResTable_config& config) const 101e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 102e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (int i=AXIS_START; i<=AXIS_END; i++) { 103e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!match(i, AaptGroupEntry::getConfigValueForAxis(config, i))) { 104e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return false; 105e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 106e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 107e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return true; 108e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 109e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 110788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathconst SortedVector<AxisValue>* ResourceFilter::configsForAxis(int axis) const 111e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 112e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ssize_t index = mData.indexOfKey(axis); 113e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (index < 0) { 114e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return NULL; 115e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 116e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return &mData.valueAt(index); 117e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 118