Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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/policy/heartbeat_scheduler.h" | 5 #include "chrome/browser/chromeos/policy/heartbeat_scheduler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | |
| 10 #include "base/bind_helpers.h" | |
| 9 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 10 #include "base/location.h" | 12 #include "base/location.h" |
| 11 #include "base/sequenced_task_runner.h" | 13 #include "base/sequenced_task_runner.h" |
| 12 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 14 #include "chrome/common/chrome_switches.h" | 16 #include "chrome/common/chrome_switches.h" |
| 15 #include "components/gcm_driver/gcm_driver.h" | 17 #include "components/gcm_driver/gcm_driver.h" |
| 16 | 18 |
| 17 namespace { | 19 namespace { |
| 18 const int kMinHeartbeatIntervalMs = 30 * 1000; // 30 seconds | 20 const int kMinHeartbeatIntervalMs = 30 * 1000; // 30 seconds |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 case gcm::GCMClient::ASYNC_OPERATION_PENDING: | 155 case gcm::GCMClient::ASYNC_OPERATION_PENDING: |
| 154 case gcm::GCMClient::TTL_EXCEEDED: | 156 case gcm::GCMClient::TTL_EXCEEDED: |
| 155 default: | 157 default: |
| 156 NOTREACHED() << "Unexpected GCMDriver::Register() result: " << result; | 158 NOTREACHED() << "Unexpected GCMDriver::Register() result: " << result; |
| 157 break; | 159 break; |
| 158 } | 160 } |
| 159 } | 161 } |
| 160 | 162 |
| 161 HeartbeatScheduler::HeartbeatScheduler( | 163 HeartbeatScheduler::HeartbeatScheduler( |
| 162 gcm::GCMDriver* driver, | 164 gcm::GCMDriver* driver, |
| 165 policy::CloudPolicyClient* cloud_policy_client, | |
| 163 const std::string& enrollment_domain, | 166 const std::string& enrollment_domain, |
| 164 const std::string& device_id, | 167 const std::string& device_id, |
| 165 const scoped_refptr<base::SequencedTaskRunner>& task_runner) | 168 const scoped_refptr<base::SequencedTaskRunner>& task_runner) |
| 166 : task_runner_(task_runner), | 169 : task_runner_(task_runner), |
| 167 enrollment_domain_(enrollment_domain), | 170 enrollment_domain_(enrollment_domain), |
| 168 device_id_(device_id), | 171 device_id_(device_id), |
| 169 heartbeat_enabled_(false), | 172 heartbeat_enabled_(false), |
| 170 heartbeat_interval_(base::TimeDelta::FromMilliseconds( | 173 heartbeat_interval_( |
| 171 kDefaultHeartbeatIntervalMs)), | 174 base::TimeDelta::FromMilliseconds(kDefaultHeartbeatIntervalMs)), |
| 175 cloud_policy_client_(cloud_policy_client), | |
| 172 gcm_driver_(driver), | 176 gcm_driver_(driver), |
| 173 weak_factory_(this) { | 177 weak_factory_(this) { |
| 174 // If no GCMDriver (e.g. this is loaded as part of an unrelated unit test) | 178 // If no GCMDriver (e.g. this is loaded as part of an unrelated unit test) |
| 175 // do nothing as no heartbeats can be sent. | 179 // do nothing as no heartbeats can be sent. |
| 176 if (!gcm_driver_) | 180 if (!gcm_driver_) |
| 177 return; | 181 return; |
| 178 | 182 |
| 179 heartbeat_frequency_observer_ = | 183 heartbeat_frequency_observer_ = |
| 180 chromeos::CrosSettings::Get()->AddSettingsObserver( | 184 chromeos::CrosSettings::Get()->AddSettingsObserver( |
| 181 chromeos::kHeartbeatFrequency, | 185 chromeos::kHeartbeatFrequency, |
| 182 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, | 186 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, |
| 183 base::Unretained(this))); | 187 base::Unretained(this))); |
| 184 | 188 |
| 185 heartbeat_enabled_observer_ = | 189 heartbeat_enabled_observer_ = |
| 186 chromeos::CrosSettings::Get()->AddSettingsObserver( | 190 chromeos::CrosSettings::Get()->AddSettingsObserver( |
| 187 chromeos::kHeartbeatEnabled, | 191 chromeos::kHeartbeatEnabled, |
| 188 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, | 192 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, |
| 189 base::Unretained(this))); | 193 base::Unretained(this))); |
| 190 | 194 |
| 191 // Update the heartbeat frequency from settings. This will trigger a | 195 // Update the heartbeat frequency from settings. This will trigger a |
| 192 // heartbeat as appropriate once the settings have been refreshed. | 196 // heartbeat as appropriate once the settings have been refreshed. |
| 193 RefreshHeartbeatSettings(); | 197 RefreshHeartbeatSettings(); |
| 194 } | 198 } |
| 195 | 199 |
| 200 void HeartbeatScheduler::SetCloudPolicyClientForTesting( | |
| 201 policy::CloudPolicyClient* client) { | |
| 202 cloud_policy_client_ = client; | |
| 203 } | |
| 204 | |
| 196 void HeartbeatScheduler::RefreshHeartbeatSettings() { | 205 void HeartbeatScheduler::RefreshHeartbeatSettings() { |
| 197 // Attempt to fetch the current value of the reporting settings. | 206 // Attempt to fetch the current value of the reporting settings. |
| 198 // If trusted values are not available, register this function to be called | 207 // If trusted values are not available, register this function to be called |
| 199 // back when they are available. | 208 // back when they are available. |
| 200 chromeos::CrosSettings* settings = chromeos::CrosSettings::Get(); | 209 chromeos::CrosSettings* settings = chromeos::CrosSettings::Get(); |
| 201 if (chromeos::CrosSettingsProvider::TRUSTED != settings->PrepareTrustedValues( | 210 if (chromeos::CrosSettingsProvider::TRUSTED != settings->PrepareTrustedValues( |
| 202 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, | 211 base::Bind(&HeartbeatScheduler::RefreshHeartbeatSettings, |
| 203 weak_factory_.GetWeakPtr()))) { | 212 weak_factory_.GetWeakPtr()))) { |
| 204 return; | 213 return; |
| 205 } | 214 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 task_runner_->PostDelayedTask( | 299 task_runner_->PostDelayedTask( |
| 291 FROM_HERE, heartbeat_callback_.callback(), delay); | 300 FROM_HERE, heartbeat_callback_.callback(), delay); |
| 292 } | 301 } |
| 293 | 302 |
| 294 void HeartbeatScheduler::OnRegistrationComplete( | 303 void HeartbeatScheduler::OnRegistrationComplete( |
| 295 const std::string& registration_id) { | 304 const std::string& registration_id) { |
| 296 DCHECK(!registration_id.empty()); | 305 DCHECK(!registration_id.empty()); |
| 297 registration_helper_.reset(); | 306 registration_helper_.reset(); |
| 298 registration_id_ = registration_id; | 307 registration_id_ = registration_id; |
| 299 | 308 |
| 309 if (cloud_policy_client_) { | |
| 310 cloud_policy_client_->UpdateGcmIdMapping( | |
|
Andrew T Wilson (Slow)
2015/08/03 13:52:26
Log a bug and add a TODO() here to avoid unnecessa
binjin
2015/08/03 17:54:25
Done.
| |
| 311 registration_id, | |
| 312 base::Bind(&HeartbeatScheduler::OnGcmIdMappingRequestSent, | |
| 313 base::Unretained(this))); | |
|
Andrew T Wilson (Slow)
2015/08/03 13:52:26
Use a weak pointer here instead of Unretained().
binjin
2015/08/03 17:54:25
Done.
| |
| 314 } | |
| 315 | |
| 300 // Now that GCM registration is complete, start sending heartbeats. | 316 // Now that GCM registration is complete, start sending heartbeats. |
| 301 ScheduleNextHeartbeat(); | 317 ScheduleNextHeartbeat(); |
| 302 } | 318 } |
| 303 | 319 |
| 304 void HeartbeatScheduler::SendHeartbeat() { | 320 void HeartbeatScheduler::SendHeartbeat() { |
| 305 DCHECK(!registration_id_.empty()); | 321 DCHECK(!registration_id_.empty()); |
| 306 if (!gcm_driver_ || !heartbeat_enabled_) | 322 if (!gcm_driver_ || !heartbeat_enabled_) |
| 307 return; | 323 return; |
| 308 | 324 |
| 309 gcm::OutgoingMessage message; | 325 gcm::OutgoingMessage message; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 365 const std::string& app_id, | 381 const std::string& app_id, |
| 366 const gcm::GCMClient::SendErrorDetails& details) { | 382 const gcm::GCMClient::SendErrorDetails& details) { |
| 367 // Ignore send errors - we already are notified above in OnHeartbeatSent(). | 383 // Ignore send errors - we already are notified above in OnHeartbeatSent(). |
| 368 } | 384 } |
| 369 | 385 |
| 370 void HeartbeatScheduler::OnSendAcknowledged(const std::string& app_id, | 386 void HeartbeatScheduler::OnSendAcknowledged(const std::string& app_id, |
| 371 const std::string& message_id) { | 387 const std::string& message_id) { |
| 372 DVLOG(1) << "Heartbeat sent with message_id: " << message_id; | 388 DVLOG(1) << "Heartbeat sent with message_id: " << message_id; |
| 373 } | 389 } |
| 374 | 390 |
| 391 void HeartbeatScheduler::OnGcmIdMappingRequestSent(bool status) { | |
| 392 latest_gcm_id_mapping_succeeded_ = status; | |
|
Andrew T Wilson (Slow)
2015/08/03 13:52:26
Why do we bother having a callback here at all? We
binjin
2015/08/03 17:54:25
Okay, removed the latest_gcm_id_mapping_succeeded
| |
| 393 if (!status) | |
| 394 LOG(WARNING) << "Failed to send GCM id to DM server"; | |
|
Andrew T Wilson (Slow)
2015/08/03 13:52:26
Use LOG_IF() instead of if() { LOG() }
binjin
2015/08/03 17:54:25
Done.
| |
| 395 } | |
| 396 | |
| 375 } // namespace policy | 397 } // namespace policy |
| OLD | NEW |