blob: 221d9cc8ffddff4472d19acf0bd66947112c9b34 [file] [log] [blame]
/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#ifndef _WRL_COREWRAPPERS_H_
#define _WRL_COREWRAPPERS_H_
#include <windows.h>
#include <intsafe.h>
#include <winstring.h>
#include <roapi.h>
/* #include <wrl/def.h> */
#include <wrl/internal.h>
namespace Microsoft {
namespace WRL {
namespace Details {
struct Dummy {};
}
namespace Wrappers {
class HStringReference {
private:
void Init(const wchar_t* str, unsigned int len) {
HRESULT hres = ::WindowsCreateStringReference(str, len, &header_, &hstr_);
if (FAILED(hres))
::Microsoft::WRL::Details::RaiseException(hres);
}
HStringReference() : hstr_(nullptr) {}
public:
HStringReference(const wchar_t* str, unsigned int len) throw() : hstr_(nullptr) {
Init(str, len);
}
template<unsigned int sizeDest>
explicit HStringReference(wchar_t const (&str)[sizeDest]) throw() : hstr_(nullptr) {
Init(str, sizeDest - 1);
}
template <size_t sizeDest>
explicit HStringReference(wchar_t (&strRef)[sizeDest]) throw() {
const wchar_t *str = static_cast<const wchar_t*>(strRef);
Init(str, ::wcslen(str));
}
template<typename T>
explicit HStringReference(const T &strRef) throw() : hstr_(nullptr) {
const wchar_t* str = static_cast<const wchar_t*>(strRef);
size_t len = ::wcslen(str);
if(static_cast<size_t>(static_cast<unsigned int>(len)) != len)
::Microsoft::WRL::Details::RaiseException(INTSAFE_E_ARITHMETIC_OVERFLOW);
Init(str, len);
}
HStringReference(const HStringReference &other) throw() : hstr_(nullptr) {
unsigned int len = 0;
const wchar_t* value = other.GetRawBuffer(&len);
Init(value, len);
}
~HStringReference() throw() {
hstr_ = nullptr;
}
HStringReference& operator=(const HStringReference &other) throw() {
unsigned int len = 0;
const wchar_t* value = other.GetRawBuffer(&len);
Init(value, len);
return *this;
}
HSTRING Get() const throw() {
return hstr_;
}
const wchar_t *GetRawBuffer(unsigned int *len) const {
return ::WindowsGetStringRawBuffer(hstr_, len);
}
HRESULT CopyTo(HSTRING *str) const throw() {
return ::WindowsDuplicateString(hstr_, str);
}
friend class HString;
protected:
HSTRING_HEADER header_;
HSTRING hstr_;
};
class RoInitializeWrapper {
public:
RoInitializeWrapper(RO_INIT_TYPE flags) {
hres = ::Windows::Foundation::Initialize(flags);
}
~RoInitializeWrapper() {
if(SUCCEEDED(hres))
::Windows::Foundation::Uninitialize();
}
operator HRESULT() {
return hres;
}
private:
HRESULT hres;
};
}
}
}
#endif