ResourceFilter.cpp revision fab50875b98e8274ac8ee44b38ba42521bbbf1f9
1e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// 2fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski// Copyright 2014 The Android Open Source Project 3e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// 4e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// Build resource files from raw assets. 5e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn// 6e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 7e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn#include "ResourceFilter.h" 8fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include "AaptUtil.h" 9fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include "AaptConfig.h" 10e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 11e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornstatus_t 12fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiWeakResourceFilter::parse(const String8& str) 13e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 14fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski Vector<String8> configStrs = AaptUtil::split(str, ','); 15fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski const size_t N = configStrs.size(); 16fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski mConfigs.clear(); 17fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski mConfigMask = 0; 18fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski mConfigs.resize(N); 19fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski for (size_t i = 0; i < N; i++) { 20fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski const String8& part = configStrs[i]; 21a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin if (part == "en_XA") { 22a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin mContainsPseudoAccented = true; 23a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin } else if (part == "ar_XB") { 24a2ef5c0d4fb863c0382e77ae00f986a019b11cbeAnton Krumin mContainsPseudoBidi = true; 25e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 26e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 27fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski std::pair<ConfigDescription, uint32_t>& entry = mConfigs.editItemAt(i); 28788fa41482b9d398591b7db8b0b01839029611adNarayan Kamath 29fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski AaptLocaleValue val; 30fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski if (val.initFromFilterString(part)) { 31fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski // For backwards compatibility, we accept configurations that 32fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski // only specify locale in the standard 'en_US' format. 33fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski val.writeTo(&entry.first); 34fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski } else if (!AaptConfig::parse(part, &entry.first)) { 35fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski fprintf(stderr, "Invalid configuration: %s\n", part.string()); 36fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski return UNKNOWN_ERROR; 37e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 38fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski 39fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski entry.second = mDefault.diff(entry.first); 40fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski 41fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski // Ignore the version 42fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski entry.second &= ~ResTable_config::CONFIG_VERSION; 43fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski 44fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski mConfigMask |= entry.second; 45e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 46e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 47e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return NO_ERROR; 48e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 49e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 50e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackbornbool 51fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiWeakResourceFilter::match(const ResTable_config& config) const 52e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn{ 53fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski uint32_t mask = mDefault.diff(config); 54fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski if ((mConfigMask & mask) == 0) { 55fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski // The two configurations don't have any common axis. 56e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn return true; 57e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 58e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 59fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski const size_t N = mConfigs.size(); 60fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski for (size_t i = 0; i < N; i++) { 61fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski const std::pair<ConfigDescription, uint32_t>& entry = mConfigs[i]; 62fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski uint32_t diff = entry.first.diff(config); 63fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski if ((diff & entry.second) == 0) { 64fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski return true; 65fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski } else if ((diff & entry.second) == ResTable_config::CONFIG_LOCALE) { 66fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski // If the locales differ, but the languages are the same and 67fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski // the locale we are matching only has a language specified, 68fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski // we match. 69fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski if (config.language[0] && memcmp(config.language, entry.first.language, sizeof(config.language)) == 0) { 70fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski if (config.country[0] == 0) { 71fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski return true; 72fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski } 73fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski } 74e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 75e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 76fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski return false; 77e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 78e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn 79fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinskistatus_t 80fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiStrongResourceFilter::parse(const String8& str) { 81fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski Vector<String8> configStrs = AaptUtil::split(str, ','); 82fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski ConfigDescription config; 83fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski mConfigs.clear(); 84fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski for (size_t i = 0; i < configStrs.size(); i++) { 85fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski if (!AaptConfig::parse(configStrs[i], &config)) { 86fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski fprintf(stderr, "Invalid configuration: %s\n", configStrs[i].string()); 87fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski return UNKNOWN_ERROR; 88fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski } 89fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski mConfigs.insert(config); 90e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn } 91fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski return NO_ERROR; 92e6b680364dd992907a8d2037685a2e500d188dfbDianne Hackborn} 93