/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef AAPT_XML_XMLUTIL_H #define AAPT_XML_XMLUTIL_H #include <string> #include "ResourceValues.h" #include "util/Maybe.h" namespace aapt { namespace xml { constexpr const char* kSchemaAuto = "http://schemas.android.com/apk/res-auto"; constexpr const char* kSchemaPublicPrefix = "http://schemas.android.com/apk/res/"; constexpr const char* kSchemaPrivatePrefix = "http://schemas.android.com/apk/prv/res/"; constexpr const char* kSchemaAndroid = "http://schemas.android.com/apk/res/android"; constexpr const char* kSchemaTools = "http://schemas.android.com/tools"; constexpr const char* kSchemaAapt = "http://schemas.android.com/aapt"; /** * Result of extracting a package name from a namespace URI declaration. */ struct ExtractedPackage { /** * The name of the package. This can be the empty string, which means that the * package * should be assumed to be the package being compiled. */ std::string package; /** * True if the package's private namespace was declared. This means that * private resources * are made visible. */ bool private_namespace; }; /** * Returns an ExtractedPackage struct if the namespace URI is of the form: * http://schemas.android.com/apk/res/<package> or * http://schemas.android.com/apk/prv/res/<package> * * Special case: if namespaceUri is http://schemas.android.com/apk/res-auto, * returns an empty package name. */ Maybe<ExtractedPackage> ExtractPackageFromNamespace( const std::string& namespace_uri); /** * Returns an XML Android namespace for the given package of the form: * * http://schemas.android.com/apk/res/<package> * * If privateReference == true, the package will be of the form: * * http://schemas.android.com/apk/prv/res/<package> */ std::string BuildPackageNamespace(const android::StringPiece& package, bool private_reference = false); /** * Interface representing a stack of XML namespace declarations. When looking up * the package * for a namespace prefix, the stack is checked from top to bottom. */ struct IPackageDeclStack { virtual ~IPackageDeclStack() = default; /** * Returns an ExtractedPackage struct if the alias given corresponds with a * package declaration. */ virtual Maybe<ExtractedPackage> TransformPackageAlias( const android::StringPiece& alias, const android::StringPiece& local_package) const = 0; }; /** * Helper function for transforming the original Reference inRef to a fully * qualified reference * via the IPackageDeclStack. This will also mark the Reference as private if * the namespace of the package declaration was private. */ void TransformReferenceFromNamespace(IPackageDeclStack* decl_stack, const android::StringPiece& local_package, Reference* in_ref); } // namespace xml } // namespace aapt #endif /* AAPT_XML_XMLUTIL_H */