• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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