1467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski/*
2467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
3467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski *
4467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * you may not use this file except in compliance with the License.
6467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * You may obtain a copy of the License at
7467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski *
8467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski *
10467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * See the License for the specific language governing permissions and
14467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski * limitations under the License.
15467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski */
16467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
17467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#ifndef AAPT_XML_XMLUTIL_H
18467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#define AAPT_XML_XMLUTIL_H
19467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
20ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <string>
21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
22467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "ResourceValues.h"
23467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "util/Maybe.h"
24467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
25467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskinamespace aapt {
26467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskinamespace xml {
27467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
28d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinskiconstexpr const char* kSchemaAuto = "http://schemas.android.com/apk/res-auto";
296b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskiconstexpr const char* kSchemaPublicPrefix = "http://schemas.android.com/apk/res/";
306b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskiconstexpr const char* kSchemaPrivatePrefix = "http://schemas.android.com/apk/prv/res/";
316b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinskiconstexpr const char* kSchemaAndroid = "http://schemas.android.com/apk/res/android";
32a9ff14098b9d938aec86cf58abbdd3c4dc0779ccAlexandria Cornwallconstexpr const char* kSchemaTools = "http://schemas.android.com/tools";
335eeaaddffd23d8d85aeb321e3ceea626e42cf9deAdam Lesinskiconstexpr const char* kSchemaAapt = "http://schemas.android.com/aapt";
34467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
356b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// Result of extracting a package name from a namespace URI declaration.
36467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskistruct ExtractedPackage {
376b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  // The name of the package. This can be the empty string, which means that the package
381ef0fa9d7242b1926543bc49e35905d1be02a781Adam Lesinski  // should be assumed to be the same as the CallSite it was defined in.
39cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::string package;
40467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
416b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  // True if the package's private namespace was declared. This means that private resources
426b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  // are made visible.
43ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  bool private_namespace;
446b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski
456b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  friend inline bool operator==(const ExtractedPackage& a, const ExtractedPackage& b) {
466b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski    return a.package == b.package && a.private_namespace == b.private_namespace;
476b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  }
48467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski};
49467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
506b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// Returns an ExtractedPackage struct if the namespace URI is of the form:
516b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski//   http://schemas.android.com/apk/res/<package> or
526b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski//   http://schemas.android.com/apk/prv/res/<package>
536b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski//
541ef0fa9d7242b1926543bc49e35905d1be02a781Adam Lesinski// Special case: if namespaceUri is http://schemas.android.com/apk/res-auto, returns an empty
551ef0fa9d7242b1926543bc49e35905d1be02a781Adam Lesinski// package name.
566b372991296c9f2bd6f8f8847dcd23d50970d06dAdam LesinskiMaybe<ExtractedPackage> ExtractPackageFromNamespace(const std::string& namespace_uri);
57d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski
586b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// Returns an XML Android namespace for the given package of the form:
596b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski//   http://schemas.android.com/apk/res/<package>
606b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski//
616b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// If privateReference == true, the package will be of the form:
626b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski//   http://schemas.android.com/apk/prv/res/<package>
63d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskistd::string BuildPackageNamespace(const android::StringPiece& package,
64ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                  bool private_reference = false);
65467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
661ef0fa9d7242b1926543bc49e35905d1be02a781Adam Lesinski// Interface representing a stack of XML namespace declarations. When looking up the package for a
671ef0fa9d7242b1926543bc49e35905d1be02a781Adam Lesinski// namespace prefix, the stack is checked from top to bottom.
68467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskistruct IPackageDeclStack {
69cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  virtual ~IPackageDeclStack() = default;
70467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
716b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  // Returns an ExtractedPackage struct if the alias given corresponds with a package declaration.
72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  virtual Maybe<ExtractedPackage> TransformPackageAlias(
731ef0fa9d7242b1926543bc49e35905d1be02a781Adam Lesinski      const android::StringPiece& alias) const = 0;
74467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski};
75467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
766b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// Helper function for transforming the original Reference inRef to a fully qualified reference
776b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// via the IPackageDeclStack. This will also mark the Reference as private if the namespace of the
786b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski// package declaration was private.
791ef0fa9d7242b1926543bc49e35905d1be02a781Adam Lesinskivoid ResolvePackage(const IPackageDeclStack* decl_stack, Reference* in_ref);
80467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
81004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskiclass Element;
82004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
83004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski// Strips out any attributes in the http://schemas.android.com/tools namespace, which is owned by
84004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski// Android Studio and should not make it to the final APK.
85004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskivoid StripAndroidStudioAttributes(Element* el);
86004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
87cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace xml
88cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
89467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
90467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#endif /* AAPT_XML_XMLUTIL_H */
91