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