XmlUtil.cpp revision d0f116b619feede0cfdb647157ce5ab4d50a1c46
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 "util/Maybe.h" 18467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "util/Util.h" 19467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "xml/XmlUtil.h" 20467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 21467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include <string> 22467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 23467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskinamespace aapt { 24467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskinamespace xml { 25467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 26d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinskistd::string buildPackageNamespace(const StringPiece& package) { 27d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski std::string result = kSchemaPublicPrefix; 28d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski result.append(package.data(), package.size()); 29d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski return result; 30d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski} 31d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski 32d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam LesinskiMaybe<ExtractedPackage> extractPackageFromNamespace(const std::string& namespaceUri) { 33d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski if (util::stringStartsWith(namespaceUri, kSchemaPublicPrefix)) { 34d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski StringPiece schemaPrefix = kSchemaPublicPrefix; 35d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski StringPiece package = namespaceUri; 36467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski package = package.substr(schemaPrefix.size(), package.size() - schemaPrefix.size()); 37467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski if (package.empty()) { 38467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski return {}; 39467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski } 40467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski return ExtractedPackage{ package.toString(), false /* isPrivate */ }; 41467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 42d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski } else if (util::stringStartsWith(namespaceUri, kSchemaPrivatePrefix)) { 43d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski StringPiece schemaPrefix = kSchemaPrivatePrefix; 44d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski StringPiece package = namespaceUri; 45467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski package = package.substr(schemaPrefix.size(), package.size() - schemaPrefix.size()); 46467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski if (package.empty()) { 47467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski return {}; 48467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski } 49467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski return ExtractedPackage{ package.toString(), true /* isPrivate */ }; 50467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 51467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski } else if (namespaceUri == kSchemaAuto) { 52d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski return ExtractedPackage{ std::string(), true /* isPrivate */ }; 53467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski } 54467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski return {}; 55467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski} 56467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 57467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskivoid transformReferenceFromNamespace(IPackageDeclStack* declStack, 58d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski const StringPiece& localPackage, Reference* inRef) { 59467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski if (inRef->name) { 60467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski if (Maybe<ExtractedPackage> transformedPackage = 61467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski declStack->transformPackageAlias(inRef->name.value().package, localPackage)) { 62467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski ExtractedPackage& extractedPackage = transformedPackage.value(); 63467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski inRef->name.value().package = std::move(extractedPackage.package); 64467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 65467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski // If the reference was already private (with a * prefix) and the namespace is public, 66467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski // we keep the reference private. 67467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski inRef->privateReference |= extractedPackage.privateNamespace; 68467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski } 69467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski } 70467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski} 71467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski 72467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski} // namespace xml 73467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski} // namespace aapt 74