ResourceFilter.cpp revision a2ef5c0d4fb863c0382e77ae00f986a019b11cbe
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 27a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin if (part == "en_XA") { 28a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin mContainsPseudoAccented = true; 29a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin } else if (part == "ar_XB") { 30a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin mContainsPseudoBidi = true; 31e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 32e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn int axis; 33788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath AxisValue value; 34788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath if (!AaptGroupEntry::parseFilterNamePart(part, &axis, &value)) { 35e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, "Invalid configuration: %s\n", arg); 36e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, " "); 37e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (int i=0; i<p-arg; i++) { 38e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, " "); 39e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 40e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (int i=0; i<q-p; i++) { 41e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, "^"); 42e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 43e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn fprintf(stderr, "\n"); 44e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return 1; 45e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 46e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 47e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ssize_t index = mData.indexOfKey(axis); 48e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (index < 0) { 49788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath mData.add(axis, SortedVector<AxisValue>()); 50e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 51788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath SortedVector<AxisValue>& sv = mData.editValueFor(axis); 52e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn sv.add(value); 53788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath 54788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath // If it's a locale with a region, script or variant, we should also match an 55788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath // unmodified locale of the same language 56788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath if (axis == AXIS_LOCALE) { 57788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath if (value.localeValue.region[0] || value.localeValue.script[0] || 58788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath value.localeValue.variant[0]) { 59788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath AxisValue copy; 60788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath memcpy(copy.localeValue.language, value.localeValue.language, 61788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath sizeof(value.localeValue.language)); 62788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath sv.add(copy); 63e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 64e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 65e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn p = q; 66e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!*p) break; 67e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn p++; 68e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 69e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 70e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return NO_ERROR; 71e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 72e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 73e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 74e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornResourceFilter::isEmpty() const 75e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 76e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return mData.size() == 0; 77e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 78e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 79e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 80788fa41482b9d398591b7db8b0b01839029611adNarayan KamathResourceFilter::match(int axis, const AxisValue& value) const 81e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 82788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath if (value.intValue == 0 && (value.localeValue.language[0] == 0)) { 83e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // they didn't specify anything so take everything 84e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return true; 85e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 86e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ssize_t index = mData.indexOfKey(axis); 87e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (index < 0) { 88e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn // we didn't request anything on this axis so take everything 89e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return true; 90e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 91788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath const SortedVector<AxisValue>& sv = mData.valueAt(index); 92e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return sv.indexOf(value) >= 0; 93e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 94e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 95e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 96e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornResourceFilter::match(int axis, const ResTable_config& config) const 97e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 98e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return match(axis, AaptGroupEntry::getConfigValueForAxis(config, axis)); 99e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 100e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 101e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 102e6b680364dd992907a8d2037685a2e500d188dfbDianne HackbornResourceFilter::match(const ResTable_config& config) const 103e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 104e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn for (int i=AXIS_START; i<=AXIS_END; i++) { 105e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (!match(i, AaptGroupEntry::getConfigValueForAxis(config, i))) { 106e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return false; 107e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 108e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 109e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return true; 110e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 111e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 112788fa41482b9d398591b7db8b0b01839029611adNarayan Kamathconst SortedVector<AxisValue>* ResourceFilter::configsForAxis(int axis) const 113e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 114e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn ssize_t index = mData.indexOfKey(axis); 115e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn if (index < 0) { 116e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return NULL; 117e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 118e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return &mData.valueAt(index); 119e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 120