OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/net/wake_on_wifi_manager.h" | 5 #include "chrome/browser/chromeos/net/wake_on_wifi_manager.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 WakeOnWifiManager::WakeOnWifiFeature feature) { | 44 WakeOnWifiManager::WakeOnWifiFeature feature) { |
45 switch (feature) { | 45 switch (feature) { |
46 case WakeOnWifiManager::WAKE_ON_NONE: | 46 case WakeOnWifiManager::WAKE_ON_NONE: |
47 return kWakeOnNone; | 47 return kWakeOnNone; |
48 case WakeOnWifiManager::WAKE_ON_PACKET: | 48 case WakeOnWifiManager::WAKE_ON_PACKET: |
49 return kWakeOnPacket; | 49 return kWakeOnPacket; |
50 case WakeOnWifiManager::WAKE_ON_SSID: | 50 case WakeOnWifiManager::WAKE_ON_SSID: |
51 return kWakeOnSsid; | 51 return kWakeOnSsid; |
52 case WakeOnWifiManager::WAKE_ON_PACKET_AND_SSID: | 52 case WakeOnWifiManager::WAKE_ON_PACKET_AND_SSID: |
53 return kWakeOnPacketAndSsid; | 53 return kWakeOnPacketAndSsid; |
| 54 case WakeOnWifiManager::INVALID: |
| 55 return std::string(); |
54 } | 56 } |
55 | 57 |
56 NOTREACHED() << "Unknown wake on wifi feature: " << feature; | 58 NOTREACHED() << "Unknown wake on wifi feature: " << feature; |
57 return std::string(); | 59 return std::string(); |
58 } | 60 } |
59 | 61 |
| 62 bool IsWakeOnPacketEnabled(WakeOnWifiManager::WakeOnWifiFeature feature) { |
| 63 return feature == WakeOnWifiManager::WAKE_ON_PACKET || |
| 64 feature == WakeOnWifiManager::WAKE_ON_PACKET_AND_SSID; |
| 65 } |
| 66 |
60 // Weak pointer. This class is owned by ChromeBrowserMainPartsChromeos. | 67 // Weak pointer. This class is owned by ChromeBrowserMainPartsChromeos. |
61 WakeOnWifiManager* g_wake_on_wifi_manager = NULL; | 68 WakeOnWifiManager* g_wake_on_wifi_manager = NULL; |
62 | 69 |
63 } // namespace | 70 } // namespace |
64 | 71 |
65 // Simple class that listens for a connection to the GCM server and passes the | 72 // Simple class that listens for a connection to the GCM server and passes the |
66 // connection information down to shill. Each profile gets its own instance of | 73 // connection information down to shill. Each profile gets its own instance of |
67 // this class. | 74 // this class. |
68 class WakeOnWifiManager::WakeOnPacketConnectionObserver | 75 class WakeOnWifiManager::WakeOnPacketConnectionObserver |
69 : public gcm::GCMConnectionObserver { | 76 : public gcm::GCMConnectionObserver { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 DISALLOW_COPY_AND_ASSIGN(WakeOnPacketConnectionObserver); | 129 DISALLOW_COPY_AND_ASSIGN(WakeOnPacketConnectionObserver); |
123 }; | 130 }; |
124 | 131 |
125 // static | 132 // static |
126 WakeOnWifiManager* WakeOnWifiManager::Get() { | 133 WakeOnWifiManager* WakeOnWifiManager::Get() { |
127 DCHECK(g_wake_on_wifi_manager); | 134 DCHECK(g_wake_on_wifi_manager); |
128 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 135 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
129 return g_wake_on_wifi_manager; | 136 return g_wake_on_wifi_manager; |
130 } | 137 } |
131 | 138 |
132 WakeOnWifiManager::WakeOnWifiManager() { | 139 WakeOnWifiManager::WakeOnWifiManager() |
| 140 : current_feature_(WakeOnWifiManager::INVALID) { |
133 // This class must be constructed before any users are logged in, i.e., before | 141 // This class must be constructed before any users are logged in, i.e., before |
134 // any profiles are created or added to the ProfileManager. Additionally, | 142 // any profiles are created or added to the ProfileManager. Additionally, |
135 // IsUserLoggedIn always returns true when we are not running on a Chrome OS | 143 // IsUserLoggedIn always returns true when we are not running on a Chrome OS |
136 // device so this check should only run on real devices. | 144 // device so this check should only run on real devices. |
137 CHECK(!base::SysInfo::IsRunningOnChromeOS() || | 145 CHECK(!base::SysInfo::IsRunningOnChromeOS() || |
138 !LoginState::Get()->IsUserLoggedIn()); | 146 !LoginState::Get()->IsUserLoggedIn()); |
139 DCHECK(!g_wake_on_wifi_manager); | 147 DCHECK(!g_wake_on_wifi_manager); |
140 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 148 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
141 | 149 |
142 g_wake_on_wifi_manager = this; | 150 g_wake_on_wifi_manager = this; |
(...skipping 14 matching lines...) Expand all Loading... |
157 | 165 |
158 WakeOnWifiManager::~WakeOnWifiManager() { | 166 WakeOnWifiManager::~WakeOnWifiManager() { |
159 DCHECK(g_wake_on_wifi_manager); | 167 DCHECK(g_wake_on_wifi_manager); |
160 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 168 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
161 g_wake_on_wifi_manager = NULL; | 169 g_wake_on_wifi_manager = NULL; |
162 } | 170 } |
163 | 171 |
164 void WakeOnWifiManager::OnPreferenceChanged( | 172 void WakeOnWifiManager::OnPreferenceChanged( |
165 WakeOnWifiManager::WakeOnWifiFeature feature) { | 173 WakeOnWifiManager::WakeOnWifiFeature feature) { |
166 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 174 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 175 if (feature == current_feature_) |
| 176 return; |
| 177 |
| 178 current_feature_ = feature; |
| 179 |
167 const DeviceState* device = | 180 const DeviceState* device = |
168 NetworkHandler::Get()->network_state_handler()->GetDeviceStateByType( | 181 NetworkHandler::Get()->network_state_handler()->GetDeviceStateByType( |
169 NetworkTypePattern::WiFi()); | 182 NetworkTypePattern::WiFi()); |
170 if (!device) | 183 if (!device) |
171 return; | 184 return; |
172 | 185 |
173 std::string feature_string(WakeOnWifiFeatureToString(feature)); | 186 std::string feature_string(WakeOnWifiFeatureToString(feature)); |
174 DCHECK(!feature_string.empty()); | 187 DCHECK(!feature_string.empty()); |
175 | 188 |
176 NetworkHandler::Get()->network_device_handler()->SetDeviceProperty( | 189 NetworkHandler::Get()->network_device_handler()->SetDeviceProperty( |
177 device->path(), | 190 device->path(), |
178 shill::kWakeOnWiFiFeaturesEnabledProperty, | 191 shill::kWakeOnWiFiFeaturesEnabledProperty, |
179 base::StringValue(feature_string), | 192 base::StringValue(feature_string), |
180 base::Bind(&base::DoNothing), | 193 base::Bind(&base::DoNothing), |
181 network_handler::ErrorCallback()); | 194 network_handler::ErrorCallback()); |
| 195 |
| 196 bool wake_from_suspend = IsWakeOnPacketEnabled(current_feature_); |
| 197 for (const auto& kv_pair : connection_observers_) { |
| 198 Profile* profile = kv_pair.first; |
| 199 gcm::GCMProfileServiceFactory::GetForProfile(profile) |
| 200 ->driver() |
| 201 ->WakeFromSuspendForHeartbeat(wake_from_suspend); |
| 202 } |
182 } | 203 } |
183 | 204 |
184 void WakeOnWifiManager::Observe(int type, | 205 void WakeOnWifiManager::Observe(int type, |
185 const content::NotificationSource& source, | 206 const content::NotificationSource& source, |
186 const content::NotificationDetails& details) { | 207 const content::NotificationDetails& details) { |
187 switch (type) { | 208 switch (type) { |
188 case chrome::NOTIFICATION_PROFILE_ADDED: { | 209 case chrome::NOTIFICATION_PROFILE_ADDED: { |
189 OnProfileAdded(content::Source<Profile>(source).ptr()); | 210 OnProfileAdded(content::Source<Profile>(source).ptr()); |
190 break; | 211 break; |
191 } | 212 } |
192 case chrome::NOTIFICATION_PROFILE_DESTROYED: { | 213 case chrome::NOTIFICATION_PROFILE_DESTROYED: { |
193 OnProfileDestroyed(content::Source<Profile>(source).ptr()); | 214 OnProfileDestroyed(content::Source<Profile>(source).ptr()); |
194 break; | 215 break; |
195 } | 216 } |
196 default: | 217 default: |
197 NOTREACHED(); | 218 NOTREACHED(); |
198 } | 219 } |
199 } | 220 } |
200 | 221 |
201 void WakeOnWifiManager::OnProfileAdded(Profile* profile) { | 222 void WakeOnWifiManager::OnProfileAdded(Profile* profile) { |
202 // add will do nothing if |profile| already exists in |connection_observers_|. | 223 // add will do nothing if |profile| already exists in |connection_observers_|. |
203 connection_observers_.add( | 224 auto result = connection_observers_.add( |
204 profile, | 225 profile, |
205 make_scoped_ptr( | 226 make_scoped_ptr( |
206 new WakeOnWifiManager::WakeOnPacketConnectionObserver(profile))); | 227 new WakeOnWifiManager::WakeOnPacketConnectionObserver(profile))); |
| 228 |
| 229 if (result.second) { |
| 230 // This is a profile we haven't seen before. |
| 231 gcm::GCMProfileServiceFactory::GetForProfile(profile) |
| 232 ->driver() |
| 233 ->WakeFromSuspendForHeartbeat( |
| 234 IsWakeOnPacketEnabled(current_feature_)); |
| 235 } |
207 } | 236 } |
208 | 237 |
209 void WakeOnWifiManager::OnProfileDestroyed(Profile* profile) { | 238 void WakeOnWifiManager::OnProfileDestroyed(Profile* profile) { |
210 connection_observers_.erase(profile); | 239 connection_observers_.erase(profile); |
211 } | 240 } |
212 | 241 |
213 } // namespace chromeos | 242 } // namespace chromeos |
OLD | NEW |