Add GCMChannelStatusSyncer to schedule requests and enable/disable GCM
[chromium-blink-merge.git] / chrome / browser / local_discovery / privet_notifications.h
blob527db0acf876ad0aa183f06c9169b8534399701d
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.
5 #ifndef CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
6 #define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_
8 #include <map>
9 #include <string>
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"
17 class NotificationUIManager;
19 namespace content {
20 class BrowserContext;
21 } // namespace content
23 namespace local_discovery {
25 class ServiceDiscoverySharedClient;
26 class PrivetDeviceLister;
27 class PrivetHTTPAsynchronousFactory;
28 class PrivetHTTPResolution;
29 struct DeviceDescription;
31 #if defined(ENABLE_MDNS)
32 class PrivetTrafficDetector;
33 #endif // ENABLE_MDNS
35 // Contains logic related to notifications not tied actually displaying them.
36 class PrivetNotificationsListener {
37 public:
38 class Delegate {
39 public:
40 virtual ~Delegate() {}
42 // Notify user of the existence of device |device_name|.
43 virtual void PrivetNotify(bool multiple, bool added) = 0;
45 // Remove the noitification for |device_name| if it still exists.
46 virtual void PrivetRemoveNotification() = 0;
49 PrivetNotificationsListener(
50 scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory,
51 Delegate* delegate);
52 virtual ~PrivetNotificationsListener();
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();
63 private:
64 struct DeviceContext {
65 DeviceContext();
66 ~DeviceContext();
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;
75 typedef std::map<std::string, linked_ptr<DeviceContext> > DeviceContextMap;
77 void CreateInfoOperation(scoped_ptr<PrivetHTTPClient> http_client);
78 void OnPrivetInfoDone(DeviceContext* device,
79 const base::DictionaryValue* json_value);
82 void NotifyDeviceRemoved();
84 Delegate* delegate_;
85 scoped_ptr<PrivetDeviceLister> device_lister_;
86 scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory_;
87 DeviceContextMap devices_seen_;
88 int devices_active_;
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();
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;
105 // PrivetNotificationListener::Delegate implementation:
106 virtual void PrivetNotify(bool has_multiple, bool added) OVERRIDE;
108 virtual void PrivetRemoveNotification() OVERRIDE;
109 virtual void DeviceCacheFlushed() OVERRIDE;
111 static bool IsEnabled();
112 static bool IsForced();
114 private:
115 void Start();
116 void OnNotificationsEnabledChanged();
117 void StartLister();
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_;
125 #if defined(ENABLE_MDNS)
126 scoped_refptr<PrivetTrafficDetector> traffic_detector_;
127 #endif // ENABLE_MDNS
130 class PrivetNotificationDelegate : public NotificationDelegate {
131 public:
132 explicit PrivetNotificationDelegate(content::BrowserContext* profile);
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;
143 private:
144 void OpenTab(const GURL& url);
145 void DisableNotifications();
147 virtual ~PrivetNotificationDelegate();
149 content::BrowserContext* profile_;
152 } // namespace local_discovery
154 #endif // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_