1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker *
4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker *
8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker *
10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker */
16*d57664e9SAndroid Build Coastguard Worker
17*d57664e9SAndroid Build Coastguard Worker #include "Resource.h"
18*d57664e9SAndroid Build Coastguard Worker
19*d57664e9SAndroid Build Coastguard Worker #include <map>
20*d57664e9SAndroid Build Coastguard Worker #include <sstream>
21*d57664e9SAndroid Build Coastguard Worker #include <string>
22*d57664e9SAndroid Build Coastguard Worker
23*d57664e9SAndroid Build Coastguard Worker #include "android-base/stringprintf.h"
24*d57664e9SAndroid Build Coastguard Worker
25*d57664e9SAndroid Build Coastguard Worker using ::android::StringPiece;
26*d57664e9SAndroid Build Coastguard Worker using ::android::base::StringPrintf;
27*d57664e9SAndroid Build Coastguard Worker
28*d57664e9SAndroid Build Coastguard Worker namespace aapt {
29*d57664e9SAndroid Build Coastguard Worker
to_string() const30*d57664e9SAndroid Build Coastguard Worker std::string ResourceId::to_string() const {
31*d57664e9SAndroid Build Coastguard Worker return StringPrintf("0x%08x", id);
32*d57664e9SAndroid Build Coastguard Worker }
33*d57664e9SAndroid Build Coastguard Worker
to_string() const34*d57664e9SAndroid Build Coastguard Worker std::string ResourceName::to_string() const {
35*d57664e9SAndroid Build Coastguard Worker return ResourceNameRef(*this).to_string();
36*d57664e9SAndroid Build Coastguard Worker }
37*d57664e9SAndroid Build Coastguard Worker
to_string() const38*d57664e9SAndroid Build Coastguard Worker std::string ResourceNameRef::to_string() const {
39*d57664e9SAndroid Build Coastguard Worker std::ostringstream str_stream;
40*d57664e9SAndroid Build Coastguard Worker if (!package.empty()) {
41*d57664e9SAndroid Build Coastguard Worker str_stream << package << ":";
42*d57664e9SAndroid Build Coastguard Worker }
43*d57664e9SAndroid Build Coastguard Worker str_stream << type << "/" << entry;
44*d57664e9SAndroid Build Coastguard Worker return str_stream.str();
45*d57664e9SAndroid Build Coastguard Worker }
46*d57664e9SAndroid Build Coastguard Worker
to_string(ResourceType type)47*d57664e9SAndroid Build Coastguard Worker StringPiece to_string(ResourceType type) {
48*d57664e9SAndroid Build Coastguard Worker switch (type) {
49*d57664e9SAndroid Build Coastguard Worker case ResourceType::kAnim:
50*d57664e9SAndroid Build Coastguard Worker return "anim";
51*d57664e9SAndroid Build Coastguard Worker case ResourceType::kAnimator:
52*d57664e9SAndroid Build Coastguard Worker return "animator";
53*d57664e9SAndroid Build Coastguard Worker case ResourceType::kArray:
54*d57664e9SAndroid Build Coastguard Worker return "array";
55*d57664e9SAndroid Build Coastguard Worker case ResourceType::kAttr:
56*d57664e9SAndroid Build Coastguard Worker return "attr";
57*d57664e9SAndroid Build Coastguard Worker case ResourceType::kAttrPrivate:
58*d57664e9SAndroid Build Coastguard Worker return "^attr-private";
59*d57664e9SAndroid Build Coastguard Worker case ResourceType::kBool:
60*d57664e9SAndroid Build Coastguard Worker return "bool";
61*d57664e9SAndroid Build Coastguard Worker case ResourceType::kColor:
62*d57664e9SAndroid Build Coastguard Worker return "color";
63*d57664e9SAndroid Build Coastguard Worker case ResourceType::kConfigVarying:
64*d57664e9SAndroid Build Coastguard Worker return "configVarying";
65*d57664e9SAndroid Build Coastguard Worker case ResourceType::kDimen:
66*d57664e9SAndroid Build Coastguard Worker return "dimen";
67*d57664e9SAndroid Build Coastguard Worker case ResourceType::kDrawable:
68*d57664e9SAndroid Build Coastguard Worker return "drawable";
69*d57664e9SAndroid Build Coastguard Worker case ResourceType::kFont:
70*d57664e9SAndroid Build Coastguard Worker return "font";
71*d57664e9SAndroid Build Coastguard Worker case ResourceType::kFraction:
72*d57664e9SAndroid Build Coastguard Worker return "fraction";
73*d57664e9SAndroid Build Coastguard Worker case ResourceType::kId:
74*d57664e9SAndroid Build Coastguard Worker return "id";
75*d57664e9SAndroid Build Coastguard Worker case ResourceType::kInteger:
76*d57664e9SAndroid Build Coastguard Worker return "integer";
77*d57664e9SAndroid Build Coastguard Worker case ResourceType::kInterpolator:
78*d57664e9SAndroid Build Coastguard Worker return "interpolator";
79*d57664e9SAndroid Build Coastguard Worker case ResourceType::kLayout:
80*d57664e9SAndroid Build Coastguard Worker return "layout";
81*d57664e9SAndroid Build Coastguard Worker case ResourceType::kMacro:
82*d57664e9SAndroid Build Coastguard Worker return "macro";
83*d57664e9SAndroid Build Coastguard Worker case ResourceType::kMenu:
84*d57664e9SAndroid Build Coastguard Worker return "menu";
85*d57664e9SAndroid Build Coastguard Worker case ResourceType::kMipmap:
86*d57664e9SAndroid Build Coastguard Worker return "mipmap";
87*d57664e9SAndroid Build Coastguard Worker case ResourceType::kNavigation:
88*d57664e9SAndroid Build Coastguard Worker return "navigation";
89*d57664e9SAndroid Build Coastguard Worker case ResourceType::kPlurals:
90*d57664e9SAndroid Build Coastguard Worker return "plurals";
91*d57664e9SAndroid Build Coastguard Worker case ResourceType::kRaw:
92*d57664e9SAndroid Build Coastguard Worker return "raw";
93*d57664e9SAndroid Build Coastguard Worker case ResourceType::kString:
94*d57664e9SAndroid Build Coastguard Worker return "string";
95*d57664e9SAndroid Build Coastguard Worker case ResourceType::kStyle:
96*d57664e9SAndroid Build Coastguard Worker return "style";
97*d57664e9SAndroid Build Coastguard Worker case ResourceType::kStyleable:
98*d57664e9SAndroid Build Coastguard Worker return "styleable";
99*d57664e9SAndroid Build Coastguard Worker case ResourceType::kTransition:
100*d57664e9SAndroid Build Coastguard Worker return "transition";
101*d57664e9SAndroid Build Coastguard Worker case ResourceType::kXml:
102*d57664e9SAndroid Build Coastguard Worker return "xml";
103*d57664e9SAndroid Build Coastguard Worker }
104*d57664e9SAndroid Build Coastguard Worker return {};
105*d57664e9SAndroid Build Coastguard Worker }
106*d57664e9SAndroid Build Coastguard Worker
107*d57664e9SAndroid Build Coastguard Worker static const std::map<StringPiece, ResourceType> sResourceTypeMap{
108*d57664e9SAndroid Build Coastguard Worker {"anim", ResourceType::kAnim},
109*d57664e9SAndroid Build Coastguard Worker {"animator", ResourceType::kAnimator},
110*d57664e9SAndroid Build Coastguard Worker {"array", ResourceType::kArray},
111*d57664e9SAndroid Build Coastguard Worker {"attr", ResourceType::kAttr},
112*d57664e9SAndroid Build Coastguard Worker {"^attr-private", ResourceType::kAttrPrivate},
113*d57664e9SAndroid Build Coastguard Worker {"bool", ResourceType::kBool},
114*d57664e9SAndroid Build Coastguard Worker {"color", ResourceType::kColor},
115*d57664e9SAndroid Build Coastguard Worker {"configVarying", ResourceType::kConfigVarying},
116*d57664e9SAndroid Build Coastguard Worker {"dimen", ResourceType::kDimen},
117*d57664e9SAndroid Build Coastguard Worker {"drawable", ResourceType::kDrawable},
118*d57664e9SAndroid Build Coastguard Worker {"font", ResourceType::kFont},
119*d57664e9SAndroid Build Coastguard Worker {"fraction", ResourceType::kFraction},
120*d57664e9SAndroid Build Coastguard Worker {"id", ResourceType::kId},
121*d57664e9SAndroid Build Coastguard Worker {"integer", ResourceType::kInteger},
122*d57664e9SAndroid Build Coastguard Worker {"interpolator", ResourceType::kInterpolator},
123*d57664e9SAndroid Build Coastguard Worker {"layout", ResourceType::kLayout},
124*d57664e9SAndroid Build Coastguard Worker {"macro", ResourceType::kMacro},
125*d57664e9SAndroid Build Coastguard Worker {"menu", ResourceType::kMenu},
126*d57664e9SAndroid Build Coastguard Worker {"mipmap", ResourceType::kMipmap},
127*d57664e9SAndroid Build Coastguard Worker {"navigation", ResourceType::kNavigation},
128*d57664e9SAndroid Build Coastguard Worker {"plurals", ResourceType::kPlurals},
129*d57664e9SAndroid Build Coastguard Worker {"raw", ResourceType::kRaw},
130*d57664e9SAndroid Build Coastguard Worker {"string", ResourceType::kString},
131*d57664e9SAndroid Build Coastguard Worker {"style", ResourceType::kStyle},
132*d57664e9SAndroid Build Coastguard Worker {"styleable", ResourceType::kStyleable},
133*d57664e9SAndroid Build Coastguard Worker {"transition", ResourceType::kTransition},
134*d57664e9SAndroid Build Coastguard Worker {"xml", ResourceType::kXml},
135*d57664e9SAndroid Build Coastguard Worker };
136*d57664e9SAndroid Build Coastguard Worker
ResourceNamedTypeWithDefaultName(ResourceType t)137*d57664e9SAndroid Build Coastguard Worker ResourceNamedTypeRef ResourceNamedTypeWithDefaultName(ResourceType t) {
138*d57664e9SAndroid Build Coastguard Worker return {to_string(t), t};
139*d57664e9SAndroid Build Coastguard Worker }
140*d57664e9SAndroid Build Coastguard Worker
ParseResourceNamedType(android::StringPiece s)141*d57664e9SAndroid Build Coastguard Worker std::optional<ResourceNamedTypeRef> ParseResourceNamedType(android::StringPiece s) {
142*d57664e9SAndroid Build Coastguard Worker auto dot = std::find(s.begin(), s.end(), '.');
143*d57664e9SAndroid Build Coastguard Worker const ResourceType* parsedType;
144*d57664e9SAndroid Build Coastguard Worker if (dot != s.end() && dot != std::prev(s.end())) {
145*d57664e9SAndroid Build Coastguard Worker parsedType = ParseResourceType(android::StringPiece(s.begin(), dot - s.begin()));
146*d57664e9SAndroid Build Coastguard Worker } else {
147*d57664e9SAndroid Build Coastguard Worker parsedType = ParseResourceType(s);
148*d57664e9SAndroid Build Coastguard Worker }
149*d57664e9SAndroid Build Coastguard Worker if (parsedType == nullptr) {
150*d57664e9SAndroid Build Coastguard Worker return std::nullopt;
151*d57664e9SAndroid Build Coastguard Worker }
152*d57664e9SAndroid Build Coastguard Worker return ResourceNamedTypeRef(s, *parsedType);
153*d57664e9SAndroid Build Coastguard Worker }
154*d57664e9SAndroid Build Coastguard Worker
ParseResourceType(StringPiece str)155*d57664e9SAndroid Build Coastguard Worker const ResourceType* ParseResourceType(StringPiece str) {
156*d57664e9SAndroid Build Coastguard Worker auto iter = sResourceTypeMap.find(str);
157*d57664e9SAndroid Build Coastguard Worker if (iter == std::end(sResourceTypeMap)) {
158*d57664e9SAndroid Build Coastguard Worker return nullptr;
159*d57664e9SAndroid Build Coastguard Worker }
160*d57664e9SAndroid Build Coastguard Worker return &iter->second;
161*d57664e9SAndroid Build Coastguard Worker }
162*d57664e9SAndroid Build Coastguard Worker
operator <(const ResourceKey & a,const ResourceKey & b)163*d57664e9SAndroid Build Coastguard Worker bool operator<(const ResourceKey& a, const ResourceKey& b) {
164*d57664e9SAndroid Build Coastguard Worker return std::tie(a.name, a.config) < std::tie(b.name, b.config);
165*d57664e9SAndroid Build Coastguard Worker }
166*d57664e9SAndroid Build Coastguard Worker
operator <(const ResourceKeyRef & a,const ResourceKeyRef & b)167*d57664e9SAndroid Build Coastguard Worker bool operator<(const ResourceKeyRef& a, const ResourceKeyRef& b) {
168*d57664e9SAndroid Build Coastguard Worker return std::tie(a.name, a.config) < std::tie(b.name, b.config);
169*d57664e9SAndroid Build Coastguard Worker }
170*d57664e9SAndroid Build Coastguard Worker
171*d57664e9SAndroid Build Coastguard Worker } // namespace aapt
172