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 
25 namespace aapt {
26 namespace xml {
27 
28 constexpr const char* kSchemaAuto = "http://schemas.android.com/apk/res-auto";
29 constexpr const char* kSchemaPublicPrefix =
30     "http://schemas.android.com/apk/res/";
31 constexpr const char* kSchemaPrivatePrefix =
32     "http://schemas.android.com/apk/prv/res/";
33 constexpr const char* kSchemaAndroid =
34     "http://schemas.android.com/apk/res/android";
35 constexpr const char* kSchemaTools = "http://schemas.android.com/tools";
36 constexpr const char* kSchemaAapt = "http://schemas.android.com/aapt";
37 
38 /**
39  * Result of extracting a package name from a namespace URI declaration.
40  */
41 struct 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  */
65 Maybe<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  */
77 std::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  */
85 struct 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  */
102 void 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