xref: /aosp_15_r20/external/cronet/base/win/scoped_hstring.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 Worker void 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 Worker ScopedHString::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 Worker ScopedHString 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 Worker ScopedHString 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 Worker std::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 Worker std::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