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