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