• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
6 #define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
7 
8 #include <map>
9 #include <string>
10 
11 #include "base/prefs/pref_member.h"
12 #include "chrome/browser/local_discovery/privet_device_lister.h"
13 #include "chrome/browser/local_discovery/privet_http.h"
14 #include "chrome/browser/notifications/notification_delegate.h"
15 #include "components/keyed_service/core/keyed_service.h"
16 
17 class NotificationUIManager;
18 
19 namespace content {
20 class BrowserContext;
21 }  // namespace content
22 
23 namespace local_discovery {
24 
25 class ServiceDiscoverySharedClient;
26 class PrivetDeviceLister;
27 class PrivetHTTPAsynchronousFactory;
28 class PrivetHTTPResolution;
29 struct DeviceDescription;
30 
31 #if defined(ENABLE_MDNS)
32 class PrivetTrafficDetector;
33 #endif  // ENABLE_MDNS
34 
35 // Contains logic related to notifications not tied actually displaying them.
36 class PrivetNotificationsListener  {
37  public:
38   class Delegate {
39    public:
~Delegate()40     virtual ~Delegate() {}
41 
42     // Notify user of the existence of device |device_name|.
43     virtual void PrivetNotify(bool multiple, bool added) = 0;
44 
45     // Remove the noitification for |device_name| if it still exists.
46     virtual void PrivetRemoveNotification() = 0;
47   };
48 
49   PrivetNotificationsListener(
50       scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory,
51       Delegate* delegate);
52   virtual ~PrivetNotificationsListener();
53 
54   // These two methods are akin to those of PrivetDeviceLister::Delegate. The
55   // user of PrivetNotificationListener should create a PrivetDeviceLister and
56   // forward device notifications to the PrivetNotificationLister.
57   void DeviceChanged(bool added,
58                      const std::string& name,
59                      const DeviceDescription& description);
60   void DeviceRemoved(const std::string& name);
61   virtual void DeviceCacheFlushed();
62 
63  private:
64   struct DeviceContext {
65     DeviceContext();
66     ~DeviceContext();
67 
68     bool notification_may_be_active;
69     bool registered;
70     scoped_ptr<PrivetJSONOperation> info_operation;
71     scoped_ptr<PrivetHTTPResolution> privet_http_resolution;
72     scoped_ptr<PrivetHTTPClient> privet_http;
73   };
74 
75   typedef std::map<std::string, linked_ptr<DeviceContext> > DeviceContextMap;
76 
77   void CreateInfoOperation(scoped_ptr<PrivetHTTPClient> http_client);
78   void OnPrivetInfoDone(DeviceContext* device,
79                         const base::DictionaryValue* json_value);
80 
81 
82   void NotifyDeviceRemoved();
83 
84   Delegate* delegate_;
85   scoped_ptr<PrivetDeviceLister> device_lister_;
86   scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory_;
87   DeviceContextMap devices_seen_;
88   int devices_active_;
89 };
90 
91 class PrivetNotificationService
92     : public KeyedService,
93       public PrivetDeviceLister::Delegate,
94       public PrivetNotificationsListener::Delegate,
95       public base::SupportsWeakPtr<PrivetNotificationService> {
96  public:
97   explicit PrivetNotificationService(content::BrowserContext* profile);
98   virtual ~PrivetNotificationService();
99 
100   // PrivetDeviceLister::Delegate implementation:
101   virtual void DeviceChanged(bool added, const std::string& name,
102                              const DeviceDescription& description) OVERRIDE;
103   virtual void DeviceRemoved(const std::string& name) OVERRIDE;
104 
105   // PrivetNotificationListener::Delegate implementation:
106   virtual void PrivetNotify(bool has_multiple, bool added) OVERRIDE;
107 
108   virtual void PrivetRemoveNotification() OVERRIDE;
109   virtual void DeviceCacheFlushed() OVERRIDE;
110 
111   static bool IsEnabled();
112   static bool IsForced();
113 
114  private:
115   void Start();
116   void OnNotificationsEnabledChanged();
117   void StartLister();
118 
119   content::BrowserContext* profile_;
120   scoped_ptr<PrivetDeviceLister> device_lister_;
121   scoped_refptr<ServiceDiscoverySharedClient> service_discovery_client_;
122   scoped_ptr<PrivetNotificationsListener> privet_notifications_listener_;
123   BooleanPrefMember enable_privet_notification_member_;
124 
125 #if defined(ENABLE_MDNS)
126   scoped_refptr<PrivetTrafficDetector> traffic_detector_;
127 #endif  // ENABLE_MDNS
128 };
129 
130 class PrivetNotificationDelegate : public NotificationDelegate {
131  public:
132   explicit PrivetNotificationDelegate(content::BrowserContext* profile);
133 
134   // NotificationDelegate implementation.
135   virtual std::string id() const OVERRIDE;
136   virtual content::WebContents* GetWebContents() const OVERRIDE;
137   virtual void Display() OVERRIDE;
138   virtual void Error() OVERRIDE;
139   virtual void Close(bool by_user) OVERRIDE;
140   virtual void Click() OVERRIDE;
141   virtual void ButtonClick(int button_index) OVERRIDE;
142 
143  private:
144   void OpenTab(const GURL& url);
145   void DisableNotifications();
146 
147   virtual ~PrivetNotificationDelegate();
148 
149   content::BrowserContext* profile_;
150 };
151 
152 }  // namespace local_discovery
153 
154 #endif  // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
155