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 1759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski#include "proto/ProtoHelpers.h" 1859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 1959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskinamespace aapt { 2059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 2159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskivoid serializeStringPoolToPb(const StringPool& pool, pb::StringPool* outPbPool) { 2259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski BigBuffer buffer(1024); 2359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski StringPool::flattenUtf8(&buffer, pool); 2459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 2559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski std::string* data = outPbPool->mutable_data(); 2659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski data->reserve(buffer.size()); 2759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 2859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski size_t offset = 0; 2959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski for (const BigBuffer::Block& block : buffer) { 3059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski data->insert(data->begin() + offset, block.buffer.get(), block.buffer.get() + block.size); 3159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski offset += block.size; 3259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 3359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 3459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 3559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskivoid serializeSourceToPb(const Source& source, StringPool* srcPool, pb::Source* outPbSource) { 3659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski StringPool::Ref ref = srcPool->makeRef(util::utf8ToUtf16(source.path)); 3759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski outPbSource->set_path_idx(static_cast<uint32_t>(ref.getIndex())); 3859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (source.line) { 3959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski outPbSource->set_line_no(static_cast<uint32_t>(source.line.value())); 4059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 4159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 4259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 4359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskivoid deserializeSourceFromPb(const pb::Source& pbSource, const android::ResStringPool& srcPool, 4459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski Source* outSource) { 4559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (pbSource.has_path_idx()) { 4659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski outSource->path = util::getString8(srcPool, pbSource.path_idx()).toString(); 4759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 4859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 4959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (pbSource.has_line_no()) { 5059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski outSource->line = static_cast<size_t>(pbSource.line_no()); 5159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 5259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 5359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 5459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskipb::SymbolStatus_Visibility serializeVisibilityToPb(SymbolState state) { 5559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski switch (state) { 5659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case SymbolState::kPrivate: return pb::SymbolStatus_Visibility_Private; 5759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case SymbolState::kPublic: return pb::SymbolStatus_Visibility_Public; 5859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski default: break; 5959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 6059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return pb::SymbolStatus_Visibility_Unknown; 6159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 6259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 6359e04c6f92da584b322c87072f18e6cab4de4c60Adam LesinskiSymbolState deserializeVisibilityFromPb(pb::SymbolStatus_Visibility pbVisibility) { 6459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski switch (pbVisibility) { 6559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::SymbolStatus_Visibility_Private: return SymbolState::kPrivate; 6659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::SymbolStatus_Visibility_Public: return SymbolState::kPublic; 6759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski default: break; 6859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 6959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return SymbolState::kUndefined; 7059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 7159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 7259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskivoid serializeConfig(const ConfigDescription& config, pb::ConfigDescription* outPbConfig) { 7359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski android::ResTable_config flatConfig = config; 7459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski flatConfig.size = sizeof(flatConfig); 7559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski flatConfig.swapHtoD(); 7659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski outPbConfig->set_data(&flatConfig, sizeof(flatConfig)); 7759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 7859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 7959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskibool deserializeConfigDescriptionFromPb(const pb::ConfigDescription& pbConfig, 8059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski ConfigDescription* outConfig) { 8159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (!pbConfig.has_data()) { 8259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return false; 8359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 8459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 8559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski const android::ResTable_config* config; 8659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski if (pbConfig.data().size() > sizeof(*config)) { 8759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return false; 8859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 8959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 9059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski config = reinterpret_cast<const android::ResTable_config*>(pbConfig.data().data()); 9159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski outConfig->copyFromDtoH(*config); 9259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return true; 9359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 9459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 9559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskipb::Reference_Type serializeReferenceTypeToPb(Reference::Type type) { 9659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski switch (type) { 9759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case Reference::Type::kResource: return pb::Reference_Type_Ref; 9859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case Reference::Type::kAttribute: return pb::Reference_Type_Attr; 9959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski default: break; 10059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 10159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return pb::Reference_Type_Ref; 10259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 10359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 10459e04c6f92da584b322c87072f18e6cab4de4c60Adam LesinskiReference::Type deserializeReferenceTypeFromPb(pb::Reference_Type pbType) { 10559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski switch (pbType) { 10659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::Reference_Type_Ref: return Reference::Type::kResource; 10759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::Reference_Type_Attr: return Reference::Type::kAttribute; 10859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski default: break; 10959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 11059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return Reference::Type::kResource; 11159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 11259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 11359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskipb::Plural_Arity serializePluralEnumToPb(size_t pluralIdx) { 11459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski switch (pluralIdx) { 11559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case Plural::Zero: return pb::Plural_Arity_Zero; 11659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case Plural::One: return pb::Plural_Arity_One; 11759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case Plural::Two: return pb::Plural_Arity_Two; 11859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case Plural::Few: return pb::Plural_Arity_Few; 11959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case Plural::Many: return pb::Plural_Arity_Many; 12059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski default: break; 12159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 12259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return pb::Plural_Arity_Other; 12359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 12459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 12559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinskisize_t deserializePluralEnumFromPb(pb::Plural_Arity arity) { 12659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski switch (arity) { 12759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::Plural_Arity_Zero: return Plural::Zero; 12859e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::Plural_Arity_One: return Plural::One; 12959e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::Plural_Arity_Two: return Plural::Two; 13059e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::Plural_Arity_Few: return Plural::Few; 13159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski case pb::Plural_Arity_Many: return Plural::Many; 13259e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski default: break; 13359e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski } 13459e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski return Plural::Other; 13559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} 13659e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski 13759e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski} // namespace aapt 138