LearnWithTouch/App/LearnWithTouch_ios/Libraries/libil2cpp/include/os/WinRT/SynchronousOperation.h
2019-07-01 14:33:21 +02:00

58 lines
1.5 KiB
C++

#pragma once
#include "os/Win32/WindowsHeaders.h"
#include <windows.foundation.collections.h>
#include <wrl.h>
namespace il2cpp
{
namespace winrt
{
template<typename T>
class SynchronousOperation : Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::WinRtClassicComMix>, ABI::Windows::Foundation::IAsyncOperationCompletedHandler<T> >
{
private:
HANDLE m_Event;
HRESULT m_HR;
T m_Result;
public:
inline SynchronousOperation(ABI::Windows::Foundation::IAsyncOperation<T>* op)
{
m_Event = CreateEventExW(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
Assert(m_Event);
auto hr = op->put_Completed(this);
Assert(SUCCEEDED(hr));
}
inline ~SynchronousOperation()
{
CloseHandle(m_Event);
}
HRESULT GetResults(T* result)
{
auto waitResult = WaitForSingleObjectEx(m_Event, INFINITE, FALSE);
if (waitResult != WAIT_OBJECT_0)
return E_FAIL;
if (FAILED(m_HR))
return m_HR;
*result = m_Result;
return S_OK;
}
private:
virtual HRESULT STDMETHODCALLTYPE Invoke(ABI::Windows::Foundation::IAsyncOperation<T>* asyncInfo, ABI::Windows::Foundation::AsyncStatus status) override
{
m_HR = asyncInfo->GetResults(&m_Result);
SetEvent(m_Event);
return S_OK;
}
};
}
}