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#include "xml/XmlUtil.h" 18467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 19467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include <string> 20467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "util/Maybe.h" 22ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "util/Util.h" 23ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 24d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiusing android::StringPiece; 25d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski 26467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskinamespace aapt { 27467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskinamespace xml { 28467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 29ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskistd::string BuildPackageNamespace(const StringPiece& package, 30ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski bool private_reference) { 31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string result = 32ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski private_reference ? kSchemaPrivatePrefix : kSchemaPublicPrefix; 33ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski result.append(package.data(), package.size()); 34ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return result; 35d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski} 36d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski 37ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam LesinskiMaybe<ExtractedPackage> ExtractPackageFromNamespace( 38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const std::string& namespace_uri) { 39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (util::StartsWith(namespace_uri, kSchemaPublicPrefix)) { 40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski StringPiece schema_prefix = kSchemaPublicPrefix; 41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski StringPiece package = namespace_uri; 42ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski package = package.substr(schema_prefix.size(), 43ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski package.size() - schema_prefix.size()); 44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (package.empty()) { 45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return {}; 46ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 47d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski return ExtractedPackage{package.to_string(), false /* is_private */}; 48467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 49ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (util::StartsWith(namespace_uri, kSchemaPrivatePrefix)) { 50ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski StringPiece schema_prefix = kSchemaPrivatePrefix; 51ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski StringPiece package = namespace_uri; 52ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski package = package.substr(schema_prefix.size(), 53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski package.size() - schema_prefix.size()); 54ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (package.empty()) { 55ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return {}; 56467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski } 57d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski return ExtractedPackage{package.to_string(), true /* is_private */}; 58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 59ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } else if (namespace_uri == kSchemaAuto) { 60ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return ExtractedPackage{std::string(), true /* is_private */}; 61ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return {}; 63467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski} 64467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 65ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskivoid TransformReferenceFromNamespace(IPackageDeclStack* decl_stack, 66ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const StringPiece& local_package, 67ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Reference* in_ref) { 68ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (in_ref->name) { 69ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (Maybe<ExtractedPackage> transformed_package = 70ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski decl_stack->TransformPackageAlias(in_ref->name.value().package, 71ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski local_package)) { 72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ExtractedPackage& extracted_package = transformed_package.value(); 73ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski in_ref->name.value().package = std::move(extracted_package.package); 74467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 75ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski // If the reference was already private (with a * prefix) and the 76ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski // namespace is public, 77ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski // we keep the reference private. 78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski in_ref->private_reference |= extracted_package.private_namespace; 79467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski } 80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 81467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski} 82467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 83ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski} // namespace xml 84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski} // namespace aapt 85