1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef AAPT_XML_XMLUTIL_H
18#define AAPT_XML_XMLUTIL_H
19
20#include <string>
21
22#include "ResourceValues.h"
23#include "util/Maybe.h"
24
25namespace aapt {
26namespace xml {
27
28constexpr const char* kSchemaAuto = "http://schemas.android.com/apk/res-auto";
29constexpr const char* kSchemaPublicPrefix =
30    "http://schemas.android.com/apk/res/";
31constexpr const char* kSchemaPrivatePrefix =
32    "http://schemas.android.com/apk/prv/res/";
33constexpr const char* kSchemaAndroid =
34    "http://schemas.android.com/apk/res/android";
35constexpr const char* kSchemaTools = "http://schemas.android.com/tools";
36constexpr const char* kSchemaAapt = "http://schemas.android.com/aapt";
37
38/**
39 * Result of extracting a package name from a namespace URI declaration.
40 */
41struct ExtractedPackage {
42  /**
43   * The name of the package. This can be the empty string, which means that the
44   * package
45   * should be assumed to be the package being compiled.
46   */
47  std::string package;
48
49  /**
50   * True if the package's private namespace was declared. This means that
51   * private resources
52   * are made visible.
53   */
54  bool private_namespace;
55};
56
57/**
58 * Returns an ExtractedPackage struct if the namespace URI is of the form:
59 * http://schemas.android.com/apk/res/<package> or
60 * http://schemas.android.com/apk/prv/res/<package>
61 *
62 * Special case: if namespaceUri is http://schemas.android.com/apk/res-auto,
63 * returns an empty package name.
64 */
65Maybe<ExtractedPackage> ExtractPackageFromNamespace(
66    const std::string& namespace_uri);
67
68/**
69 * Returns an XML Android namespace for the given package of the form:
70 *
71 * http://schemas.android.com/apk/res/<package>
72 *
73 * If privateReference == true, the package will be of the form:
74 *
75 * http://schemas.android.com/apk/prv/res/<package>
76 */
77std::string BuildPackageNamespace(const android::StringPiece& package,
78                                  bool private_reference = false);
79
80/**
81 * Interface representing a stack of XML namespace declarations. When looking up
82 * the package
83 * for a namespace prefix, the stack is checked from top to bottom.
84 */
85struct IPackageDeclStack {
86  virtual ~IPackageDeclStack() = default;
87
88  /**
89   * Returns an ExtractedPackage struct if the alias given corresponds with a
90   * package declaration.
91   */
92  virtual Maybe<ExtractedPackage> TransformPackageAlias(
93      const android::StringPiece& alias, const android::StringPiece& local_package) const = 0;
94};
95
96/**
97 * Helper function for transforming the original Reference inRef to a fully
98 * qualified reference
99 * via the IPackageDeclStack. This will also mark the Reference as private if
100 * the namespace of the package declaration was private.
101 */
102void TransformReferenceFromNamespace(IPackageDeclStack* decl_stack,
103                                     const android::StringPiece& local_package, Reference* in_ref);
104
105}  // namespace xml
106}  // namespace aapt
107
108#endif /* AAPT_XML_XMLUTIL_H */
109