- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / notification_service_impl.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CONTENT_PUBLIC_BROWSER_NOTIFICATION_SERVICE_IMPL_H_
6 #define CONTENT_PUBLIC_BROWSER_NOTIFICATION_SERVICE_IMPL_H_
7
8 #include <map>
9
10 #include "base/observer_list.h"
11 #include "content/common/content_export.h"
12 #include "content/public/browser/notification_service.h"
13
14 namespace content {
15
16 class NotificationObserver;
17 class NotificationRegistrar;
18
19 class CONTENT_EXPORT NotificationServiceImpl : public NotificationService {
20  public:
21   static NotificationServiceImpl* current();
22
23   // Normally instantiated when the thread is created.  Not all threads have
24   // a NotificationService.  Only one instance should be created per thread.
25   NotificationServiceImpl();
26   virtual ~NotificationServiceImpl();
27
28   // NotificationService:
29   virtual void Notify(int type,
30                       const NotificationSource& source,
31                       const NotificationDetails& details) OVERRIDE;
32
33  private:
34   friend class NotificationRegistrar;
35
36   typedef ObserverList<NotificationObserver> NotificationObserverList;
37   typedef std::map<uintptr_t, NotificationObserverList*> NotificationSourceMap;
38   typedef std::map<int, NotificationSourceMap> NotificationObserverMap;
39   typedef std::map<int, int> NotificationObserverCount;
40
41   // Convenience function to determine whether a source has a
42   // NotificationObserverList in the given map;
43   static bool HasKey(const NotificationSourceMap& map,
44                      const NotificationSource& source);
45
46   // NOTE: Rather than using this directly, you should use a
47   // NotificationRegistrar.
48   //
49   // Registers a NotificationObserver to be called whenever a matching
50   // notification is posted.  Observer is a pointer to an object subclassing
51   // NotificationObserver to be notified when an event matching the other two
52   // parameters is posted to this service.  Type is the type of events to be
53   // notified about (or NOTIFICATION_ALL to receive events of all
54   // types).
55   // Source is a NotificationSource object (created using
56   // "Source<classname>(pointer)"), if this observer only wants to
57   // receive events from that object, or NotificationService::AllSources()
58   // to receive events from all sources.
59   //
60   // A given observer can be registered only once for each combination of
61   // type and source.  If the same object is registered more than once,
62   // it must be removed for each of those combinations of type and source later.
63   //
64   // The caller retains ownership of the object pointed to by observer.
65   void AddObserver(NotificationObserver* observer,
66                    int type,
67                    const NotificationSource& source);
68
69   // NOTE: Rather than using this directly, you should use a
70   // NotificationRegistrar.
71   //
72   // Removes the object pointed to by observer from receiving notifications
73   // that match type and source.  If no object matching the parameters is
74   // currently registered, this method is a no-op.
75   void RemoveObserver(NotificationObserver* observer,
76                       int type,
77                       const NotificationSource& source);
78
79   // Keeps track of the observers for each type of notification.
80   // Until we get a prohibitively large number of notification types,
81   // a simple array is probably the fastest way to dispatch.
82   NotificationObserverMap observers_;
83
84 #ifndef NDEBUG
85   // Used to check to see that AddObserver and RemoveObserver calls are
86   // balanced.
87   NotificationObserverCount observer_counts_;
88 #endif
89
90   DISALLOW_COPY_AND_ASSIGN(NotificationServiceImpl);
91 };
92
93 }  // namespace content
94
95 #endif  // CONTENT_PUBLIC_BROWSER_NOTIFICATION_SERVICE_IMPL_H_