159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski/* 259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * Copyright (C) 2016 The Android Open Source Project 359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * 459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * you may not use this file except in compliance with the License. 659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * You may obtain a copy of the License at 759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * 859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * 1059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * See the License for the specific language governing permissions and 1459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski * limitations under the License. 1559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski */ 1659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 17ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "proto/ProtoSerialize.h" 18ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 19ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "android-base/logging.h" 20ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "androidfw/ResourceTypes.h" 21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 2259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "ResourceTable.h" 2359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "ResourceUtils.h" 2459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "ValueVisitor.h" 2559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "proto/ProtoHelpers.h" 2659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 2759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskinamespace aapt { 2859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 2959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskinamespace { 3059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 3159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskiclass ReferenceIdToNameVisitor : public ValueVisitor { 32b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski public: 33ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski using ValueVisitor::Visit; 34b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 354488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski explicit ReferenceIdToNameVisitor(const std::map<ResourceId, ResourceNameRef>* mapping) 36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski : mapping_(mapping) { 37ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski CHECK(mapping_ != nullptr); 38b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 39b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski void Visit(Reference* reference) override { 41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!reference->id || !reference->id.value().is_valid()) { 42b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return; 4359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 4459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 45b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski ResourceId id = reference->id.value(); 46ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski auto cache_iter = mapping_->find(id); 47ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (cache_iter != mapping_->end()) { 48ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski reference->name = cache_iter->second.ToResourceName(); 4959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 50b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 5159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 52b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski private: 53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const std::map<ResourceId, ResourceNameRef>* mapping_; 5459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski}; 5559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 5659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskiclass PackagePbDeserializer { 57b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski public: 58b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski PackagePbDeserializer(const android::ResStringPool* valuePool, 59b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski const android::ResStringPool* sourcePool, 60b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski const android::ResStringPool* symbolPool, 61b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski const Source& source, IDiagnostics* diag) 62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski : value_pool_(valuePool), 63ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski source_pool_(sourcePool), 64ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski symbol_pool_(symbolPool), 65ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski source_(source), 66ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag_(diag) {} 67b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 68b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski public: 69ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski bool DeserializeFromPb(const pb::Package& pbPackage, ResourceTable* table) { 70b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski Maybe<uint8_t> id; 71b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (pbPackage.has_package_id()) { 72b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski id = static_cast<uint8_t>(pbPackage.package_id()); 7359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 7459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 75b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::map<ResourceId, ResourceNameRef> idIndex; 7659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 774488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski ResourceTablePackage* pkg = table->CreatePackage(pbPackage.package_name(), id); 78b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski for (const pb::Type& pbType : pbPackage.types()) { 79ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const ResourceType* resType = ParseResourceType(pbType.name()); 80b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (!resType) { 814488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski diag_->Error(DiagMessage(source_) << "unknown type '" << pbType.name() << "'"); 82b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 83b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 84b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 85ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ResourceTableType* type = pkg->FindOrCreateType(*resType); 86b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 87b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski for (const pb::Entry& pbEntry : pbType.entries()) { 88ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ResourceEntry* entry = type->FindOrCreateEntry(pbEntry.name()); 89b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 90b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // Deserialize the symbol status (public/private with source and 91b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // comments). 92b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (pbEntry.has_symbol_status()) { 93b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski const pb::SymbolStatus& pbStatus = pbEntry.symbol_status(); 94b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (pbStatus.has_source()) { 954488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski DeserializeSourceFromPb(pbStatus.source(), *source_pool_, &entry->symbol_status.source); 96b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 97b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 98b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (pbStatus.has_comment()) { 99ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski entry->symbol_status.comment = pbStatus.comment(); 100b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 101b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 1024488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski entry->symbol_status.allow_new = pbStatus.allow_new(); 1034488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski 1044488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski SymbolState visibility = DeserializeVisibilityFromPb(pbStatus.visibility()); 105ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski entry->symbol_status.state = visibility; 106b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 107b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (visibility == SymbolState::kPublic) { 1084488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski // This is a public symbol, we must encode the ID now if there is one. 109b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (pbEntry.has_id()) { 110b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski entry->id = static_cast<uint16_t>(pbEntry.id()); 11159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 11259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 113ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (type->symbol_status.state != SymbolState::kPublic) { 114b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // If the type has not been made public, do so now. 115ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski type->symbol_status.state = SymbolState::kPublic; 116b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (pbType.has_id()) { 117b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski type->id = static_cast<uint8_t>(pbType.id()); 118b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 119b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 120b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } else if (visibility == SymbolState::kPrivate) { 121ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (type->symbol_status.state == SymbolState::kUndefined) { 122ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski type->symbol_status.state = SymbolState::kPrivate; 12359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 124b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 12559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 12659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 127b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski ResourceId resId(pbPackage.package_id(), pbType.id(), pbEntry.id()); 128ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (resId.is_valid()) { 129b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski idIndex[resId] = ResourceNameRef(pkg->name, type->type, entry->name); 13059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 13159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 132b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski for (const pb::ConfigValue& pbConfigValue : pbEntry.config_values()) { 133b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski const pb::ConfigDescription& pbConfig = pbConfigValue.config(); 13459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 135b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski ConfigDescription config; 136ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!DeserializeConfigDescriptionFromPb(pbConfig, &config)) { 137ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag_->Error(DiagMessage(source_) << "invalid configuration"); 138b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 139b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 14059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 1414488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski ResourceConfigValue* configValue = entry->FindOrCreateValue(config, pbConfig.product()); 142b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (configValue->value) { 143b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // Duplicate config. 144ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag_->Error(DiagMessage(source_) << "duplicate configuration"); 14559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return {}; 146b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 14759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 1484488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski configValue->value = 1494488f1c74a0f7df09f2b201f7caa228d729e8389Adam Lesinski DeserializeValueFromPb(pbConfigValue.value(), config, &table->string_pool); 150b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (!configValue->value) { 151b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 152b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 153b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 154b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 155b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 15659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 157b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski ReferenceIdToNameVisitor visitor(&idIndex); 158ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski VisitAllValuesInPackage(pkg, &visitor); 159b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return true; 160b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 161b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 162b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski private: 163ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<Item> DeserializeItemFromPb(const pb::Item& pb_item, 164b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski const ConfigDescription& config, 165b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski StringPool* pool) { 166ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_item.has_ref()) { 167ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::Reference& pb_ref = pb_item.ref(); 168b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<Reference> ref = util::make_unique<Reference>(); 169ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!DeserializeReferenceFromPb(pb_ref, ref.get())) { 170b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 171b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 172b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return std::move(ref); 173b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 174ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_item.has_prim()) { 175ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::Primitive& pb_prim = pb_item.prim(); 176b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski android::Res_value prim = {}; 177ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski prim.dataType = static_cast<uint8_t>(pb_prim.type()); 178ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski prim.data = pb_prim.data(); 179b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return util::make_unique<BinaryPrimitive>(prim); 180b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 181ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_item.has_id()) { 182b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return util::make_unique<Id>(); 183b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 184ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_item.has_str()) { 185ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const uint32_t idx = pb_item.str().idx(); 186ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const std::string str = util::GetString(*value_pool_, idx); 187b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 188ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const android::ResStringPool_span* spans = value_pool_->styleAt(idx); 189b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (spans && spans->name.index != android::ResStringPool_span::END) { 190ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski StyleString style_str = {str}; 191b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski while (spans->name.index != android::ResStringPool_span::END) { 192ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski style_str.spans.push_back( 193ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Span{util::GetString(*value_pool_, spans->name.index), 194b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski spans->firstChar, spans->lastChar}); 195b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski spans++; 196b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 197ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return util::make_unique<StyledString>(pool->MakeRef( 198ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski style_str, 199b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski StringPool::Context(StringPool::Context::kStylePriority, config))); 200b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 201b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return util::make_unique<String>( 202ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski pool->MakeRef(str, StringPool::Context(config))); 203b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 204ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_item.has_raw_str()) { 205ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const uint32_t idx = pb_item.raw_str().idx(); 206ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const std::string str = util::GetString(*value_pool_, idx); 207b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return util::make_unique<RawString>( 208ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski pool->MakeRef(str, StringPool::Context(config))); 209b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 210ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_item.has_file()) { 211ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const uint32_t idx = pb_item.file().path_idx(); 212ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const std::string str = util::GetString(*value_pool_, idx); 213ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return util::make_unique<FileReference>(pool->MakeRef( 214b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski str, 215b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski StringPool::Context(StringPool::Context::kHighPriority, config))); 216b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 217b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } else { 218ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag_->Error(DiagMessage(source_) << "unknown item"); 21959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 220b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 221b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 22259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 223ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<Value> DeserializeValueFromPb(const pb::Value& pb_value, 224b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski const ConfigDescription& config, 225b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski StringPool* pool) { 226ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const bool is_weak = pb_value.has_weak() ? pb_value.weak() : false; 22759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 228b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<Value> value; 229ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_value.has_item()) { 230ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski value = DeserializeItemFromPb(pb_value.item(), config, pool); 231b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (!value) { 232b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 233b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 234b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 235ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_value.has_compound_value()) { 236ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::CompoundValue& pb_compound_value = pb_value.compound_value(); 237ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_compound_value.has_attr()) { 238ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::Attribute& pb_attr = pb_compound_value.attr(); 239ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<Attribute> attr = util::make_unique<Attribute>(is_weak); 240ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr->type_mask = pb_attr.format_flags(); 241ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr->min_int = pb_attr.min_int(); 242ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr->max_int = pb_attr.max_int(); 243ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (const pb::Attribute_Symbol& pb_symbol : pb_attr.symbols()) { 244b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski Attribute::Symbol symbol; 245ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemCommon(pb_symbol, &symbol.symbol); 246ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!DeserializeReferenceFromPb(pb_symbol.name(), &symbol.symbol)) { 247b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 248b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 249ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski symbol.value = pb_symbol.value(); 250b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski attr->symbols.push_back(std::move(symbol)); 25159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 252b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski value = std::move(attr); 253b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 254ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_compound_value.has_style()) { 255ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::Style& pb_style = pb_compound_value.style(); 256b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<Style> style = util::make_unique<Style>(); 257ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_style.has_parent()) { 258b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski style->parent = Reference(); 259ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!DeserializeReferenceFromPb(pb_style.parent(), 260b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski &style->parent.value())) { 261b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 262b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 263b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 264ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_style.has_parent_source()) { 265ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Source parent_source; 266ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeSourceFromPb(pb_style.parent_source(), *source_pool_, 267ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski &parent_source); 268ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski style->parent.value().SetSource(std::move(parent_source)); 269b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 27059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 27159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 272ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (const pb::Style_Entry& pb_entry : pb_style.entries()) { 273b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski Style::Entry entry; 274ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemCommon(pb_entry, &entry.key); 275ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!DeserializeReferenceFromPb(pb_entry.key(), &entry.key)) { 276b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 277b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 278b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 279ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski entry.value = DeserializeItemFromPb(pb_entry.item(), config, pool); 280b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (!entry.value) { 281b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 282b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 28359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 284ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemCommon(pb_entry, entry.value.get()); 285b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski style->entries.push_back(std::move(entry)); 28659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 287b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski value = std::move(style); 288b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 289ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_compound_value.has_styleable()) { 290ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::Styleable& pb_styleable = pb_compound_value.styleable(); 291b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<Styleable> styleable = util::make_unique<Styleable>(); 292ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (const pb::Styleable_Entry& pb_entry : pb_styleable.entries()) { 293ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Reference attr_ref; 294ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemCommon(pb_entry, &attr_ref); 295ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeReferenceFromPb(pb_entry.attr(), &attr_ref); 296ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski styleable->entries.push_back(std::move(attr_ref)); 297b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 298b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski value = std::move(styleable); 299b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 300ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_compound_value.has_array()) { 301ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::Array& pb_array = pb_compound_value.array(); 302b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<Array> array = util::make_unique<Array>(); 303ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (const pb::Array_Entry& pb_entry : pb_array.entries()) { 304b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<Item> item = 305ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemFromPb(pb_entry.item(), config, pool); 306b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (!item) { 307b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 308b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 30959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 310ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemCommon(pb_entry, item.get()); 311b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski array->items.push_back(std::move(item)); 31259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 313b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski value = std::move(array); 314b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 315ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (pb_compound_value.has_plural()) { 316ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::Plural& pb_plural = pb_compound_value.plural(); 317b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<Plural> plural = util::make_unique<Plural>(); 318ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (const pb::Plural_Entry& pb_entry : pb_plural.entries()) { 319ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski size_t pluralIdx = DeserializePluralEnumFromPb(pb_entry.arity()); 320b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski plural->values[pluralIdx] = 321ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemFromPb(pb_entry.item(), config, pool); 322b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (!plural->values[pluralIdx]) { 323b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 324b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 32559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 326ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemCommon(pb_entry, plural->values[pluralIdx].get()); 32759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 328b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski value = std::move(plural); 32959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 330b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } else { 331ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag_->Error(DiagMessage(source_) << "unknown compound value"); 332b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 333b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 334b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } else { 335ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag_->Error(DiagMessage(source_) << "unknown value"); 336b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 337b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 33859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 339ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski CHECK(value) << "forgot to set value"; 34059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 341ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski value->SetWeak(is_weak); 342ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeItemCommon(pb_value, value.get()); 343b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return value; 344b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 345803c7c807969bea1f1c50f348832f5b60ad05d8eAdam Lesinski 34690919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski bool DeserializeReferenceFromPb(const pb::Reference& pb_ref, Reference* out_ref) { 347ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski out_ref->reference_type = DeserializeReferenceTypeFromPb(pb_ref.type()); 348ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski out_ref->private_reference = pb_ref.private_(); 34959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 350ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_ref.has_id()) { 351ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski out_ref->id = ResourceId(pb_ref.id()); 35259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 35359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 354ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_ref.has_symbol_idx()) { 35590919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski const std::string str_symbol = util::GetString(*symbol_pool_, pb_ref.symbol_idx()); 356ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ResourceNameRef name_ref; 357ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!ResourceUtils::ParseResourceName(str_symbol, &name_ref, nullptr)) { 35890919978e7ccf7dc25622e9d039a7e87ebe7ba11Adam Lesinski diag_->Error(DiagMessage(source_) << "invalid reference name '" << str_symbol << "'"); 359b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return false; 360b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 361b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 362ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski out_ref->name = name_ref.ToResourceName(); 36359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 364b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return true; 365b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 366b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 367b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski template <typename T> 368ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski void DeserializeItemCommon(const T& pb_item, Value* out_value) { 369ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_item.has_source()) { 370b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski Source source; 371ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeSourceFromPb(pb_item.source(), *source_pool_, &source); 372ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski out_value->SetSource(std::move(source)); 37359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 37459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 375ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_item.has_comment()) { 376ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski out_value->SetComment(pb_item.comment()); 37759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 378b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 379b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 380b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski private: 381ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const android::ResStringPool* value_pool_; 382ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const android::ResStringPool* source_pool_; 383ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const android::ResStringPool* symbol_pool_; 384ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const Source source_; 385ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski IDiagnostics* diag_; 386b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski}; 38759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 388b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski} // namespace 389b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 390ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskistd::unique_ptr<ResourceTable> DeserializeTableFromPb( 391ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::ResourceTable& pb_table, const Source& source, 392b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski IDiagnostics* diag) { 393b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // We import the android namespace because on Windows NO_ERROR is a macro, not 394b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // an enum, which 395b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // causes errors when qualifying it with android:: 396b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski using namespace android; 397b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 398b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>(); 399b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 400ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!pb_table.has_string_pool()) { 401ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag->Error(DiagMessage(source) << "no string pool found"); 402b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 403b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 404b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 405ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ResStringPool value_pool; 406ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski status_t result = value_pool.setTo(pb_table.string_pool().data().data(), 407ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski pb_table.string_pool().data().size()); 408b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (result != NO_ERROR) { 409ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag->Error(DiagMessage(source) << "invalid string pool"); 410b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 411b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 412b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 413ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ResStringPool source_pool; 414ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_table.has_source_pool()) { 415ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski result = source_pool.setTo(pb_table.source_pool().data().data(), 416ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski pb_table.source_pool().data().size()); 417b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (result != NO_ERROR) { 418ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag->Error(DiagMessage(source) << "invalid source pool"); 419b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 420b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 421b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 42259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 423ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ResStringPool symbol_pool; 424ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (pb_table.has_symbol_pool()) { 425ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski result = symbol_pool.setTo(pb_table.symbol_pool().data().data(), 426ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski pb_table.symbol_pool().data().size()); 427b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski if (result != NO_ERROR) { 428ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag->Error(DiagMessage(source) << "invalid symbol pool"); 429b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 430b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 431b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 43259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 433ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski PackagePbDeserializer package_pb_deserializer(&value_pool, &source_pool, 434ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski &symbol_pool, source, diag); 435ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (const pb::Package& pb_package : pb_table.packages()) { 436ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!package_pb_deserializer.DeserializeFromPb(pb_package, table.get())) { 437b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 43859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 439b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 440b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return table; 441b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski} 442b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 443ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskistd::unique_ptr<ResourceFile> DeserializeCompiledFileFromPb( 444ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const pb::CompiledFile& pb_file, const Source& source, IDiagnostics* diag) { 445b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski std::unique_ptr<ResourceFile> file = util::make_unique<ResourceFile>(); 446b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 447ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ResourceNameRef name_ref; 448b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 449b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // Need to create an lvalue here so that nameRef can point to something real. 450ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!ResourceUtils::ParseResourceName(pb_file.resource_name(), &name_ref)) { 451ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag->Error(DiagMessage(source) 452b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski << "invalid resource name in compiled file header: " 453ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski << pb_file.resource_name()); 454b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 455b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 456ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski file->name = name_ref.ToResourceName(); 457ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski file->source.path = pb_file.source_path(); 458ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski DeserializeConfigDescriptionFromPb(pb_file.config(), &file->config); 459b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski 460ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (const pb::CompiledFile_Symbol& pb_symbol : pb_file.exported_symbols()) { 461b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // Need to create an lvalue here so that nameRef can point to something 462b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski // real. 463ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!ResourceUtils::ParseResourceName(pb_symbol.resource_name(), 464ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski &name_ref)) { 465ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski diag->Error(DiagMessage(source) 466b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski << "invalid resource name for exported symbol in " 467b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski "compiled file header: " 468ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski << pb_file.resource_name()); 469b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return {}; 47059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 471ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski file->exported_symbols.push_back( 472ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski SourcedResourceName{name_ref.ToResourceName(), pb_symbol.line_no()}); 473b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski } 474b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski return file; 47559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 47659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 477b54ef10f55ab9f11fdc73b0436b708e518fb5029Adam Lesinski} // namespace aapt 478