xbmc
Observer.h
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 
16 class Observable;
17 class ObservableMessageJob;
18 
19 typedef enum
20 {
21  ObservableMessageNone,
22  ObservableMessagePeripheralsChanged,
23  ObservableMessageSettingsChanged,
24  ObservableMessageButtonMapsChanged,
25  // Used for example when the subtitle alignment position change
26  ObservableMessagePositionChanged,
27  ObservableMessageGamePortsChanged,
28  ObservableMessageGameAgentsChanged,
29 } ObservableMessage;
30 
31 class Observer
32 {
33 public:
34  Observer() = default;
35  virtual ~Observer() = default;
41  virtual void Notify(const Observable &obs, const ObservableMessage msg) = 0;
42 };
43 
45 {
46  friend class ObservableMessageJob;
47 
48 public:
49  Observable() = default;
50  virtual ~Observable() = default;
51  virtual Observable &operator=(const Observable &observable);
52 
57  virtual void RegisterObserver(Observer *obs);
58 
63  virtual void UnregisterObserver(Observer *obs);
64 
69  virtual void NotifyObservers(const ObservableMessage message = ObservableMessageNone);
70 
75  virtual void SetChanged(bool bSetTo = true);
76 
82  virtual bool IsObserving(const Observer &obs) const;
83 
84 protected:
90  void SendMessage(const ObservableMessage message);
91 
92  std::atomic<bool> m_bObservableChanged{false};
93  std::vector<Observer *> m_observers;
94  mutable CCriticalSection m_obsCritSection;
95 };
CCriticalSection m_obsCritSection
Definition: Observer.h:94
std::vector< Observer * > m_observers
Definition: Observer.h:93
virtual void Notify(const Observable &obs, const ObservableMessage msg)=0
Process a message from an observable.
Definition: Observer.h:31
Definition: Observer.h:44