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 #ifndef BASE_WIN_SCOPED_HSTRING_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_SCOPED_HSTRING_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <hstring.h> 9*6777b538SAndroid Build Coastguard Worker 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/scoped_generic.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace internal { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker // Scoped HSTRING class to maintain lifetime of HSTRINGs allocated with 20*6777b538SAndroid Build Coastguard Worker // WindowsCreateString(). 21*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT ScopedHStringTraits { InvalidValueScopedHStringTraits22*6777b538SAndroid Build Coastguard Worker static HSTRING InvalidValue() { return nullptr; } 23*6777b538SAndroid Build Coastguard Worker static void Free(HSTRING hstr); 24*6777b538SAndroid Build Coastguard Worker }; 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker } // namespace internal 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker namespace win { 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker // ScopedHString is a wrapper around an HSTRING. 31*6777b538SAndroid Build Coastguard Worker // 32*6777b538SAndroid Build Coastguard Worker // Example use: 33*6777b538SAndroid Build Coastguard Worker // 34*6777b538SAndroid Build Coastguard Worker // ScopedHString string = ScopedHString::Create(L"abc"); 35*6777b538SAndroid Build Coastguard Worker // 36*6777b538SAndroid Build Coastguard Worker // Also: 37*6777b538SAndroid Build Coastguard Worker // 38*6777b538SAndroid Build Coastguard Worker // HSTRING win_string; 39*6777b538SAndroid Build Coastguard Worker // HRESULT hr = WindowsCreateString(..., &win_string); 40*6777b538SAndroid Build Coastguard Worker // ScopedHString string(win_string); 41*6777b538SAndroid Build Coastguard Worker // 42*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ScopedHString 43*6777b538SAndroid Build Coastguard Worker : public ScopedGeneric<HSTRING, base::internal::ScopedHStringTraits> { 44*6777b538SAndroid Build Coastguard Worker public: 45*6777b538SAndroid Build Coastguard Worker // Constructs a ScopedHString from an HSTRING, and takes ownership of |hstr|. 46*6777b538SAndroid Build Coastguard Worker explicit ScopedHString(HSTRING hstr); 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker static ScopedHString Create(std::wstring_view str); 49*6777b538SAndroid Build Coastguard Worker static ScopedHString Create(std::string_view str); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Returns a view into the memory buffer managed by the instance. The returned 52*6777b538SAndroid Build Coastguard Worker // std::string_view is only valid during the lifetime of this ScopedHString 53*6777b538SAndroid Build Coastguard Worker // instance. 54*6777b538SAndroid Build Coastguard Worker std::wstring_view Get() const; 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker // Returns a copy of the instance as a UTF-8 string. 57*6777b538SAndroid Build Coastguard Worker std::string GetAsUTF8() const; 58*6777b538SAndroid Build Coastguard Worker }; 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker } // namespace win 61*6777b538SAndroid Build Coastguard Worker } // namespace base 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_SCOPED_HSTRING_H_ 64