1//
2// NotificationCenter.cpp
3//
4// Library: Foundation
5// Package: Notifications
6// Module: NotificationCenter
7//
8// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
9// and Contributors.
10//
11// SPDX-License-Identifier: BSL-1.0
12//
13
14
15#include "Poco/NotificationCenter.h"
16#include "Poco/Notification.h"
17#include "Poco/Observer.h"
18#include "Poco/AutoPtr.h"
19#include "Poco/SingletonHolder.h"
20
21
22namespace Poco {
23
24
25NotificationCenter::NotificationCenter()
26{
27}
28
29
30NotificationCenter::~NotificationCenter()
31{
32}
33
34
35void NotificationCenter::addObserver(const AbstractObserver& observer)
36{
37 Mutex::ScopedLock lock(_mutex);
38 _observers.push_back(observer.clone());
39}
40
41
42void NotificationCenter::removeObserver(const AbstractObserver& observer)
43{
44 Mutex::ScopedLock lock(_mutex);
45 for (ObserverList::iterator it = _observers.begin(); it != _observers.end(); ++it)
46 {
47 if (observer.equals(**it))
48 {
49 (*it)->disable();
50 _observers.erase(it);
51 return;
52 }
53 }
54}
55
56
57bool NotificationCenter::hasObserver(const AbstractObserver& observer) const
58{
59 Mutex::ScopedLock lock(_mutex);
60 for (ObserverList::const_iterator it = _observers.begin(); it != _observers.end(); ++it)
61 if (observer.equals(**it)) return true;
62
63 return false;
64}
65
66
67void NotificationCenter::postNotification(Notification::Ptr pNotification)
68{
69 poco_check_ptr (pNotification);
70
71 ScopedLockWithUnlock<Mutex> lock(_mutex);
72 ObserverList observersToNotify(_observers);
73 lock.unlock();
74 for (ObserverList::iterator it = observersToNotify.begin(); it != observersToNotify.end(); ++it)
75 {
76 (*it)->notify(pNotification);
77 }
78}
79
80
81bool NotificationCenter::hasObservers() const
82{
83 Mutex::ScopedLock lock(_mutex);
84
85 return !_observers.empty();
86}
87
88
89std::size_t NotificationCenter::countObservers() const
90{
91 Mutex::ScopedLock lock(_mutex);
92
93 return _observers.size();
94}
95
96
97namespace
98{
99 static SingletonHolder<NotificationCenter> sh;
100}
101
102
103NotificationCenter& NotificationCenter::defaultCenter()
104{
105 return *sh.get();
106}
107
108
109} // namespace Poco
110