Chromium Code Reviews| 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 "components/gcm_driver/gcm_driver_desktop.h" | 5 #include "components/gcm_driver/gcm_driver_desktop.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/location.h" | 12 #include "base/location.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/sequenced_task_runner.h" | 14 #include "base/sequenced_task_runner.h" |
| 15 #include "base/threading/sequenced_worker_pool.h" | 15 #include "base/threading/sequenced_worker_pool.h" |
| 16 #include "components/gcm_driver/gcm_app_handler.h" | 16 #include "components/gcm_driver/gcm_app_handler.h" |
| 17 #include "components/gcm_driver/gcm_client_factory.h" | 17 #include "components/gcm_driver/gcm_client_factory.h" |
| 18 #include "components/gcm_driver/system_encryptor.h" | 18 #include "components/gcm_driver/system_encryptor.h" |
| 19 #include "google_apis/gaia/oauth2_token_service.h" | 19 #include "google_apis/gaia/oauth2_token_service.h" |
| 20 #include "net/base/ip_endpoint.h" | |
| 20 #include "net/url_request/url_request_context_getter.h" | 21 #include "net/url_request/url_request_context_getter.h" |
| 21 | 22 |
| 22 namespace gcm { | 23 namespace gcm { |
| 23 | 24 |
| 24 // Helper class to save tasks to run until we're ready to execute them. | 25 // Helper class to save tasks to run until we're ready to execute them. |
| 25 class GCMDriverDesktop::DelayedTaskController { | 26 class GCMDriverDesktop::DelayedTaskController { |
| 26 public: | 27 public: |
| 27 DelayedTaskController(); | 28 DelayedTaskController(); |
| 28 ~DelayedTaskController(); | 29 ~DelayedTaskController(); |
| 29 | 30 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 GCMClient::Result result) OVERRIDE; | 97 GCMClient::Result result) OVERRIDE; |
| 97 virtual void OnMessageReceived( | 98 virtual void OnMessageReceived( |
| 98 const std::string& app_id, | 99 const std::string& app_id, |
| 99 const GCMClient::IncomingMessage& message) OVERRIDE; | 100 const GCMClient::IncomingMessage& message) OVERRIDE; |
| 100 virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE; | 101 virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE; |
| 101 virtual void OnMessageSendError( | 102 virtual void OnMessageSendError( |
| 102 const std::string& app_id, | 103 const std::string& app_id, |
| 103 const GCMClient::SendErrorDetails& send_error_details) OVERRIDE; | 104 const GCMClient::SendErrorDetails& send_error_details) OVERRIDE; |
| 104 virtual void OnGCMReady() OVERRIDE; | 105 virtual void OnGCMReady() OVERRIDE; |
| 105 virtual void OnActivityRecorded() OVERRIDE; | 106 virtual void OnActivityRecorded() OVERRIDE; |
| 107 virtual void OnConnected(const net::IPEndPoint& ip_endpoint) OVERRIDE; | |
| 108 virtual void OnDisconnected() OVERRIDE; | |
| 106 | 109 |
| 107 // Called on IO thread. | 110 // Called on IO thread. |
| 108 void Initialize( | 111 void Initialize( |
| 109 scoped_ptr<GCMClientFactory> gcm_client_factory, | 112 scoped_ptr<GCMClientFactory> gcm_client_factory, |
| 110 const GCMClient::ChromeBuildInfo& chrome_build_info, | 113 const GCMClient::ChromeBuildInfo& chrome_build_info, |
| 111 const base::FilePath& store_path, | 114 const base::FilePath& store_path, |
| 112 const std::vector<std::string>& account_ids, | 115 const std::vector<std::string>& account_ids, |
| 113 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 116 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 114 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); | 117 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); |
| 115 void Start(const base::WeakPtr<GCMDriverDesktop>& service); | 118 void Start(const base::WeakPtr<GCMDriverDesktop>& service); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 base::Bind(&GCMDriverDesktop::GCMClientReady, service_)); | 246 base::Bind(&GCMDriverDesktop::GCMClientReady, service_)); |
| 244 } | 247 } |
| 245 | 248 |
| 246 void GCMDriverDesktop::IOWorker::OnActivityRecorded() { | 249 void GCMDriverDesktop::IOWorker::OnActivityRecorded() { |
| 247 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 250 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| 248 // When an activity is recorded, get all the stats and refresh the UI of | 251 // When an activity is recorded, get all the stats and refresh the UI of |
| 249 // gcm-internals page. | 252 // gcm-internals page. |
| 250 GetGCMStatistics(false); | 253 GetGCMStatistics(false); |
| 251 } | 254 } |
| 252 | 255 |
| 256 void GCMDriverDesktop::IOWorker::OnConnected( | |
| 257 const net::IPEndPoint& ip_endpoint) { | |
| 258 ui_thread_->PostTask(FROM_HERE, | |
| 259 base::Bind(&GCMDriverDesktop::OnConnected, | |
| 260 service_, | |
| 261 ip_endpoint)); | |
| 262 } | |
| 263 | |
| 264 void GCMDriverDesktop::IOWorker::OnDisconnected() { | |
| 265 ui_thread_->PostTask(FROM_HERE, | |
| 266 base::Bind(&GCMDriverDesktop::OnDisconnected, service_)); | |
| 267 } | |
| 268 | |
| 253 void GCMDriverDesktop::IOWorker::Start( | 269 void GCMDriverDesktop::IOWorker::Start( |
| 254 const base::WeakPtr<GCMDriverDesktop>& service) { | 270 const base::WeakPtr<GCMDriverDesktop>& service) { |
| 255 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 271 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| 256 | 272 |
| 257 service_ = service; | 273 service_ = service; |
| 258 gcm_client_->Start(); | 274 gcm_client_->Start(); |
| 259 } | 275 } |
| 260 | 276 |
| 261 void GCMDriverDesktop::IOWorker::Stop() { | 277 void GCMDriverDesktop::IOWorker::Stop() { |
| 262 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 278 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 scoped_ptr<GCMClientFactory> gcm_client_factory, | 346 scoped_ptr<GCMClientFactory> gcm_client_factory, |
| 331 scoped_ptr<IdentityProvider> identity_provider, | 347 scoped_ptr<IdentityProvider> identity_provider, |
| 332 const GCMClient::ChromeBuildInfo& chrome_build_info, | 348 const GCMClient::ChromeBuildInfo& chrome_build_info, |
| 333 const base::FilePath& store_path, | 349 const base::FilePath& store_path, |
| 334 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 350 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 335 const scoped_refptr<base::SequencedTaskRunner>& ui_thread, | 351 const scoped_refptr<base::SequencedTaskRunner>& ui_thread, |
| 336 const scoped_refptr<base::SequencedTaskRunner>& io_thread, | 352 const scoped_refptr<base::SequencedTaskRunner>& io_thread, |
| 337 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) | 353 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) |
| 338 : gcm_enabled_(true), | 354 : gcm_enabled_(true), |
| 339 gcm_client_ready_(false), | 355 gcm_client_ready_(false), |
| 356 connected_(false), | |
| 340 identity_provider_(identity_provider.Pass()), | 357 identity_provider_(identity_provider.Pass()), |
| 341 ui_thread_(ui_thread), | 358 ui_thread_(ui_thread), |
| 342 io_thread_(io_thread), | 359 io_thread_(io_thread), |
| 343 weak_ptr_factory_(this) { | 360 weak_ptr_factory_(this) { |
| 344 // Get the list of available accounts. | 361 // Get the list of available accounts. |
| 345 std::vector<std::string> account_ids; | 362 std::vector<std::string> account_ids; |
| 346 account_ids = identity_provider_->GetTokenService()->GetAccounts(); | 363 account_ids = identity_provider_->GetTokenService()->GetAccounts(); |
| 347 | 364 |
| 348 // Create and initialize the GCMClient. Note that this does not initiate the | 365 // Create and initialize the GCMClient. Note that this does not initiate the |
| 349 // GCM check-in. | 366 // GCM check-in. |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 527 bool GCMDriverDesktop::IsStarted() const { | 544 bool GCMDriverDesktop::IsStarted() const { |
| 528 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 545 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 529 return !account_id_.empty(); | 546 return !account_id_.empty(); |
| 530 } | 547 } |
| 531 | 548 |
| 532 bool GCMDriverDesktop::IsGCMClientReady() const { | 549 bool GCMDriverDesktop::IsGCMClientReady() const { |
| 533 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 550 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 534 return gcm_client_ready_; | 551 return gcm_client_ready_; |
| 535 } | 552 } |
| 536 | 553 |
| 554 bool GCMDriverDesktop::IsConnected() const { | |
| 555 return connected_; | |
| 556 } | |
| 557 | |
| 537 void GCMDriverDesktop::GetGCMStatistics( | 558 void GCMDriverDesktop::GetGCMStatistics( |
| 538 const GetGCMStatisticsCallback& callback, | 559 const GetGCMStatisticsCallback& callback, |
| 539 bool clear_logs) { | 560 bool clear_logs) { |
| 540 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 561 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 541 DCHECK(!callback.is_null()); | 562 DCHECK(!callback.is_null()); |
| 542 | 563 |
| 543 request_gcm_statistics_callback_ = callback; | 564 request_gcm_statistics_callback_ = callback; |
| 544 io_thread_->PostTask( | 565 io_thread_->PostTask( |
| 545 FROM_HERE, | 566 FROM_HERE, |
| 546 base::Bind(&GCMDriverDesktop::IOWorker::GetGCMStatistics, | 567 base::Bind(&GCMDriverDesktop::IOWorker::GetGCMStatistics, |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 660 void GCMDriverDesktop::GCMClientReady() { | 681 void GCMDriverDesktop::GCMClientReady() { |
| 661 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 682 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 662 | 683 |
| 663 if (gcm_client_ready_) | 684 if (gcm_client_ready_) |
| 664 return; | 685 return; |
| 665 gcm_client_ready_ = true; | 686 gcm_client_ready_ = true; |
| 666 | 687 |
| 667 delayed_task_controller_->SetReady(); | 688 delayed_task_controller_->SetReady(); |
| 668 } | 689 } |
| 669 | 690 |
| 691 void GCMDriverDesktop::OnConnected(const net::IPEndPoint& ip_endpoint) { | |
| 692 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | |
| 693 | |
| 694 connected_ = true; | |
| 695 | |
| 696 // Drop the event if signed out. | |
| 697 if (account_id_.empty()) | |
| 698 return; | |
| 699 | |
| 700 const GCMAppHandlerMap& app_handler_map = app_handlers(); | |
| 701 for (GCMAppHandlerMap::const_iterator iter = app_handler_map.begin(); | |
| 702 iter != app_handler_map.end(); ++iter) { | |
| 703 iter->second->OnConnected(ip_endpoint); | |
| 704 } | |
| 705 | |
| 706 // Inform the default app handler. | |
| 707 GetAppHandler("")->OnConnected(ip_endpoint); | |
|
fgorski
2014/06/09 23:19:43
nit: could we add a constant for a default app han
Nicolas Zea
2014/06/09 23:28:25
Done.
| |
| 708 } | |
| 709 | |
| 710 void GCMDriverDesktop::OnDisconnected() { | |
| 711 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | |
| 712 | |
| 713 connected_ = false; | |
| 714 | |
| 715 // Drop the event if signed out. | |
| 716 if (account_id_.empty()) | |
| 717 return; | |
| 718 | |
| 719 const GCMAppHandlerMap& app_handler_map = app_handlers(); | |
| 720 for (GCMAppHandlerMap::const_iterator iter = app_handler_map.begin(); | |
| 721 iter != app_handler_map.end(); ++iter) { | |
| 722 iter->second->OnDisconnected(); | |
| 723 } | |
| 724 | |
| 725 // Inform the default app handler. | |
| 726 GetAppHandler("")->OnDisconnected(); | |
| 727 } | |
| 728 | |
| 670 void GCMDriverDesktop::GetGCMStatisticsFinished( | 729 void GCMDriverDesktop::GetGCMStatisticsFinished( |
| 671 const GCMClient::GCMStatistics& stats) { | 730 const GCMClient::GCMStatistics& stats) { |
| 672 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 731 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 673 | 732 |
| 674 // Normally request_gcm_statistics_callback_ would not be null. | 733 // Normally request_gcm_statistics_callback_ would not be null. |
| 675 if (!request_gcm_statistics_callback_.is_null()) | 734 if (!request_gcm_statistics_callback_.is_null()) |
| 676 request_gcm_statistics_callback_.Run(stats); | 735 request_gcm_statistics_callback_.Run(stats); |
| 677 else | 736 else |
| 678 LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; | 737 LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; |
| 679 } | 738 } |
| 680 | 739 |
| 681 std::string GCMDriverDesktop::SignedInUserName() const { | 740 std::string GCMDriverDesktop::SignedInUserName() const { |
| 682 if (IsStarted()) | 741 if (IsStarted()) |
| 683 return identity_provider_->GetActiveUsername(); | 742 return identity_provider_->GetActiveUsername(); |
| 684 return std::string(); | 743 return std::string(); |
| 685 } | 744 } |
| 686 | 745 |
| 687 } // namespace gcm | 746 } // namespace gcm |
| 747 | |
| OLD | NEW |