blob: 32dfd260e53c38a853d7c4a2a01273243eda4062 [file] [log] [blame]
Adam Lesinski6f6ceb72014-11-14 14:48:12 -08001/*
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#ifndef AAPT_RESOURCE_TABLE_H
18#define AAPT_RESOURCE_TABLE_H
19
Adam Lesinski1ab598f2015-08-14 14:26:04 -070020#include "Diagnostics.h"
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080021#include "Resource.h"
22#include "ResourceValues.h"
23#include "Source.h"
24#include "StringPool.h"
Adam Lesinski355f2852016-02-13 20:26:45 -080025#include "io/File.h"
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080026
Adam Lesinskid5083f62017-01-16 15:07:21 -080027#include "android-base/macros.h"
Mårten Kongstad24c9aa62018-06-20 08:46:41 +020028#include "androidfw/ConfigDescription.h"
Adam Lesinskid5083f62017-01-16 15:07:21 -080029#include "androidfw/StringPiece.h"
30
Adam Lesinski458b8772016-04-25 14:20:21 -070031#include <functional>
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -080032#include <map>
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080033#include <memory>
34#include <string>
35#include <tuple>
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -080036#include <unordered_map>
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080037#include <vector>
38
39namespace aapt {
40
Adam Lesinski71be7052017-12-12 16:48:07 -080041// The Public status of a resource.
42struct Visibility {
43 enum class Level {
44 kUndefined,
45 kPrivate,
46 kPublic,
47 };
48
49 Level level = Level::kUndefined;
50 Source source;
51 std::string comment;
Adam Lesinski9e10ac72015-10-16 14:37:48 -070052};
53
Adam Lesinski71be7052017-12-12 16:48:07 -080054// Represents <add-resource> in an overlay.
55struct AllowNew {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070056 Source source;
Adam Lesinski71be7052017-12-12 16:48:07 -080057 std::string comment;
58};
Adam Lesinski4488f1c2017-05-26 17:33:38 -070059
Adam Lesinski71be7052017-12-12 16:48:07 -080060struct Overlayable {
Ryan Mitchell54237ff2018-12-13 15:44:29 -080061 Overlayable() = default;
62 Overlayable(const android::StringPiece& name, const android::StringPiece& actor)
63 : name(name.to_string()), actor(actor.to_string()) {}
64 Overlayable(const android::StringPiece& name, const android::StringPiece& actor,
65 const Source& source)
66 : name(name.to_string()), actor(actor.to_string()), source(source ){}
67
68 static const char* kActorScheme;
69 std::string name;
70 std::string actor;
71 Source source;
72};
73
74// Represents a declaration that a resource is overlayable at runtime.
75struct OverlayableItem {
76 explicit OverlayableItem(const std::shared_ptr<Overlayable>& overlayable)
77 : overlayable(overlayable) {}
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -080078
Ryan Mitchelle4e989c2018-10-29 02:21:50 -070079 // Represents the types overlays that are allowed to overlay the resource.
Ryan Mitchell54237ff2018-12-13 15:44:29 -080080 typedef uint32_t PolicyFlags;
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -080081 enum Policy : uint32_t {
82 kNone = 0x00,
83
Ryan Mitchelle4e989c2018-10-29 02:21:50 -070084 // The resource can be overlaid by any overlay.
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -080085 kPublic = 0x01,
Ryan Mitchelle4e989c2018-10-29 02:21:50 -070086
87 // The resource can be overlaid by any overlay on the system partition.
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -080088 kSystem = 0x02,
Ryan Mitchelle4e989c2018-10-29 02:21:50 -070089
90 // The resource can be overlaid by any overlay on the vendor partition.
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -080091 kVendor = 0x04,
Ryan Mitchelle4e989c2018-10-29 02:21:50 -070092
93 // The resource can be overlaid by any overlay on the product partition.
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -080094 kProduct = 0x08,
Winsonb2d7f532019-02-04 16:32:43 -080095
96 // The resource can be overlaid by any overlay signed with the same signature as its actor.
97 kSignature = 0x010,
Ryan Mitchelle4e989c2018-10-29 02:21:50 -070098 };
99
Ryan Mitchell54237ff2018-12-13 15:44:29 -0800100 std::shared_ptr<Overlayable> overlayable;
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -0800101 PolicyFlags policies = Policy::kNone;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700102 std::string comment;
Ryan Mitchell54237ff2018-12-13 15:44:29 -0800103 Source source;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800104};
105
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800106class ResourceConfigValue {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700107 public:
Adam Lesinski71be7052017-12-12 16:48:07 -0800108 // The configuration for which this value is defined.
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200109 const android::ConfigDescription config;
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800110
Adam Lesinski71be7052017-12-12 16:48:07 -0800111 // The product for which this value is defined.
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700112 const std::string product;
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800113
Adam Lesinski71be7052017-12-12 16:48:07 -0800114 // The actual Value.
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700115 std::unique_ptr<Value> value;
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800116
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200117 ResourceConfigValue(const android::ConfigDescription& config, const android::StringPiece& product)
Adam Lesinskid5083f62017-01-16 15:07:21 -0800118 : config(config), product(product.to_string()) {}
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800119
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700120 private:
121 DISALLOW_COPY_AND_ASSIGN(ResourceConfigValue);
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800122};
123
Adam Lesinski73bff1e2017-12-08 16:06:10 -0800124// Represents a resource entry, which may have varying values for each defined configuration.
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800125class ResourceEntry {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700126 public:
Adam Lesinski71be7052017-12-12 16:48:07 -0800127 // The name of the resource. Immutable, as this determines the order of this resource
128 // when doing lookups.
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700129 const std::string name;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800130
Adam Lesinski71be7052017-12-12 16:48:07 -0800131 // The entry ID for this resource (the EEEE in 0xPPTTEEEE).
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700132 Maybe<uint16_t> id;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800133
Adam Lesinski71be7052017-12-12 16:48:07 -0800134 // Whether this resource is public (and must maintain the same entry ID across builds).
135 Visibility visibility;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800136
Adam Lesinski71be7052017-12-12 16:48:07 -0800137 Maybe<AllowNew> allow_new;
138
Ryan Mitchelle4e989c2018-10-29 02:21:50 -0700139 // The declarations of this resource as overlayable for RROs
Ryan Mitchell54237ff2018-12-13 15:44:29 -0800140 Maybe<OverlayableItem> overlayable_item;
Adam Lesinski71be7052017-12-12 16:48:07 -0800141
142 // The resource's values for each configuration.
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700143 std::vector<std::unique_ptr<ResourceConfigValue>> values;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800144
Adam Lesinskid5083f62017-01-16 15:07:21 -0800145 explicit ResourceEntry(const android::StringPiece& name) : name(name.to_string()) {}
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800146
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200147 ResourceConfigValue* FindValue(const android::ConfigDescription& config);
Adam Lesinski34a16872018-02-23 16:18:10 -0800148
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200149 ResourceConfigValue* FindValue(const android::ConfigDescription& config,
Adam Lesinskid5083f62017-01-16 15:07:21 -0800150 const android::StringPiece& product);
Adam Lesinski34a16872018-02-23 16:18:10 -0800151
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200152 ResourceConfigValue* FindOrCreateValue(const android::ConfigDescription& config,
Adam Lesinskid5083f62017-01-16 15:07:21 -0800153 const android::StringPiece& product);
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200154 std::vector<ResourceConfigValue*> FindAllValues(const android::ConfigDescription& config);
Adam Lesinski34a16872018-02-23 16:18:10 -0800155
156 template <typename Func>
157 std::vector<ResourceConfigValue*> FindValuesIf(Func f) {
158 std::vector<ResourceConfigValue*> results;
159 for (auto& config_value : values) {
160 if (f(config_value.get())) {
161 results.push_back(config_value.get());
162 }
163 }
164 return results;
165 }
166
167 bool HasDefaultValue() const;
Adam Lesinski458b8772016-04-25 14:20:21 -0700168
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700169 private:
170 DISALLOW_COPY_AND_ASSIGN(ResourceEntry);
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800171};
172
Adam Lesinski71be7052017-12-12 16:48:07 -0800173// Represents a resource type (eg. string, drawable, layout, etc.) containing resource entries.
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800174class ResourceTableType {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700175 public:
Adam Lesinski71be7052017-12-12 16:48:07 -0800176 // The logical type of resource (string, drawable, layout, etc.).
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700177 const ResourceType type;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800178
Adam Lesinski71be7052017-12-12 16:48:07 -0800179 // The type ID for this resource (the TT in 0xPPTTEEEE).
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700180 Maybe<uint8_t> id;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800181
Adam Lesinski71be7052017-12-12 16:48:07 -0800182 // Whether this type is public (and must maintain the same type ID across builds).
183 Visibility::Level visibility_level = Visibility::Level::kUndefined;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800184
Adam Lesinski71be7052017-12-12 16:48:07 -0800185 // List of resources for this type.
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700186 std::vector<std::unique_ptr<ResourceEntry>> entries;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800187
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700188 explicit ResourceTableType(const ResourceType type) : type(type) {}
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700189
Ryan Mitchell8d4ee972018-08-27 11:24:04 -0700190 ResourceEntry* FindEntry(const android::StringPiece& name,
191 Maybe<uint16_t> id = Maybe<uint16_t>());
Ryan Mitchell83a37ad2018-08-06 16:32:24 -0700192 ResourceEntry* FindOrCreateEntry(const android::StringPiece& name,
Ryan Mitchell8d4ee972018-08-27 11:24:04 -0700193 Maybe<uint16_t> id = Maybe<uint16_t>());
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800194
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700195 private:
196 DISALLOW_COPY_AND_ASSIGN(ResourceTableType);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700197};
198
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800199class ResourceTablePackage {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700200 public:
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700201 std::string name;
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700202
Adam Lesinski71be7052017-12-12 16:48:07 -0800203 // The package ID (the PP in 0xPPTTEEEE).
204 Maybe<uint8_t> id;
205
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700206 std::vector<std::unique_ptr<ResourceTableType>> types;
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700207
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700208 ResourceTablePackage() = default;
Ryan Mitchell83a37ad2018-08-06 16:32:24 -0700209 ResourceTableType* FindType(ResourceType type, Maybe<uint8_t> id = Maybe<uint8_t>());
210 ResourceTableType* FindOrCreateType(const ResourceType type,
211 Maybe<uint8_t> id = Maybe<uint8_t>());
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800212
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700213 private:
214 DISALLOW_COPY_AND_ASSIGN(ResourceTablePackage);
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800215};
216
Adam Lesinski71be7052017-12-12 16:48:07 -0800217// The container and index for all resources defined for an app.
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800218class ResourceTable {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700219 public:
220 ResourceTable() = default;
Ryan Mitchell83a37ad2018-08-06 16:32:24 -0700221 explicit ResourceTable(bool validate_resources) : validate_resources_(validate_resources) {}
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800222
Ryan Mitchell83a37ad2018-08-06 16:32:24 -0700223 enum class CollisionResult { kKeepBoth, kKeepOriginal, kConflict, kTakeNew };
Adam Lesinski5c3464c2016-08-24 16:03:48 -0700224
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700225 using CollisionResolverFunc = std::function<CollisionResult(Value*, Value*)>;
Adam Lesinski5c3464c2016-08-24 16:03:48 -0700226
Adam Lesinski71be7052017-12-12 16:48:07 -0800227 // When a collision of resources occurs, this method decides which value to keep.
Adam Lesinskib1afa072017-03-29 13:52:38 -0700228 static CollisionResult ResolveValueCollision(Value* existing, Value* incoming);
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800229
Ryan Mitchell83a37ad2018-08-06 16:32:24 -0700230 // When a collision of resources occurs, this method keeps both values
231 static CollisionResult IgnoreCollision(Value* existing, Value* incoming);
232
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200233 bool AddResource(const ResourceNameRef& name, const android::ConfigDescription& config,
Adam Lesinskid5083f62017-01-16 15:07:21 -0800234 const android::StringPiece& product, std::unique_ptr<Value> value,
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700235 IDiagnostics* diag);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700236
Adam Lesinski71be7052017-12-12 16:48:07 -0800237 bool AddResourceWithId(const ResourceNameRef& name, const ResourceId& res_id,
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200238 const android::ConfigDescription& config,
239 const android::StringPiece& product, std::unique_ptr<Value> value,
240 IDiagnostics* diag);
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800241
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200242 bool AddFileReference(const ResourceNameRef& name, const android::ConfigDescription& config,
Adam Lesinskid5083f62017-01-16 15:07:21 -0800243 const Source& source, const android::StringPiece& path, IDiagnostics* diag);
Adam Lesinskifb48d292015-11-07 15:52:13 -0800244
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200245 bool AddFileReferenceMangled(const ResourceNameRef& name, const android::ConfigDescription& config,
Adam Lesinski71be7052017-12-12 16:48:07 -0800246 const Source& source, const android::StringPiece& path,
247 io::IFile* file, IDiagnostics* diag);
Adam Lesinskie78fd612015-10-22 12:48:43 -0700248
Adam Lesinski71be7052017-12-12 16:48:07 -0800249 // Same as AddResource, but doesn't verify the validity of the name. This is used
250 // when loading resources from an existing binary resource table that may have mangled names.
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200251 bool AddResourceMangled(const ResourceNameRef& name, const android::ConfigDescription& config,
Adam Lesinski71be7052017-12-12 16:48:07 -0800252 const android::StringPiece& product, std::unique_ptr<Value> value,
253 IDiagnostics* diag);
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800254
Adam Lesinski71be7052017-12-12 16:48:07 -0800255 bool AddResourceWithIdMangled(const ResourceNameRef& name, const ResourceId& id,
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200256 const android::ConfigDescription& config,
Adam Lesinski71be7052017-12-12 16:48:07 -0800257 const android::StringPiece& product, std::unique_ptr<Value> value,
258 IDiagnostics* diag);
Adam Lesinski769de982015-04-10 19:43:55 -0700259
Ryan Mitchell83a37ad2018-08-06 16:32:24 -0700260 bool GetValidateResources();
261
Adam Lesinski71be7052017-12-12 16:48:07 -0800262 bool SetVisibility(const ResourceNameRef& name, const Visibility& visibility, IDiagnostics* diag);
263 bool SetVisibilityMangled(const ResourceNameRef& name, const Visibility& visibility,
264 IDiagnostics* diag);
265 bool SetVisibilityWithId(const ResourceNameRef& name, const Visibility& visibility,
266 const ResourceId& res_id, IDiagnostics* diag);
267 bool SetVisibilityWithIdMangled(const ResourceNameRef& name, const Visibility& visibility,
268 const ResourceId& res_id, IDiagnostics* diag);
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800269
Ryan Mitchell54237ff2018-12-13 15:44:29 -0800270 bool SetOverlayable(const ResourceNameRef& name, const OverlayableItem& overlayable,
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -0800271 IDiagnostics *diag);
Ryan Mitchell54237ff2018-12-13 15:44:29 -0800272 bool SetOverlayableMangled(const ResourceNameRef& name, const OverlayableItem& overlayable,
Adam Lesinski71be7052017-12-12 16:48:07 -0800273 IDiagnostics* diag);
274
275 bool SetAllowNew(const ResourceNameRef& name, const AllowNew& allow_new, IDiagnostics* diag);
276 bool SetAllowNewMangled(const ResourceNameRef& name, const AllowNew& allow_new,
277 IDiagnostics* diag);
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800278
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700279 struct SearchResult {
280 ResourceTablePackage* package;
281 ResourceTableType* type;
282 ResourceEntry* entry;
283 };
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700284
Adam Lesinski71be7052017-12-12 16:48:07 -0800285 Maybe<SearchResult> FindResource(const ResourceNameRef& name) const;
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700286
Adam Lesinski71be7052017-12-12 16:48:07 -0800287 // Returns the package struct with the given name, or nullptr if such a package does not
288 // exist. The empty string is a valid package and typically is used to represent the
289 // 'current' package before it is known to the ResourceTable.
290 ResourceTablePackage* FindPackage(const android::StringPiece& name) const;
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800291
Adam Lesinski71be7052017-12-12 16:48:07 -0800292 ResourceTablePackage* FindPackageById(uint8_t id) const;
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800293
294 ResourceTablePackage* CreatePackage(const android::StringPiece& name, Maybe<uint8_t> id = {});
295
David Chaloupkae3c1a4a2018-01-18 13:44:36 +0000296 // Attempts to find a package having the specified name and ID. If not found, a new package
297 // of the specified parameters is created and returned.
298 ResourceTablePackage* CreatePackageAllowingDuplicateNames(const android::StringPiece& name,
299 const Maybe<uint8_t> id);
300
Shane Farmer0a5b2012017-06-22 12:24:12 -0700301 std::unique_ptr<ResourceTable> Clone() const;
302
Adam Lesinski71be7052017-12-12 16:48:07 -0800303 // The string pool used by this resource table. Values that reference strings must use
304 // this pool to create their strings.
305 // NOTE: `string_pool` must come before `packages` so that it is destroyed after.
306 // When `string_pool` references are destroyed (as they will be when `packages` is destroyed),
307 // they decrement a refCount, which would cause invalid memory access if the pool was already
308 // destroyed.
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700309 StringPool string_pool;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800310
David Chaloupkae3c1a4a2018-01-18 13:44:36 +0000311 // The list of packages in this table, sorted alphabetically by package name and increasing
312 // package ID (missing ID being the lowest).
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700313 std::vector<std::unique_ptr<ResourceTablePackage>> packages;
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800314
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800315 // Set of dynamic packages that this table may reference. Their package names get encoded
316 // into the resources.arsc along with their compile-time assigned IDs.
317 std::map<size_t, std::string> included_packages_;
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700318
319 private:
Adam Lesinskib1afa072017-03-29 13:52:38 -0700320 // The function type that validates a symbol name. Returns a non-empty StringPiece representing
321 // the offending character (which may be more than one byte in UTF-8). Returns an empty string
322 // if the name was valid.
323 using NameValidator = android::StringPiece(const android::StringPiece&);
324
Adam Lesinskid5083f62017-01-16 15:07:21 -0800325 ResourceTablePackage* FindOrCreatePackage(const android::StringPiece& name);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700326
Adam Lesinski71be7052017-12-12 16:48:07 -0800327 bool ValidateName(NameValidator validator, const ResourceNameRef& name, const Source& source,
328 IDiagnostics* diag);
329
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700330 bool AddResourceImpl(const ResourceNameRef& name, const ResourceId& res_id,
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200331 const android::ConfigDescription& config,
332 const android::StringPiece& product, std::unique_ptr<Value> value,
333 NameValidator name_validator, const CollisionResolverFunc& conflict_resolver,
334 IDiagnostics* diag);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700335
Mårten Kongstad24c9aa62018-06-20 08:46:41 +0200336 bool AddFileReferenceImpl(const ResourceNameRef& name, const android::ConfigDescription& config,
Adam Lesinskid5083f62017-01-16 15:07:21 -0800337 const Source& source, const android::StringPiece& path, io::IFile* file,
Adam Lesinskib1afa072017-03-29 13:52:38 -0700338 NameValidator name_validator, IDiagnostics* diag);
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800339
Adam Lesinski71be7052017-12-12 16:48:07 -0800340 bool SetVisibilityImpl(const ResourceNameRef& name, const Visibility& visibility,
341 const ResourceId& res_id, NameValidator name_validator,
342 IDiagnostics* diag);
343
344 bool SetAllowNewImpl(const ResourceNameRef& name, const AllowNew& allow_new,
345 NameValidator name_validator, IDiagnostics* diag);
346
Ryan Mitchell54237ff2018-12-13 15:44:29 -0800347 bool SetOverlayableImpl(const ResourceNameRef &name, const OverlayableItem& overlayable,
Ryan Mitchell1bb1fe02018-11-16 11:21:41 -0800348 NameValidator name_validator, IDiagnostics *diag);
Adam Lesinski71be7052017-12-12 16:48:07 -0800349
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700350 bool SetSymbolStateImpl(const ResourceNameRef& name, const ResourceId& res_id,
Adam Lesinski71be7052017-12-12 16:48:07 -0800351 const Visibility& symbol, NameValidator name_validator,
352 IDiagnostics* diag);
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700353
Ryan Mitchell83a37ad2018-08-06 16:32:24 -0700354 // Controls whether the table validates resource names and prevents duplicate resource names
355 bool validate_resources_ = true;
356
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700357 DISALLOW_COPY_AND_ASSIGN(ResourceTable);
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800358};
359
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700360} // namespace aapt
Adam Lesinski6f6ceb72014-11-14 14:48:12 -0800361
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700362#endif // AAPT_RESOURCE_TABLE_H