summaryrefslogtreecommitdiffstats
path: root/xbmc/utils/Observer.h
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2020-10-19 00:52:24 +0200
committermanuel <manuel@mausz.at>2020-10-19 00:52:24 +0200
commitbe933ef2241d79558f91796cc5b3a161f72ebf9c (patch)
treefe3ab2f130e20c99001f2d7a81d610c78c96a3f4 /xbmc/utils/Observer.h
parent5f8335c1e49ce108ef3481863833c98efa00411b (diff)
downloadkodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.tar.gz
kodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.tar.bz2
kodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.zip
sync with upstream
Diffstat (limited to 'xbmc/utils/Observer.h')
-rw-r--r--xbmc/utils/Observer.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/xbmc/utils/Observer.h b/xbmc/utils/Observer.h
new file mode 100644
index 0000000..feb201a
--- /dev/null
+++ b/xbmc/utils/Observer.h
@@ -0,0 +1,91 @@
1/*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#pragma once
10
11#include "threads/CriticalSection.h"
12
13#include <atomic>
14#include <vector>
15
16class Observable;
17class ObservableMessageJob;
18
19typedef enum
20{
21 ObservableMessageNone,
22 ObservableMessagePeripheralsChanged,
23 ObservableMessageSettingsChanged,
24 ObservableMessageButtonMapsChanged,
25} ObservableMessage;
26
27class Observer
28{
29public:
30 Observer() = default;
31 virtual ~Observer() = default;
32 /*!
33 * @brief Process a message from an observable.
34 * @param obs The observable that sends the message.
35 * @param msg The message.
36 */
37 virtual void Notify(const Observable &obs, const ObservableMessage msg) = 0;
38};
39
40class Observable
41{
42 friend class ObservableMessageJob;
43
44public:
45 Observable() = default;
46 virtual ~Observable() = default;
47 virtual Observable &operator=(const Observable &observable);
48
49 /*!
50 * @brief Register an observer.
51 * @param obs The observer to register.
52 */
53 virtual void RegisterObserver(Observer *obs);
54
55 /*!
56 * @brief Unregister an observer.
57 * @param obs The observer to unregister.
58 */
59 virtual void UnregisterObserver(Observer *obs);
60
61 /*!
62 * @brief Send a message to all observers when m_bObservableChanged is true.
63 * @param message The message to send.
64 */
65 virtual void NotifyObservers(const ObservableMessage message = ObservableMessageNone);
66
67 /*!
68 * @brief Mark an observable changed.
69 * @param bSetTo True to mark the observable changed, false to mark it as unchanged.
70 */
71 virtual void SetChanged(bool bSetTo = true);
72
73 /*!
74 * @brief Check whether this observable is being observed by an observer.
75 * @param obs The observer to check.
76 * @return True if this observable is being observed by the given observer, false otherwise.
77 */
78 virtual bool IsObserving(const Observer &obs) const;
79
80protected:
81 /*!
82 * @brief Send a message to all observer when m_bObservableChanged is true.
83 * @param obs The observer that sends the message.
84 * @param message The message to send.
85 */
86 void SendMessage(const ObservableMessage message);
87
88 std::atomic<bool> m_bObservableChanged{false}; /*!< true when the observable is marked as changed, false otherwise */
89 std::vector<Observer *> m_observers; /*!< all observers */
90 mutable CCriticalSection m_obsCritSection; /*!< mutex */
91};