1c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski/* 2c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * Copyright (C) 2017 The Android Open Source Project 3c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * 4c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * you may not use this file except in compliance with the License. 6c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * You may obtain a copy of the License at 7c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * 8c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * 10c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * Unless required by applicable law or agreed to in writing, software 11c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * See the License for the specific language governing permissions and 14c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski * limitations under the License. 15c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski */ 16c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 17c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#ifndef AAPT_LINKER_XMLCOMPATVERSIONER_H 18c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#define AAPT_LINKER_XMLCOMPATVERSIONER_H 19c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 20c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include <set> 21c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include <unordered_map> 22c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include <vector> 23c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 24c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include "android-base/macros.h" 25c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 26c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include "Resource.h" 27c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include "SdkConstants.h" 28c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include "process/IResourceTableConsumer.h" 29c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include "util/Util.h" 30c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#include "xml/XmlDom.h" 31c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 32c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinskinamespace aapt { 33c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 34c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinskiclass IDegradeRule; 35c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 36c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinskistruct DegradeResult { 37c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski xml::Attribute attr; 38c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski ApiVersion attr_api_version; 39c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski}; 40c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 41c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinskiclass IDegradeRule { 42c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski public: 43c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski IDegradeRule() = default; 44c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski virtual ~IDegradeRule() = default; 45c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 46c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski virtual std::vector<DegradeResult> Degrade(const xml::Element& src_el, 47c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski const xml::Attribute& src_attr, 48c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski StringPool* out_string_pool) const = 0; 49c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 50c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski private: 51c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski DISALLOW_COPY_AND_ASSIGN(IDegradeRule); 52c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski}; 53c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 54c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinskiclass XmlCompatVersioner { 55c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski public: 56c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski using Rules = std::unordered_map<ResourceId, std::unique_ptr<IDegradeRule>>; 57c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 58c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski XmlCompatVersioner(const Rules* rules); 59c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 60c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski std::vector<std::unique_ptr<xml::XmlResource>> Process(IAaptContext* context, 61c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski xml::XmlResource* doc, 62c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski util::Range<ApiVersion> api_range); 63c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 64c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski private: 65c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski DISALLOW_COPY_AND_ASSIGN(XmlCompatVersioner); 66c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 67c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski std::unique_ptr<xml::XmlResource> ProcessDoc(ApiVersion target_api, ApiVersion max_api, 68c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski xml::XmlResource* doc, 69c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski std::set<ApiVersion>* out_apis_referenced); 70c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski void ProcessRule(const xml::Element& src_el, const xml::Attribute& src_attr, 71c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski const ApiVersion& src_attr_version, const IDegradeRule* rule, 72c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski const util::Range<ApiVersion>& api_range, bool generated, xml::Element* dst_el, 73c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski std::set<ApiVersion>* out_apis_referenced, StringPool* out_string_pool); 74c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 75c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski const Rules* rules_; 76c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski}; 77c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 78c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinskistruct ReplacementAttr { 79c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski std::string name; 80c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski ResourceId id; 81c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski Attribute attr; 82c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski}; 83c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 84c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinskiclass DegradeToManyRule : public IDegradeRule { 85c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski public: 86c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski DegradeToManyRule(std::vector<ReplacementAttr> attrs); 87c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski virtual ~DegradeToManyRule() = default; 88c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 89c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski std::vector<DegradeResult> Degrade(const xml::Element& src_el, const xml::Attribute& src_attr, 90c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski StringPool* out_string_pool) const override; 91c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 92c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski private: 93c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski DISALLOW_COPY_AND_ASSIGN(DegradeToManyRule); 94c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 95c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski std::vector<ReplacementAttr> attrs_; 96c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski}; 97c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 98c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski} // namespace aapt 99c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski 100c744ae8aca97edfb2422598ea620e8219449fa9bAdam Lesinski#endif // AAPT_LINKER_XMLCOMPATVERSIONER_H 101