| OLD | NEW |
| (Empty) |
| 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: | |
| 40 virtual ~Delegate() {} | |
| 41 | |
| 42 // Notify user of the existence of device |device_name|. | |
| 43 virtual void PrivetNotify(int devices_active, 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 ~PrivetNotificationService() override; | |
| 99 | |
| 100 // PrivetDeviceLister::Delegate implementation: | |
| 101 void DeviceChanged(bool added, | |
| 102 const std::string& name, | |
| 103 const DeviceDescription& description) override; | |
| 104 void DeviceRemoved(const std::string& name) override; | |
| 105 | |
| 106 // PrivetNotificationListener::Delegate implementation: | |
| 107 void PrivetNotify(int devices_active, bool added) override; | |
| 108 | |
| 109 void PrivetRemoveNotification() override; | |
| 110 void DeviceCacheFlushed() override; | |
| 111 | |
| 112 static bool IsEnabled(); | |
| 113 static bool IsForced(); | |
| 114 | |
| 115 private: | |
| 116 void Start(); | |
| 117 void OnNotificationsEnabledChanged(); | |
| 118 void StartLister(); | |
| 119 | |
| 120 content::BrowserContext* profile_; | |
| 121 scoped_ptr<PrivetDeviceLister> device_lister_; | |
| 122 scoped_refptr<ServiceDiscoverySharedClient> service_discovery_client_; | |
| 123 scoped_ptr<PrivetNotificationsListener> privet_notifications_listener_; | |
| 124 BooleanPrefMember enable_privet_notification_member_; | |
| 125 | |
| 126 #if defined(ENABLE_MDNS) | |
| 127 scoped_refptr<PrivetTrafficDetector> traffic_detector_; | |
| 128 #endif // ENABLE_MDNS | |
| 129 }; | |
| 130 | |
| 131 class PrivetNotificationDelegate : public NotificationDelegate { | |
| 132 public: | |
| 133 explicit PrivetNotificationDelegate(content::BrowserContext* profile); | |
| 134 | |
| 135 // NotificationDelegate implementation. | |
| 136 std::string id() const override; | |
| 137 void ButtonClick(int button_index) override; | |
| 138 | |
| 139 private: | |
| 140 void OpenTab(const GURL& url); | |
| 141 void DisableNotifications(); | |
| 142 | |
| 143 ~PrivetNotificationDelegate() override; | |
| 144 | |
| 145 content::BrowserContext* profile_; | |
| 146 }; | |
| 147 | |
| 148 } // namespace local_discovery | |
| 149 | |
| 150 #endif // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_NOTIFICATIONS_H_ | |
| OLD | NEW |