/* * Copyright (C) 2016 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. */ #include "proto/ProtoHelpers.h" namespace aapt { void SerializeStringPoolToPb(const StringPool& pool, pb::StringPool* out_pb_pool) { BigBuffer buffer(1024); StringPool::FlattenUtf8(&buffer, pool); std::string* data = out_pb_pool->mutable_data(); data->reserve(buffer.size()); size_t offset = 0; for (const BigBuffer::Block& block : buffer) { data->insert(data->begin() + offset, block.buffer.get(), block.buffer.get() + block.size); offset += block.size; } } void SerializeSourceToPb(const Source& source, StringPool* src_pool, pb::Source* out_pb_source) { StringPool::Ref ref = src_pool->MakeRef(source.path); out_pb_source->set_path_idx(static_cast<uint32_t>(ref.index())); if (source.line) { out_pb_source->set_line_no(static_cast<uint32_t>(source.line.value())); } } void DeserializeSourceFromPb(const pb::Source& pb_source, const android::ResStringPool& src_pool, Source* out_source) { if (pb_source.has_path_idx()) { out_source->path = util::GetString(src_pool, pb_source.path_idx()); } if (pb_source.has_line_no()) { out_source->line = static_cast<size_t>(pb_source.line_no()); } } pb::SymbolStatus_Visibility SerializeVisibilityToPb(SymbolState state) { switch (state) { case SymbolState::kPrivate: return pb::SymbolStatus_Visibility_Private; case SymbolState::kPublic: return pb::SymbolStatus_Visibility_Public; default: break; } return pb::SymbolStatus_Visibility_Unknown; } SymbolState DeserializeVisibilityFromPb( pb::SymbolStatus_Visibility pb_visibility) { switch (pb_visibility) { case pb::SymbolStatus_Visibility_Private: return SymbolState::kPrivate; case pb::SymbolStatus_Visibility_Public: return SymbolState::kPublic; default: break; } return SymbolState::kUndefined; } void SerializeConfig(const ConfigDescription& config, pb::ConfigDescription* out_pb_config) { android::ResTable_config flat_config = config; flat_config.size = sizeof(flat_config); flat_config.swapHtoD(); out_pb_config->set_data(&flat_config, sizeof(flat_config)); } bool DeserializeConfigDescriptionFromPb(const pb::ConfigDescription& pb_config, ConfigDescription* out_config) { if (!pb_config.has_data()) { return false; } const android::ResTable_config* config; if (pb_config.data().size() > sizeof(*config)) { return false; } config = reinterpret_cast<const android::ResTable_config*>( pb_config.data().data()); out_config->copyFromDtoH(*config); return true; } pb::Reference_Type SerializeReferenceTypeToPb(Reference::Type type) { switch (type) { case Reference::Type::kResource: return pb::Reference_Type_Ref; case Reference::Type::kAttribute: return pb::Reference_Type_Attr; default: break; } return pb::Reference_Type_Ref; } Reference::Type DeserializeReferenceTypeFromPb(pb::Reference_Type pb_type) { switch (pb_type) { case pb::Reference_Type_Ref: return Reference::Type::kResource; case pb::Reference_Type_Attr: return Reference::Type::kAttribute; default: break; } return Reference::Type::kResource; } pb::Plural_Arity SerializePluralEnumToPb(size_t plural_idx) { switch (plural_idx) { case Plural::Zero: return pb::Plural_Arity_Zero; case Plural::One: return pb::Plural_Arity_One; case Plural::Two: return pb::Plural_Arity_Two; case Plural::Few: return pb::Plural_Arity_Few; case Plural::Many: return pb::Plural_Arity_Many; default: break; } return pb::Plural_Arity_Other; } size_t DeserializePluralEnumFromPb(pb::Plural_Arity arity) { switch (arity) { case pb::Plural_Arity_Zero: return Plural::Zero; case pb::Plural_Arity_One: return Plural::One; case pb::Plural_Arity_Two: return Plural::Two; case pb::Plural_Arity_Few: return Plural::Few; case pb::Plural_Arity_Many: return Plural::Many; default: break; } return Plural::Other; } } // namespace aapt