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