1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_hstring.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <winstring.h> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #include <ostream> 10*6777b538SAndroid Build Coastguard Worker #include <string> 11*6777b538SAndroid Build Coastguard Worker #include <string_view> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/process/memory.h" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h" 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace base { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker namespace internal { 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker // static Free(HSTRING hstr)25*6777b538SAndroid Build Coastguard Workervoid ScopedHStringTraits::Free(HSTRING hstr) { 26*6777b538SAndroid Build Coastguard Worker ::WindowsDeleteString(hstr); 27*6777b538SAndroid Build Coastguard Worker } 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker } // namespace internal 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker namespace win { 32*6777b538SAndroid Build Coastguard Worker ScopedHString(HSTRING hstr)33*6777b538SAndroid Build Coastguard WorkerScopedHString::ScopedHString(HSTRING hstr) : ScopedGeneric(hstr) {} 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // static Create(std::wstring_view str)36*6777b538SAndroid Build Coastguard WorkerScopedHString ScopedHString::Create(std::wstring_view str) { 37*6777b538SAndroid Build Coastguard Worker HSTRING hstr; 38*6777b538SAndroid Build Coastguard Worker HRESULT hr = ::WindowsCreateString(str.data(), 39*6777b538SAndroid Build Coastguard Worker checked_cast<UINT32>(str.length()), &hstr); 40*6777b538SAndroid Build Coastguard Worker if (SUCCEEDED(hr)) 41*6777b538SAndroid Build Coastguard Worker return ScopedHString(hstr); 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker if (hr == E_OUTOFMEMORY) { 44*6777b538SAndroid Build Coastguard Worker // This size is an approximation. The actual size likely includes 45*6777b538SAndroid Build Coastguard Worker // sizeof(HSTRING_HEADER) as well. 46*6777b538SAndroid Build Coastguard Worker base::TerminateBecauseOutOfMemory((str.length() + 1) * sizeof(wchar_t)); 47*6777b538SAndroid Build Coastguard Worker } 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker // This should not happen at runtime. Otherwise we could silently pass nullptr 50*6777b538SAndroid Build Coastguard Worker // or an empty string to downstream code. 51*6777b538SAndroid Build Coastguard Worker NOTREACHED() << "Failed to create HSTRING: " << std::hex << hr; 52*6777b538SAndroid Build Coastguard Worker return ScopedHString(nullptr); 53*6777b538SAndroid Build Coastguard Worker } 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // static Create(std::string_view str)56*6777b538SAndroid Build Coastguard WorkerScopedHString ScopedHString::Create(std::string_view str) { 57*6777b538SAndroid Build Coastguard Worker return Create(UTF8ToWide(str)); 58*6777b538SAndroid Build Coastguard Worker } 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker // static Get() const61*6777b538SAndroid Build Coastguard Workerstd::wstring_view ScopedHString::Get() const { 62*6777b538SAndroid Build Coastguard Worker UINT32 length = 0; 63*6777b538SAndroid Build Coastguard Worker const wchar_t* buffer = ::WindowsGetStringRawBuffer(get(), &length); 64*6777b538SAndroid Build Coastguard Worker return std::wstring_view(buffer, length); 65*6777b538SAndroid Build Coastguard Worker } 66*6777b538SAndroid Build Coastguard Worker GetAsUTF8() const67*6777b538SAndroid Build Coastguard Workerstd::string ScopedHString::GetAsUTF8() const { 68*6777b538SAndroid Build Coastguard Worker return WideToUTF8(Get()); 69*6777b538SAndroid Build Coastguard Worker } 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker } // namespace win 72*6777b538SAndroid Build Coastguard Worker } // namespace base 73