From a132c3305dfa97d43f34162802fbc44ed4888b42 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Wed, 29 Sep 2021 18:03:37 -0700 Subject: [PATCH] Refactored utf16->utf8 support from DynDep to common --- dev/Common/Microsoft.Utf8.h | 48 ++++++++++++++++++ dev/DynamicDependency/API/DataStore.cpp | 1 - .../API/DynamicDependency.vcxitems | 1 - .../API/DynamicDependency.vcxitems.filters | 2 +- .../API/PackageDependency.cpp | 6 +-- dev/DynamicDependency/API/pch.h | 1 + dev/DynamicDependency/API/utf8.h | 49 ------------------- dev/WindowsAppRuntime_DLL/pch.h | 1 + 8 files changed, 53 insertions(+), 56 deletions(-) delete mode 100644 dev/DynamicDependency/API/utf8.h diff --git a/dev/Common/Microsoft.Utf8.h b/dev/Common/Microsoft.Utf8.h index eb8581c7cb..b0c6d94cbd 100644 --- a/dev/Common/Microsoft.Utf8.h +++ b/dev/Common/Microsoft.Utf8.h @@ -1,8 +1,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. +#ifndef __MICROSOFT_UTF8_H +#define __MICROSOFT_UTF8_H + namespace Microsoft::Utf8 { +// UTF8->UTF16 conversions template T ToUtf16(PCSTR utf8); @@ -45,8 +49,52 @@ template<> inline winrt::hstring ToUtf16(PCSTR utf8) return winrt::hstring(s.get()); } +inline std::wstring ToUtf16(const std::string& utf8) +{ + return ToUtf16(utf8.c_str()); +} + inline winrt::hstring ToHString(PCSTR utf8) { return ToUtf16(utf8); } + +// UTF16->UTF8 conversions +template +T ToUtf8(PCWSTR utf16); + +template<> inline std::unique_ptr ToUtf8(PCWSTR utf16) +{ + if (!utf16) + { + return std::make_unique(0); + } + + const auto lengthIncludingNullTerminator{ ::WideCharToMultiByte(CP_UTF8, 0, utf16, -1, nullptr, 0, nullptr, nullptr) }; + THROW_IF_WIN32_BOOL_FALSE(lengthIncludingNullTerminator); + + std::unique_ptr s{ std::make_unique(lengthIncludingNullTerminator) }; + + THROW_IF_WIN32_BOOL_FALSE(::WideCharToMultiByte(CP_UTF8, 0, utf16, -1, s.get(), lengthIncludingNullTerminator, nullptr, nullptr)); + s[lengthIncludingNullTerminator - 1] = '\0'; + return s; +} + +template<> inline std::string ToUtf8(PCWSTR utf16) +{ + if (!utf16) + { + return std::string(); + } + + auto s{ ToUtf8>(utf16) }; + return std::string(s.get()); +} + +inline std::string ToUtf8(const std::wstring& utf16) +{ + return ToUtf8(utf16.c_str()); +} } + +#endif // __MICROSOFT_UTF8_H diff --git a/dev/DynamicDependency/API/DataStore.cpp b/dev/DynamicDependency/API/DataStore.cpp index b271a0d485..8805f6451e 100644 --- a/dev/DynamicDependency/API/DataStore.cpp +++ b/dev/DynamicDependency/API/DataStore.cpp @@ -6,7 +6,6 @@ #include "DataStore.h" #include "DynamicDependencyDataStore_h.h" -#include "utf8.h" #include "winrt_msixdynamicdepednency.h" #include diff --git a/dev/DynamicDependency/API/DynamicDependency.vcxitems b/dev/DynamicDependency/API/DynamicDependency.vcxitems index 078e36e815..9932ab6384 100644 --- a/dev/DynamicDependency/API/DynamicDependency.vcxitems +++ b/dev/DynamicDependency/API/DynamicDependency.vcxitems @@ -56,7 +56,6 @@ - diff --git a/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters b/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters index bcf1a517e5..1226846aae 100644 --- a/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters +++ b/dev/DynamicDependency/API/DynamicDependency.vcxitems.filters @@ -41,7 +41,6 @@ - @@ -50,6 +49,7 @@ + diff --git a/dev/DynamicDependency/API/PackageDependency.cpp b/dev/DynamicDependency/API/PackageDependency.cpp index c67540aac5..21d1ec437b 100644 --- a/dev/DynamicDependency/API/PackageDependency.cpp +++ b/dev/DynamicDependency/API/PackageDependency.cpp @@ -5,8 +5,6 @@ #include "pch.h" -#include "utf8.h" - #include "PackageDependency.h" namespace JSON = winrt::Windows::Data::Json; @@ -64,7 +62,7 @@ std::wstring MddCore::PackageDependency::ToJSON() const std::string MddCore::PackageDependency::ToJSONUtf8() const { - return to_utf8(ToJSON()); + return Microsoft::Utf8::ToUtf8(ToJSON()); } MddCore::PackageDependency MddCore::PackageDependency::FromJSON(const winrt::hstring& json) @@ -84,7 +82,7 @@ MddCore::PackageDependency MddCore::PackageDependency::FromJSON(const winrt::hst MddCore::PackageDependency MddCore::PackageDependency::FromJSON(PCSTR jsonUtf8) { - return FromJSON(utf8_to_hstring(jsonUtf8)); + return FromJSON(Microsoft::Utf8::ToHString(jsonUtf8)); } bool MddCore::PackageDependency::IsExpired() const diff --git a/dev/DynamicDependency/API/pch.h b/dev/DynamicDependency/API/pch.h index 72a27177e9..bd657f646d 100644 --- a/dev/DynamicDependency/API/pch.h +++ b/dev/DynamicDependency/API/pch.h @@ -38,4 +38,5 @@ #include #include +#include #include diff --git a/dev/DynamicDependency/API/utf8.h b/dev/DynamicDependency/API/utf8.h deleted file mode 100644 index 66fe4936bd..0000000000 --- a/dev/DynamicDependency/API/utf8.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See LICENSE in the project root for license information. - -namespace MddCore -{ - inline winrt::hstring utf8_to_hstring(PCSTR utf8) - { - if (!utf8) - { - return winrt::hstring(); - } - - const auto lengthIncludingNullTerminator{ MultiByteToWideChar(CP_UTF8, 0, utf8, -1, nullptr, 0) }; - THROW_IF_WIN32_BOOL_FALSE(lengthIncludingNullTerminator); - - std::unique_ptr s{ std::make_unique(lengthIncludingNullTerminator) }; - - THROW_IF_WIN32_BOOL_FALSE(MultiByteToWideChar(CP_UTF8, 0, utf8, -1, s.get(), lengthIncludingNullTerminator)); - s[lengthIncludingNullTerminator - 1] = L'\0'; - return winrt::hstring(s.get()); - } - - inline std::string to_utf8(PCWSTR s) - { - if (!s) - { - return nullptr; - } - - const auto lengthIncludingNullTerminator{ WideCharToMultiByte(CP_UTF8, 0, s, -1, nullptr, 0, nullptr, nullptr) }; - THROW_IF_WIN32_BOOL_FALSE(lengthIncludingNullTerminator); - - std::unique_ptr utf8{ std::make_unique(lengthIncludingNullTerminator) }; - - THROW_IF_WIN32_BOOL_FALSE(WideCharToMultiByte(CP_UTF8, 0, s, -1, utf8.get(), lengthIncludingNullTerminator, nullptr, nullptr)); - utf8[lengthIncludingNullTerminator - 1] = '\0'; - return std::string(utf8.get()); - } - - inline std::string to_utf8(const std::wstring& s) - { - return to_utf8(s.c_str()); - } - - inline std::string to_utf8(const winrt::hstring& s) - { - return to_utf8(s.c_str()); - } -} diff --git a/dev/WindowsAppRuntime_DLL/pch.h b/dev/WindowsAppRuntime_DLL/pch.h index ce1c5e3a73..de4b82764d 100644 --- a/dev/WindowsAppRuntime_DLL/pch.h +++ b/dev/WindowsAppRuntime_DLL/pch.h @@ -46,5 +46,6 @@ #include #include +#include #include #include <..\WindowsAppRuntime_Insights\WindowsAppRuntimeInsights.h>