[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / utils / EventStream.h
blob6fcb651dc4c9951c533c00a53a205b689f5bc6be
1 /*
2 * Copyright (C) 2016-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 "EventStreamDetail.h"
12 #include "JobManager.h"
13 #include "threads/CriticalSection.h"
15 #include <algorithm>
16 #include <memory>
17 #include <mutex>
18 #include <vector>
21 template<typename Event>
22 class CEventStream
24 public:
26 template<typename A>
27 void Subscribe(A* owner, void (A::*fn)(const Event&))
29 auto subscription = std::make_shared<detail::CSubscription<Event, A>>(owner, fn);
30 std::unique_lock<CCriticalSection> lock(m_criticalSection);
31 m_subscriptions.emplace_back(std::move(subscription));
34 template<typename A>
35 void Unsubscribe(A* obj)
37 std::vector<std::shared_ptr<detail::ISubscription<Event>>> toCancel;
39 std::unique_lock<CCriticalSection> lock(m_criticalSection);
40 auto it = m_subscriptions.begin();
41 while (it != m_subscriptions.end())
43 if ((*it)->IsOwnedBy(obj))
45 toCancel.push_back(*it);
46 it = m_subscriptions.erase(it);
48 else
50 ++it;
54 for (auto& subscription : toCancel)
55 subscription->Cancel();
58 protected:
59 std::vector<std::shared_ptr<detail::ISubscription<Event>>> m_subscriptions;
60 CCriticalSection m_criticalSection;
64 template<typename Event>
65 class CEventSource : public CEventStream<Event>
67 public:
68 explicit CEventSource() : m_queue(false, 1, CJob::PRIORITY_HIGH) {}
70 template<typename A>
71 void Publish(A event)
73 std::unique_lock<CCriticalSection> lock(this->m_criticalSection);
74 auto& subscriptions = this->m_subscriptions;
75 auto task = [subscriptions, event](){
76 for (auto& s: subscriptions)
77 s->HandleEvent(event);
79 lock.unlock();
80 m_queue.Submit(std::move(task));
83 private:
84 CJobQueue m_queue;
87 template<typename Event>
88 class CBlockingEventSource : public CEventStream<Event>
90 public:
91 template<typename A>
92 void HandleEvent(A event)
94 std::unique_lock<CCriticalSection> lock(this->m_criticalSection);
95 for (const auto& subscription : this->m_subscriptions)
97 subscription->HandleEvent(event);