diff options
Diffstat (limited to 'src/corelib/kernel/qfunctions_winrt.h')
-rw-r--r-- | src/corelib/kernel/qfunctions_winrt.h | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/src/corelib/kernel/qfunctions_winrt.h b/src/corelib/kernel/qfunctions_winrt.h index 7efd042456..dc1cbe0ade 100644 --- a/src/corelib/kernel/qfunctions_winrt.h +++ b/src/corelib/kernel/qfunctions_winrt.h @@ -40,6 +40,7 @@ #include <QtCore/QThread> #include <QtCore/QAbstractEventDispatcher> +#include <QtCore/QElapsedTimer> #include <QtCore/qt_windows.h> // Convenience macros for handling HRESULT values @@ -49,10 +50,20 @@ ret; \ } +#define RETURN_IF_FAILED_WITH_ARGS(msg, ret, ...) \ + if (FAILED(hr)) { \ + qErrnoWarning(hr, msg, __VA_ARGS__); \ + ret; \ + } + #define RETURN_HR_IF_FAILED(msg) RETURN_IF_FAILED(msg, return hr) #define RETURN_OK_IF_FAILED(msg) RETURN_IF_FAILED(msg, return S_OK) #define RETURN_FALSE_IF_FAILED(msg) RETURN_IF_FAILED(msg, return false) #define RETURN_VOID_IF_FAILED(msg) RETURN_IF_FAILED(msg, return) +#define RETURN_HR_IF_FAILED_WITH_ARGS(msg, ...) RETURN_IF_FAILED_WITH_ARGS(msg, return hr, __VA_ARGS__) +#define RETURN_OK_IF_FAILED_WITH_ARGS(msg, ...) RETURN_IF_FAILED_WITH_ARGS(msg, return S_OK, __VA_ARGS__) +#define RETURN_FALSE_IF_FAILED_WITH_ARGS(msg, ...) RETURN_IF_FAILED_WITH_ARGS(msg, return false, __VA_ARGS__) +#define RETURN_VOID_IF_FAILED_WITH_ARGS(msg, ...) RETURN_IF_FAILED_WITH_ARGS(msg, return, __VA_ARGS__) #define Q_ASSERT_SUCCEEDED(hr) \ Q_ASSERT_X(SUCCEEDED(hr), Q_FUNC_INFO, qPrintable(qt_error_string(hr))); @@ -65,8 +76,8 @@ QT_BEGIN_NAMESPACE #endif // Environment ------------------------------------------------------ -errno_t qt_winrt_getenv_s(size_t*, char*, size_t, const char*); -errno_t qt_winrt__putenv_s(const char*, const char*); +errno_t qt_fake_getenv_s(size_t*, char*, size_t, const char*); +errno_t qt_fake__putenv_s(const char*, const char*); void qt_winrt_tzset(); void qt_winrt__tzset(); @@ -91,20 +102,20 @@ QT_END_NAMESPACE { \ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1); \ } -#define generate_inline_return_func2(funcname, returntype, param1, param2) \ +#define generate_inline_return_func2(funcname, returntype, prependnamespace, param1, param2) \ inline returntype funcname(param1 p1, param2 p2) \ { \ - return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2); \ + return QT_PREPEND_NAMESPACE(prependnamespace##funcname)(p1, p2); \ } #define generate_inline_return_func3(funcname, returntype, param1, param2, param3) \ inline returntype funcname(param1 p1, param2 p2, param3 p3) \ { \ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3); \ } -#define generate_inline_return_func4(funcname, returntype, param1, param2, param3, param4) \ +#define generate_inline_return_func4(funcname, returntype, prependnamespace, param1, param2, param3, param4) \ inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4) \ { \ - return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4); \ + return QT_PREPEND_NAMESPACE(prependnamespace##funcname)(p1, p2, p3, p4); \ } #define generate_inline_return_func5(funcname, returntype, param1, param2, param3, param4, param5) \ inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ @@ -126,8 +137,8 @@ typedef unsigned (__stdcall *StartAdressExFunc)(void *); typedef void(*StartAdressFunc)(void *); typedef int ( __cdecl *CompareFunc ) (const void *, const void *) ; -generate_inline_return_func4(getenv_s, errno_t, size_t *, char *, size_t, const char *) -generate_inline_return_func2(_putenv_s, errno_t, const char *, const char *) +generate_inline_return_func4(getenv_s, errno_t, qt_fake_, size_t *, char *, size_t, const char *) +generate_inline_return_func2(_putenv_s, errno_t, qt_fake_, const char *, const char *) generate_inline_return_func0(tzset, void) generate_inline_return_func0(_tzset, void) @@ -150,7 +161,7 @@ enum AwaitStyle }; template <typename T> -static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr<T> &asyncOp, AwaitStyle awaitStyle) +static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr<T> &asyncOp, AwaitStyle awaitStyle, uint timeout) { Microsoft::WRL::ComPtr<IAsyncInfo> asyncInfo; HRESULT hr = asyncOp.As(&asyncInfo); @@ -158,22 +169,34 @@ static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr<T> &asyncOp, Awai return hr; AsyncStatus status; + QElapsedTimer t; + if (timeout) + t.start(); switch (awaitStyle) { case ProcessMainThreadEvents: - while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == Started) + while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == Started) { QCoreApplication::processEvents(); + if (timeout && t.hasExpired(timeout)) + return ERROR_TIMEOUT; + } break; case ProcessThreadEvents: if (QAbstractEventDispatcher *dispatcher = QThread::currentThread()->eventDispatcher()) { - while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == Started) + while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == Started) { dispatcher->processEvents(QEventLoop::AllEvents); + if (timeout && t.hasExpired(timeout)) + return ERROR_TIMEOUT; + } break; } // fall through default: case YieldThread: - while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == Started) + while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == Started) { QThread::yieldCurrentThread(); + if (timeout && t.hasExpired(timeout)) + return ERROR_TIMEOUT; + } break; } @@ -189,9 +212,9 @@ static inline HRESULT _await_impl(const Microsoft::WRL::ComPtr<T> &asyncOp, Awai } template <typename T> -static inline HRESULT await(const Microsoft::WRL::ComPtr<T> &asyncOp, AwaitStyle awaitStyle = YieldThread) +static inline HRESULT await(const Microsoft::WRL::ComPtr<T> &asyncOp, AwaitStyle awaitStyle = YieldThread, uint timeout = 0) { - HRESULT hr = _await_impl(asyncOp, awaitStyle); + HRESULT hr = _await_impl(asyncOp, awaitStyle, timeout); if (FAILED(hr)) return hr; @@ -199,9 +222,9 @@ static inline HRESULT await(const Microsoft::WRL::ComPtr<T> &asyncOp, AwaitStyle } template <typename T, typename U> -static inline HRESULT await(const Microsoft::WRL::ComPtr<T> &asyncOp, U *results, AwaitStyle awaitStyle = YieldThread) +static inline HRESULT await(const Microsoft::WRL::ComPtr<T> &asyncOp, U *results, AwaitStyle awaitStyle = YieldThread, uint timeout = 0) { - HRESULT hr = _await_impl(asyncOp, awaitStyle); + HRESULT hr = _await_impl(asyncOp, awaitStyle, timeout); if (FAILED(hr)) return hr; |