xref: /aosp_15_r20/external/webrtc/api/notifier.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2011 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef API_NOTIFIER_H_
12*d9f75844SAndroid Build Coastguard Worker #define API_NOTIFIER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <list>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "api/media_stream_interface.h"
17*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/no_unique_address.h"
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker // Implements a template version of a notifier.
24*d9f75844SAndroid Build Coastguard Worker // TODO(deadbeef): This is an implementation detail; move out of api/.
25*d9f75844SAndroid Build Coastguard Worker template <class T>
26*d9f75844SAndroid Build Coastguard Worker class Notifier : public T {
27*d9f75844SAndroid Build Coastguard Worker  public:
Notifier()28*d9f75844SAndroid Build Coastguard Worker   Notifier() { sequence_checker_.Detach(); }
29*d9f75844SAndroid Build Coastguard Worker 
RegisterObserver(ObserverInterface * observer)30*d9f75844SAndroid Build Coastguard Worker   virtual void RegisterObserver(ObserverInterface* observer) {
31*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(&sequence_checker_);
32*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK(observer != nullptr);
33*d9f75844SAndroid Build Coastguard Worker     observers_.push_back(observer);
34*d9f75844SAndroid Build Coastguard Worker   }
35*d9f75844SAndroid Build Coastguard Worker 
UnregisterObserver(ObserverInterface * observer)36*d9f75844SAndroid Build Coastguard Worker   virtual void UnregisterObserver(ObserverInterface* observer) {
37*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(&sequence_checker_);
38*d9f75844SAndroid Build Coastguard Worker     for (std::list<ObserverInterface*>::iterator it = observers_.begin();
39*d9f75844SAndroid Build Coastguard Worker          it != observers_.end(); it++) {
40*d9f75844SAndroid Build Coastguard Worker       if (*it == observer) {
41*d9f75844SAndroid Build Coastguard Worker         observers_.erase(it);
42*d9f75844SAndroid Build Coastguard Worker         break;
43*d9f75844SAndroid Build Coastguard Worker       }
44*d9f75844SAndroid Build Coastguard Worker     }
45*d9f75844SAndroid Build Coastguard Worker   }
46*d9f75844SAndroid Build Coastguard Worker 
FireOnChanged()47*d9f75844SAndroid Build Coastguard Worker   void FireOnChanged() {
48*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(&sequence_checker_);
49*d9f75844SAndroid Build Coastguard Worker     // Copy the list of observers to avoid a crash if the observer object
50*d9f75844SAndroid Build Coastguard Worker     // unregisters as a result of the OnChanged() call. If the same list is used
51*d9f75844SAndroid Build Coastguard Worker     // UnregisterObserver will affect the list make the iterator invalid.
52*d9f75844SAndroid Build Coastguard Worker     std::list<ObserverInterface*> observers = observers_;
53*d9f75844SAndroid Build Coastguard Worker     for (std::list<ObserverInterface*>::iterator it = observers.begin();
54*d9f75844SAndroid Build Coastguard Worker          it != observers.end(); ++it) {
55*d9f75844SAndroid Build Coastguard Worker       (*it)->OnChanged();
56*d9f75844SAndroid Build Coastguard Worker     }
57*d9f75844SAndroid Build Coastguard Worker   }
58*d9f75844SAndroid Build Coastguard Worker 
59*d9f75844SAndroid Build Coastguard Worker  protected:
60*d9f75844SAndroid Build Coastguard Worker   std::list<ObserverInterface*> observers_ RTC_GUARDED_BY(sequence_checker_);
61*d9f75844SAndroid Build Coastguard Worker 
62*d9f75844SAndroid Build Coastguard Worker  private:
63*d9f75844SAndroid Build Coastguard Worker   RTC_NO_UNIQUE_ADDRESS SequenceChecker sequence_checker_;
64*d9f75844SAndroid Build Coastguard Worker };
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
67*d9f75844SAndroid Build Coastguard Worker 
68*d9f75844SAndroid Build Coastguard Worker #endif  // API_NOTIFIER_H_
69