1 //
2 // Copyright 2011 The Android Open Source Project
3 //
4 // Build resource files from raw assets.
5 //
6
7 #include "ResourceFilter.h"
8
9 status_t
parse(const char * arg)10 ResourceFilter::parse(const char* arg)
11 {
12 if (arg == NULL) {
13 return 0;
14 }
15
16 const char* p = arg;
17 const char* q;
18
19 while (true) {
20 q = strchr(p, ',');
21 if (q == NULL) {
22 q = p + strlen(p);
23 }
24
25 String8 part(p, q-p);
26
27 if (part == "zz_ZZ") {
28 mContainsPseudo = true;
29 }
30 int axis;
31 uint32_t value;
32 if (AaptGroupEntry::parseNamePart(part, &axis, &value)) {
33 fprintf(stderr, "Invalid configuration: %s\n", arg);
34 fprintf(stderr, " ");
35 for (int i=0; i<p-arg; i++) {
36 fprintf(stderr, " ");
37 }
38 for (int i=0; i<q-p; i++) {
39 fprintf(stderr, "^");
40 }
41 fprintf(stderr, "\n");
42 return 1;
43 }
44
45 ssize_t index = mData.indexOfKey(axis);
46 if (index < 0) {
47 mData.add(axis, SortedVector<uint32_t>());
48 }
49 SortedVector<uint32_t>& sv = mData.editValueFor(axis);
50 sv.add(value);
51 // if it's a locale with a region, also match an unmodified locale of the
52 // same language
53 if (axis == AXIS_LANGUAGE) {
54 if (value & 0xffff0000) {
55 sv.add(value & 0x0000ffff);
56 }
57 }
58 p = q;
59 if (!*p) break;
60 p++;
61 }
62
63 return NO_ERROR;
64 }
65
66 bool
isEmpty() const67 ResourceFilter::isEmpty() const
68 {
69 return mData.size() == 0;
70 }
71
72 bool
match(int axis,uint32_t value) const73 ResourceFilter::match(int axis, uint32_t value) const
74 {
75 if (value == 0) {
76 // they didn't specify anything so take everything
77 return true;
78 }
79 ssize_t index = mData.indexOfKey(axis);
80 if (index < 0) {
81 // we didn't request anything on this axis so take everything
82 return true;
83 }
84 const SortedVector<uint32_t>& sv = mData.valueAt(index);
85 return sv.indexOf(value) >= 0;
86 }
87
88 bool
match(int axis,const ResTable_config & config) const89 ResourceFilter::match(int axis, const ResTable_config& config) const
90 {
91 return match(axis, AaptGroupEntry::getConfigValueForAxis(config, axis));
92 }
93
94 bool
match(const ResTable_config & config) const95 ResourceFilter::match(const ResTable_config& config) const
96 {
97 for (int i=AXIS_START; i<=AXIS_END; i++) {
98 if (!match(i, AaptGroupEntry::getConfigValueForAxis(config, i))) {
99 return false;
100 }
101 }
102 return true;
103 }
104
configsForAxis(int axis) const105 const SortedVector<uint32_t>* ResourceFilter::configsForAxis(int axis) const
106 {
107 ssize_t index = mData.indexOfKey(axis);
108 if (index < 0) {
109 return NULL;
110 }
111 return &mData.valueAt(index);
112 }
113