160293197379e522c870c4a28462804207bab505dAdam Lesinski/*
2da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski * Copyright (C) 2016 The Android Open Source Project
360293197379e522c870c4a28462804207bab505dAdam Lesinski *
460293197379e522c870c4a28462804207bab505dAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
560293197379e522c870c4a28462804207bab505dAdam Lesinski * you may not use this file except in compliance with the License.
660293197379e522c870c4a28462804207bab505dAdam Lesinski * You may obtain a copy of the License at
760293197379e522c870c4a28462804207bab505dAdam Lesinski *
860293197379e522c870c4a28462804207bab505dAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
960293197379e522c870c4a28462804207bab505dAdam Lesinski *
1060293197379e522c870c4a28462804207bab505dAdam Lesinski * Unless required by applicable law or agreed to in writing, software
1160293197379e522c870c4a28462804207bab505dAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1260293197379e522c870c4a28462804207bab505dAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1360293197379e522c870c4a28462804207bab505dAdam Lesinski * See the License for the specific language governing permissions and
1460293197379e522c870c4a28462804207bab505dAdam Lesinski * limitations under the License.
1560293197379e522c870c4a28462804207bab505dAdam Lesinski */
1660293197379e522c870c4a28462804207bab505dAdam Lesinski
17da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#include "androidfw/Util.h"
18ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski
19da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#include <string>
204c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski
21da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#include "utils/ByteOrder.h"
22da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#include "utils/Unicode.h"
23ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski
24da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#ifdef _WIN32
25da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#ifdef ERROR
26da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#undef ERROR
27da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#endif
28da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#endif
29ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski
30da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskinamespace android {
31da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskinamespace util {
32ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski
33da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskivoid ReadUtf16StringFromDevice(const uint16_t* src, size_t len, std::string* out) {
34da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski  char buf[5];
35da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski  while (*src && len != 0) {
36da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski    char16_t c = static_cast<char16_t>(dtohs(*src));
37da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski    utf16_to_utf8(&c, 1, buf, sizeof(buf));
38da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski    out->append(buf, strlen(buf));
39da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski    ++src;
40da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski    --len;
41da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski  }
42da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski}
43ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski
44d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinskistd::u16string Utf8ToUtf16(const StringPiece& utf8) {
45d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  ssize_t utf16_length =
46d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski      utf8_to_utf16_length(reinterpret_cast<const uint8_t*>(utf8.data()), utf8.length());
47d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  if (utf16_length <= 0) {
48d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski    return {};
49d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  }
50d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski
51d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  std::u16string utf16;
52d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  utf16.resize(utf16_length);
53d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  utf8_to_utf16(reinterpret_cast<const uint8_t*>(utf8.data()), utf8.length(), &*utf16.begin(),
54d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski                utf16_length + 1);
55d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  return utf16;
56d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski}
57d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski
58d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinskistd::string Utf16ToUtf8(const StringPiece16& utf16) {
59d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  ssize_t utf8_length = utf16_to_utf8_length(utf16.data(), utf16.length());
60d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  if (utf8_length <= 0) {
61d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski    return {};
62d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  }
63d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski
64d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  std::string utf8;
65d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  utf8.resize(utf8_length);
66d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  utf16_to_utf8(utf16.data(), utf16.length(), &*utf8.begin(), utf8_length + 1);
67d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski  return utf8;
68d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski}
69d1ecd7af687bcad0f87c37fe33515ff6c5ea0f1dAdam Lesinski
70da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski} // namespace util
71da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski} // namespace android
72