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