summaryrefslogtreecommitdiff
path: root/tools/aapt2/format/binary/BinaryResourceParser.h
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2017-09-29 14:49:15 -0700
committerAdam Lesinski <adamlesinski@google.com>2017-10-04 14:26:55 -0700
commit4670805ea441edb8b280f9312571e7799f1284cf (patch)
tree593cfa51011a51f443e9dbaa5934ea159e7ae1d7 /tools/aapt2/format/binary/BinaryResourceParser.h
parent65e91ce6c3aac8e350cbf5e1de2d2b13c78d792b (diff)
AAPT2: Move format related files under same directory
Test: make aapt2_tests Change-Id: Id72cdfc12ba3add294048e60c55f2461344464bf
Diffstat (limited to 'tools/aapt2/format/binary/BinaryResourceParser.h')
-rw-r--r--tools/aapt2/format/binary/BinaryResourceParser.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/tools/aapt2/format/binary/BinaryResourceParser.h b/tools/aapt2/format/binary/BinaryResourceParser.h
new file mode 100644
index 000000000000..dc9a3847a9c6
--- /dev/null
+++ b/tools/aapt2/format/binary/BinaryResourceParser.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT_FORMAT_BINARY_RESOURCEPARSER_H
+#define AAPT_FORMAT_BINARY_RESOURCEPARSER_H
+
+#include <string>
+
+#include "android-base/macros.h"
+#include "androidfw/ResourceTypes.h"
+
+#include "ResourceTable.h"
+#include "ResourceValues.h"
+#include "Source.h"
+#include "process/IResourceTableConsumer.h"
+#include "util/Util.h"
+
+namespace aapt {
+
+struct SymbolTable_entry;
+
+// Parses a binary resource table (resources.arsc) and adds the entries to a ResourceTable.
+// This is different than the libandroidfw ResTable in that it scans the table from top to bottom
+// and doesn't require support for random access.
+class BinaryResourceParser {
+ public:
+ // Creates a parser, which will read `len` bytes from `data`, and add any resources parsed to
+ // `table`. `source` is for logging purposes.
+ BinaryResourceParser(IAaptContext* context, ResourceTable* table, const Source& source,
+ const void* data, size_t data_len, io::IFileCollection* files = nullptr);
+
+ // Parses the binary resource table and returns true if successful.
+ bool Parse();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(BinaryResourceParser);
+
+ bool ParseTable(const android::ResChunk_header* chunk);
+ bool ParsePackage(const android::ResChunk_header* chunk);
+ bool ParseTypeSpec(const android::ResChunk_header* chunk);
+ bool ParseType(const ResourceTablePackage* package, const android::ResChunk_header* chunk);
+ bool ParseLibrary(const android::ResChunk_header* chunk);
+
+ std::unique_ptr<Item> ParseValue(const ResourceNameRef& name, const ConfigDescription& config,
+ const android::Res_value& value);
+
+ std::unique_ptr<Value> ParseMapEntry(const ResourceNameRef& name, const ConfigDescription& config,
+ const android::ResTable_map_entry* map);
+
+ std::unique_ptr<Style> ParseStyle(const ResourceNameRef& name, const ConfigDescription& config,
+ const android::ResTable_map_entry* map);
+
+ std::unique_ptr<Attribute> ParseAttr(const ResourceNameRef& name, const ConfigDescription& config,
+ const android::ResTable_map_entry* map);
+
+ std::unique_ptr<Array> ParseArray(const ResourceNameRef& name, const ConfigDescription& config,
+ const android::ResTable_map_entry* map);
+
+ std::unique_ptr<Plural> ParsePlural(const ResourceNameRef& name, const ConfigDescription& config,
+ const android::ResTable_map_entry* map);
+
+ /**
+ * If the mapEntry is a special type that denotes meta data (source, comment),
+ * then it is
+ * read and added to the Value.
+ * Returns true if the mapEntry was meta data.
+ */
+ bool CollectMetaData(const android::ResTable_map& map_entry, Value* value);
+
+ IAaptContext* context_;
+ ResourceTable* table_;
+
+ const Source source_;
+
+ const void* data_;
+ const size_t data_len_;
+
+ // Optional file collection from which to create io::IFile objects.
+ io::IFileCollection* files_;
+
+ // The standard value string pool for resource values.
+ android::ResStringPool value_pool_;
+
+ // The string pool that holds the names of the types defined
+ // in this table.
+ android::ResStringPool type_pool_;
+
+ // The string pool that holds the names of the entries defined
+ // in this table.
+ android::ResStringPool key_pool_;
+
+ // A mapping of resource ID to resource name. When we finish parsing
+ // we use this to convert all resource IDs to symbolic references.
+ std::map<ResourceId, ResourceName> id_index_;
+};
+
+} // namespace aapt
+
+namespace android {
+
+// Iterator functionality for ResTable_map_entry.
+
+inline const ResTable_map* begin(const ResTable_map_entry* map) {
+ return (const ResTable_map*)((const uint8_t*)map + ::aapt::util::DeviceToHost32(map->size));
+}
+
+inline const ResTable_map* end(const ResTable_map_entry* map) {
+ return begin(map) + aapt::util::DeviceToHost32(map->count);
+}
+
+} // namespace android
+
+#endif // AAPT_FORMAT_BINARY_RESOURCEPARSER_H