topical media & game development 
  
 
 
 
 
  
    
    
  
 lib-of-vs-libs-Poco-include-Poco-NotificationCenter.h / h
  //
  // NotificationCenter.h
  //
  // 
  //
  // Library: Foundation
  // Package: Notifications
  // Module:  NotificationCenter
  //
  // Definition of the NotificationCenter class.
  //
  // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
  // and Contributors.
  //
  // Permission is hereby granted, free of charge, to any person or organization
  // obtaining a copy of the software and accompanying documentation covered by
  // this license (the "Software") to use, reproduce, display, distribute,
  // execute, and transmit the Software, and to prepare derivative works of the
  // Software, and to permit third-parties to whom the Software is furnished to
  // do so, all subject to the following:
  // 
  // The copyright notices in the Software and this entire statement, including
  // the above license grant, this restriction and the following disclaimer,
  // must be included in all copies of the Software, in whole or in part, and
  // all derivative works of the Software, unless such copies or derivative
  // works are solely in the form of machine-executable object code generated by
  // a source language processor.
  // 
  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
  // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
  // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
  // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  // DEALINGS IN THE SOFTWARE.
  //
  
  ifndef Foundation_NotificationCenter_INCLUDED
  define Foundation_NotificationCenter_INCLUDED
  
  include "Poco/Foundation.h"
  include "Poco/Mutex.h"
  include <list>
  
  namespace Poco {
  
  class Notification;
  class AbstractObserver;
  
  class Foundation_API NotificationCenter
   A NotificationCenter is essentially a notification dispatcher. 
 It notifies all observers of notifications meeting specific criteria.
 This information is encapsulated in Notification objects.
 Client objects register themselves with the notification center as observers of 
 specific notifications posted by other objects. When an event occurs, an object 
 posts an appropriate notification to the notification center. The notification  
 center invokes the registered method on each matching observer, passing the notification 
 as argument.
 The order in which observers receive notifications is undefined. 
 It is possible for the posting object and the observing object to be the same.
 The NotificationCenter delivers notifications to observers synchronously. 
 In other words the postNotification() method does not return until all observers have 
 received and processed the notification. 
 If an observer throws an exception while handling a notification, the NotificationCenter
 stops dispatching the notification and postNotification() rethrows the exception.
 In a multithreaded scenario, notifications are always delivered in the thread in which the 
 notification was posted, which may not be the same thread in which an observer registered itself.
 The NotificationCenter class is basically a C++ implementation of the NSNotificationCenter class
 found in Apple's Cocoa (or OpenStep).
 While handling a notification, an observer can unregister itself from the notification center,
 or it can register or unregister other observers. Observers added during a dispatch cycle
 will not receive the current notification.
 The method receiving the notification must be implemented as
     void handleNotification(MyNotification* pNf);
 The handler method gets co-ownership of the Notification object
 and must release it when done. This is best done with an AutoPtr:
     void MyClass::handleNotification(MyNotification* pNf)
     {
         AutoPtr<MyNotification> nf(pNf);
         ...
     }
 Alternatively, the NObserver class template can be used to register a callback
 method. In this case, the callback method receives the Notification in an
 AutoPtr and thus does not have to deal with object ownership issues:
     void MyClass::handleNotification(const AutoPtr<MyNotification>& pNf)
     {
         ...
     }
{
public:
        NotificationCenter();
 Creates the NotificationCenter.
          ~NotificationCenter();
   Destroys the NotificationCenter.
          void addObserver(const AbstractObserver& observer);
   Registers an observer with the NotificationCenter.
 Usage:
     Observer<MyClass, MyNotification> obs(*this, &MyClass::handleNotification);
     notificationCenter.addObserver(obs);
 Alternatively, the NObserver template class can be used instead of Observer.
          void removeObserver(const AbstractObserver& observer);
   Unregisters an observer with the NotificationCenter.
          void postNotification(Notification* pNotification);
   Posts a notification to the NotificationCenter.
 The NotificationCenter then delivers the notification
 to all interested observers.
 If an observer throws an exception, dispatching terminates
 and the exception is rethrown to the caller.
 
Ownership of the notification object is claimed and the
 notification is released before returning. Therefore,
 a call like
    notificationCenter.postNotification(new MyNotification);
 does not result in a memory leak.
          bool hasObservers() const;
   Returns true iff there is at least one registered observer.
 Can be used to improve performance if an expensive notification
 shall only be created and posted if there are any observers.
                
        static NotificationCenter& defaultCenter();
 Returns a reference to the default
 NotificationCenter.
  private:
          typedef std::list<AbstractObserver*> ObserverList;
  
          ObserverList  _observers;
          mutable Mutex _mutex;
  };
  
  } // namespace Poco
  
  endif // Foundation_NotificationCenter_INCLUDED
  
  
  
(C) Æliens 
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher. 
In case of other copyright issues, contact the author.