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 "ResourceValues.h" 21#include "util/Maybe.h" 22 23#include <string> 24 25namespace aapt { 26namespace xml { 27 28constexpr const char16_t* kSchemaAuto = u"http://schemas.android.com/apk/res-auto"; 29constexpr const char16_t* kSchemaPublicPrefix = u"http://schemas.android.com/apk/res/"; 30constexpr const char16_t* kSchemaPrivatePrefix = u"http://schemas.android.com/apk/prv/res/"; 31constexpr const char16_t* kSchemaAndroid = u"http://schemas.android.com/apk/res/android"; 32 33/** 34 * Result of extracting a package name from a namespace URI declaration. 35 */ 36struct ExtractedPackage { 37 /** 38 * The name of the package. This can be the empty string, which means that the package 39 * should be assumed to be the package being compiled. 40 */ 41 std::u16string package; 42 43 /** 44 * True if the package's private namespace was declared. This means that private resources 45 * are made visible. 46 */ 47 bool privateNamespace; 48}; 49 50/** 51 * Returns an ExtractedPackage struct if the namespace URI is of the form: 52 * http://schemas.android.com/apk/res/<package> or 53 * http://schemas.android.com/apk/prv/res/<package> 54 * 55 * Special case: if namespaceUri is http://schemas.android.com/apk/res-auto, 56 * returns an empty package name. 57 */ 58Maybe<ExtractedPackage> extractPackageFromNamespace(const std::u16string& namespaceUri); 59 60/** 61 * Interface representing a stack of XML namespace declarations. When looking up the package 62 * for a namespace prefix, the stack is checked from top to bottom. 63 */ 64struct IPackageDeclStack { 65 virtual ~IPackageDeclStack() = default; 66 67 /** 68 * Returns an ExtractedPackage struct if the alias given corresponds with a package declaration. 69 */ 70 virtual Maybe<ExtractedPackage> transformPackageAlias( 71 const StringPiece16& alias, const StringPiece16& localPackage) const = 0; 72}; 73 74/** 75 * Helper function for transforming the original Reference inRef to a fully qualified reference 76 * via the IPackageDeclStack. This will also mark the Reference as private if the namespace of 77 * the package declaration was private. 78 */ 79void transformReferenceFromNamespace(IPackageDeclStack* declStack, 80 const StringPiece16& localPackage, Reference* inRef); 81 82} // namespace xml 83} // namespace aapt 84 85#endif /* AAPT_XML_XMLUTIL_H */ 86