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.
11 #include "threads/CriticalSection.h"
17 class ObservableMessageJob
;
21 ObservableMessageNone
,
22 ObservableMessagePeripheralsChanged
,
23 ObservableMessageSettingsChanged
,
24 ObservableMessageButtonMapsChanged
,
25 // Used for example when the subtitle alignment position change
26 ObservableMessagePositionChanged
,
27 ObservableMessageGamePortsChanged
,
28 ObservableMessageGameAgentsChanged
,
35 virtual ~Observer() = default;
37 * @brief Process a message from an observable.
38 * @param obs The observable that sends the message.
39 * @param msg The message.
41 virtual void Notify(const Observable
&obs
, const ObservableMessage msg
) = 0;
46 friend class ObservableMessageJob
;
49 Observable() = default;
50 virtual ~Observable() = default;
51 virtual Observable
&operator=(const Observable
&observable
);
54 * @brief Register an observer.
55 * @param obs The observer to register.
57 virtual void RegisterObserver(Observer
*obs
);
60 * @brief Unregister an observer.
61 * @param obs The observer to unregister.
63 virtual void UnregisterObserver(Observer
*obs
);
66 * @brief Send a message to all observers when m_bObservableChanged is true.
67 * @param message The message to send.
69 virtual void NotifyObservers(const ObservableMessage message
= ObservableMessageNone
);
72 * @brief Mark an observable changed.
73 * @param bSetTo True to mark the observable changed, false to mark it as unchanged.
75 virtual void SetChanged(bool bSetTo
= true);
78 * @brief Check whether this observable is being observed by an observer.
79 * @param obs The observer to check.
80 * @return True if this observable is being observed by the given observer, false otherwise.
82 virtual bool IsObserving(const Observer
&obs
) const;
86 * @brief Send a message to all observer when m_bObservableChanged is true.
87 * @param obs The observer that sends the message.
88 * @param message The message to send.
90 void SendMessage(const ObservableMessage message
);
92 std::atomic
<bool> m_bObservableChanged
{false}; /*!< true when the observable is marked as changed, false otherwise */
93 std::vector
<Observer
*> m_observers
; /*!< all observers */
94 mutable CCriticalSection m_obsCritSection
; /*!< mutex */