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