#include "base/win/scoped_hstring.h"
#include <winstring.h>
#include <ostream>
#include <string>
#include "base/check.h"
#include "base/notreached.h"
#include "base/numerics/safe_conversions.h"
#include "base/process/memory.h"
#include "base/strings/string_piece.h"
#include "base/strings/utf_string_conversions.h"
namespace base {
namespace internal {
void ScopedHStringTraits::Free(HSTRING hstr) {
::WindowsDeleteString(hstr);
}
}
namespace win {
ScopedHString::ScopedHString(HSTRING hstr) : ScopedGeneric(hstr) {}
ScopedHString ScopedHString::Create(WStringPiece str) {
HSTRING hstr;
HRESULT hr = ::WindowsCreateString(str.data(),
checked_cast<UINT32>(str.length()), &hstr);
if (SUCCEEDED(hr))
return ScopedHString(hstr);
if (hr == E_OUTOFMEMORY) {
base::TerminateBecauseOutOfMemory((str.length() + 1) * sizeof(wchar_t));
}
NOTREACHED() << "Failed to create HSTRING: " << std::hex << hr;
return ScopedHString(nullptr);
}
ScopedHString ScopedHString::Create(StringPiece str) {
return Create(UTF8ToWide(str));
}
WStringPiece ScopedHString::Get() const {
UINT32 length = 0;
const wchar_t* buffer = ::WindowsGetStringRawBuffer(get(), &length);
return WStringPiece(buffer, length);
}
std::string ScopedHString::GetAsUTF8() const {
return WideToUTF8(Get());
}
}
}