summaryrefslogtreecommitdiff
path: root/tools/aapt2/ResourceUtils.cpp
diff options
context:
space:
mode:
authorRyan Mitchell <rtmitchell@google.com>2019-01-24 10:58:23 -0800
committerRyan Mitchell <rtmitchell@google.com>2019-02-20 09:46:00 -0800
commita55dc2ed6bf2b4e6ad0ab2d1ae501bf7ec4c1e15 (patch)
treeae357da8ff44ed100c7444ce8b89b4c32ef9dd53 /tools/aapt2/ResourceUtils.cpp
parentde19d80f378fb1930e396ef8b5b27764b6a8b2d3 (diff)
Fix long paths on Windows
util::mkdirs iteratively creates each directory of a specified path. For windows, Calling mkdir on only the drive letter or on the extended path prefix (\?\\) will result in an error. Start after the long path prefix and the drive letter. This also changes AAPT2 to use AssetMaanager2 to retrieve symbols from the symbol table. AssetManager2's zip library uses _wopen to open windows files. Bug:123251200 Test: aapt2_tests.exe Change-Id: I26169d83b22d441485de3c49d63a6c4ed710e292
Diffstat (limited to 'tools/aapt2/ResourceUtils.cpp')
-rw-r--r--tools/aapt2/ResourceUtils.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index 0032960ff93e..ffc1a92a88b0 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -44,6 +44,7 @@ constexpr int32_t kNonBreakingSpace = 0xa0;
Maybe<ResourceName> ToResourceName(
const android::ResTable::resource_name& name_in) {
+ // TODO: Remove this when ResTable and AssetManager(1) are removed from AAPT2
ResourceName name_out;
if (!name_in.package) {
return {};
@@ -79,6 +80,41 @@ Maybe<ResourceName> ToResourceName(
return name_out;
}
+Maybe<ResourceName> ToResourceName(const android::AssetManager2::ResourceName& name_in) {
+ ResourceName name_out;
+ if (!name_in.package) {
+ return {};
+ }
+
+ name_out.package = std::string(name_in.package, name_in.package_len);
+
+ const ResourceType* type;
+ if (name_in.type16) {
+ type = ParseResourceType(
+ util::Utf16ToUtf8(StringPiece16(name_in.type16, name_in.type_len)));
+ } else if (name_in.type) {
+ type = ParseResourceType(StringPiece(name_in.type, name_in.type_len));
+ } else {
+ return {};
+ }
+
+ if (!type) {
+ return {};
+ }
+
+ name_out.type = *type;
+
+ if (name_in.entry16) {
+ name_out.entry =
+ util::Utf16ToUtf8(StringPiece16(name_in.entry16, name_in.entry_len));
+ } else if (name_in.entry) {
+ name_out.entry = std::string(name_in.entry, name_in.entry_len);
+ } else {
+ return {};
+ }
+ return name_out;
+}
+
bool ParseResourceName(const StringPiece& str, ResourceNameRef* out_ref,
bool* out_private) {
if (str.empty()) {