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