[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / platform / win10 / AsyncHelpers.h
blobaaca173aaeee1d3f7cf3924eb3055f0ae5dc4969
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #pragma once
11 #include <ppl.h>
12 #include <ppltasks.h>
14 namespace winrt
16 using namespace Windows::Foundation;
19 inline void Wait(const winrt::IAsyncAction& asyncOp)
21 if (asyncOp.Status() == winrt::AsyncStatus::Completed)
22 return;
24 if (!winrt::impl::is_sta())
25 return asyncOp.get();
27 auto __sync = std::make_shared<Concurrency::event>();
28 asyncOp.Completed([&](auto&&, auto&&) {
29 __sync->set();
30 });
31 __sync->wait();
34 template <typename TResult, typename TProgress> inline
35 TResult Wait(const winrt::IAsyncOperationWithProgress<TResult, TProgress>& asyncOp)
37 if (asyncOp.Status() == winrt::AsyncStatus::Completed)
38 return asyncOp.GetResults();
40 if (!winrt::impl::is_sta())
41 return asyncOp.get();
43 auto __sync = std::make_shared<Concurrency::event>();
44 asyncOp.Completed([&](auto&&, auto&&) {
45 __sync->set();
46 });
47 __sync->wait();
49 return asyncOp.GetResults();
52 template <typename TResult> inline
53 TResult Wait(const winrt::IAsyncOperation<TResult>& asyncOp)
55 if (asyncOp.Status() == winrt::AsyncStatus::Completed)
56 return asyncOp.GetResults();
58 if (!winrt::impl::is_sta())
59 return asyncOp.get();
61 auto __sync = std::make_shared<Concurrency::event>();
62 asyncOp.Completed([&](auto&&, auto&&)
64 __sync->set();
65 });
66 __sync->wait();
68 return asyncOp.GetResults();
71 template <typename TResult> inline
72 TResult Wait(const Concurrency::task<TResult>& asyncOp)
74 if (asyncOp.is_done())
75 return asyncOp.get();
77 if (!winrt::impl::is_sta()) // blocking suspend is allowed
78 return asyncOp.get();
80 auto _sync = std::make_shared<Concurrency::event>();
81 asyncOp.then([&](TResult result)
83 _sync->set();
84 });
85 _sync->wait();
87 return asyncOp.get();