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 25 using ::android::StringPiece; 26 using ::android::base::StringPrintf; 27 28 namespace aapt { 29 30 std::string ResourceId::to_string() const { 31 return StringPrintf("0x%08x", id); 32 } 33 34 std::string ResourceName::to_string() const { 35 return ResourceNameRef(*this).to_string(); 36 } 37 38 std::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 47 StringPiece 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 105 static 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 134 const 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 142 bool operator<(const ResourceKey& a, const ResourceKey& b) { 143 return std::tie(a.name, a.config) < std::tie(b.name, b.config); 144 } 145 146 bool 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