/* * 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* outPbPool) { BigBuffer buffer(1024); StringPool::flattenUtf8(&buffer, pool); std::string* data = outPbPool->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* srcPool, pb::Source* outPbSource) { StringPool::Ref ref = srcPool->makeRef(util::utf8ToUtf16(source.path)); outPbSource->set_path_idx(static_cast<uint32_t>(ref.getIndex())); if (source.line) { outPbSource->set_line_no(static_cast<uint32_t>(source.line.value())); } } void deserializeSourceFromPb(const pb::Source& pbSource, const android::ResStringPool& srcPool, Source* outSource) { if (pbSource.has_path_idx()) { outSource->path = util::getString8(srcPool, pbSource.path_idx()).toString(); } if (pbSource.has_line_no()) { outSource->line = static_cast<size_t>(pbSource.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 pbVisibility) { switch (pbVisibility) { 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* outPbConfig) { android::ResTable_config flatConfig = config; flatConfig.size = sizeof(flatConfig); flatConfig.swapHtoD(); outPbConfig->set_data(&flatConfig, sizeof(flatConfig)); } bool deserializeConfigDescriptionFromPb(const pb::ConfigDescription& pbConfig, ConfigDescription* outConfig) { if (!pbConfig.has_data()) { return false; } const android::ResTable_config* config; if (pbConfig.data().size() > sizeof(*config)) { return false; } config = reinterpret_cast<const android::ResTable_config*>(pbConfig.data().data()); outConfig->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 pbType) { switch (pbType) { 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 pluralIdx) { switch (pluralIdx) { 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