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/services/gcm/gcm_service.h" | 5 #include "chrome/browser/services/gcm/gcm_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 const GCMClient::SendErrorDetails& send_error_details) OVERRIDE; | 147 const GCMClient::SendErrorDetails& send_error_details) OVERRIDE; |
148 virtual void OnGCMReady() OVERRIDE; | 148 virtual void OnGCMReady() OVERRIDE; |
149 virtual void OnActivityRecorded() OVERRIDE; | 149 virtual void OnActivityRecorded() OVERRIDE; |
150 | 150 |
151 // Called on IO thread. | 151 // Called on IO thread. |
152 void Initialize(scoped_ptr<GCMClientFactory> gcm_client_factory, | 152 void Initialize(scoped_ptr<GCMClientFactory> gcm_client_factory, |
153 const base::FilePath& store_path, | 153 const base::FilePath& store_path, |
154 const std::vector<std::string>& account_ids, | 154 const std::vector<std::string>& account_ids, |
155 const scoped_refptr<net::URLRequestContextGetter>& | 155 const scoped_refptr<net::URLRequestContextGetter>& |
156 url_request_context_getter); | 156 url_request_context_getter); |
157 void Load(const base::WeakPtr<GCMService>& service); | 157 void Start(const base::WeakPtr<GCMService>& service); |
158 void Stop(); | 158 void Stop(); |
159 void CheckOut(); | 159 void CheckOut(); |
160 void Register(const std::string& app_id, | 160 void Register(const std::string& app_id, |
161 const std::vector<std::string>& sender_ids); | 161 const std::vector<std::string>& sender_ids); |
162 void Unregister(const std::string& app_id); | 162 void Unregister(const std::string& app_id); |
163 void Send(const std::string& app_id, | 163 void Send(const std::string& app_id, |
164 const std::string& receiver_id, | 164 const std::string& receiver_id, |
165 const GCMClient::OutgoingMessage& message); | 165 const GCMClient::OutgoingMessage& message); |
166 void GetGCMStatistics(bool clear_logs); | 166 void GetGCMStatistics(bool clear_logs); |
167 void SetGCMRecording(bool recording); | 167 void SetGCMRecording(bool recording); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 service_)); | 297 service_)); |
298 } | 298 } |
299 | 299 |
300 void GCMService::IOWorker::OnActivityRecorded() { | 300 void GCMService::IOWorker::OnActivityRecorded() { |
301 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 301 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
302 // When an activity is recorded, get all the stats and refresh the UI of | 302 // When an activity is recorded, get all the stats and refresh the UI of |
303 // gcm-internals page. | 303 // gcm-internals page. |
304 GetGCMStatistics(false); | 304 GetGCMStatistics(false); |
305 } | 305 } |
306 | 306 |
307 void GCMService::IOWorker::Load(const base::WeakPtr<GCMService>& service) { | 307 void GCMService::IOWorker::Start(const base::WeakPtr<GCMService>& service) { |
308 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 308 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
309 | 309 |
310 service_ = service; | 310 service_ = service; |
311 gcm_client_->Load(); | 311 gcm_client_->Start(); |
312 } | 312 } |
313 | 313 |
314 void GCMService::IOWorker::Stop() { | 314 void GCMService::IOWorker::Stop() { |
315 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 315 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
316 | 316 |
317 gcm_client_->Stop(); | 317 gcm_client_->Stop(); |
318 } | 318 } |
319 | 319 |
320 void GCMService::IOWorker::CheckOut() { | 320 void GCMService::IOWorker::CheckOut() { |
321 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 321 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 content::BrowserThread::PostTask( | 403 content::BrowserThread::PostTask( |
404 content::BrowserThread::IO, | 404 content::BrowserThread::IO, |
405 FROM_HERE, | 405 FROM_HERE, |
406 base::Bind(&GCMService::IOWorker::Initialize, | 406 base::Bind(&GCMService::IOWorker::Initialize, |
407 base::Unretained(io_worker_.get()), | 407 base::Unretained(io_worker_.get()), |
408 base::Passed(&gcm_client_factory), | 408 base::Passed(&gcm_client_factory), |
409 GetStorePath(), | 409 GetStorePath(), |
410 account_ids, | 410 account_ids, |
411 GetURLRequestContextGetter())); | 411 GetURLRequestContextGetter())); |
412 | 412 |
413 // Load from the GCM store and initiate the GCM check-in if the rollout signal | 413 // Start the GCM service if the rollout signal indicates yes. |
414 // indicates yes. | |
415 if (ShouldStartAutomatically()) | 414 if (ShouldStartAutomatically()) |
416 EnsureLoaded(); | 415 EnsureStarted(); |
417 | 416 |
418 identity_provider_->AddObserver(this); | 417 identity_provider_->AddObserver(this); |
419 } | 418 } |
420 | 419 |
421 void GCMService::Start() { | 420 void GCMService::Start() { |
422 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 421 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
423 | 422 |
424 EnsureLoaded(); | 423 EnsureStarted(); |
425 } | 424 } |
426 | 425 |
427 void GCMService::Stop() { | 426 void GCMService::Stop() { |
428 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 427 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
429 | 428 |
430 // No need to stop GCM service if not started yet. | 429 // No need to stop GCM service if not started yet. |
431 if (account_id_.empty()) | 430 if (account_id_.empty()) |
432 return; | 431 return; |
433 | 432 |
434 RemoveCachedData(); | 433 RemoveCachedData(); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 content::BrowserThread::PostTask( | 659 content::BrowserThread::PostTask( |
661 content::BrowserThread::IO, | 660 content::BrowserThread::IO, |
662 FROM_HERE, | 661 FROM_HERE, |
663 base::Bind(&GCMService::IOWorker::SetGCMRecording, | 662 base::Bind(&GCMService::IOWorker::SetGCMRecording, |
664 base::Unretained(io_worker_.get()), | 663 base::Unretained(io_worker_.get()), |
665 recording)); | 664 recording)); |
666 } | 665 } |
667 | 666 |
668 void GCMService::OnActiveAccountLogin() { | 667 void GCMService::OnActiveAccountLogin() { |
669 if (ShouldStartAutomatically()) | 668 if (ShouldStartAutomatically()) |
670 EnsureLoaded(); | 669 EnsureStarted(); |
671 } | 670 } |
672 | 671 |
673 void GCMService::OnActiveAccountLogout() { | 672 void GCMService::OnActiveAccountLogout() { |
674 CheckOut(); | 673 CheckOut(); |
675 } | 674 } |
676 | 675 |
677 void GCMService::EnsureLoaded() { | 676 void GCMService::EnsureStarted() { |
678 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 677 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
679 const std::string account_id = identity_provider_->GetActiveAccountId(); | 678 const std::string account_id = identity_provider_->GetActiveAccountId(); |
680 if (account_id.empty()) | 679 if (account_id.empty()) |
681 return; | 680 return; |
682 | 681 |
683 // CheckIn could be called more than once when: | 682 // CheckIn could be called more than once when: |
684 // 1) The password changes. | 683 // 1) The password changes. |
685 // 2) Register/send function calls it to ensure CheckIn is done. | 684 // 2) Register/send function calls it to ensure CheckIn is done. |
686 if (account_id_ == account_id) | 685 if (account_id_ == account_id) |
687 return; | 686 return; |
688 account_id_ = account_id; | 687 account_id_ = account_id; |
689 | 688 |
690 DCHECK(!delayed_task_controller_); | 689 DCHECK(!delayed_task_controller_); |
691 delayed_task_controller_.reset(new DelayedTaskController); | 690 delayed_task_controller_.reset(new DelayedTaskController); |
692 | 691 |
693 // This will load the data from the gcm store and trigger the check-in if | |
694 // the persisted check-in info is not found. | |
695 // Note that we need to pass weak pointer again since the existing weak | 692 // Note that we need to pass weak pointer again since the existing weak |
696 // pointer in IOWorker might have been invalidated when check-out occurs. | 693 // pointer in IOWorker might have been invalidated when check-out occurs. |
697 content::BrowserThread::PostTask( | 694 content::BrowserThread::PostTask( |
698 content::BrowserThread::IO, | 695 content::BrowserThread::IO, |
699 FROM_HERE, | 696 FROM_HERE, |
700 base::Bind(&GCMService::IOWorker::Load, | 697 base::Bind(&GCMService::IOWorker::Start, |
701 base::Unretained(io_worker_.get()), | 698 base::Unretained(io_worker_.get()), |
702 weak_ptr_factory_.GetWeakPtr())); | 699 weak_ptr_factory_.GetWeakPtr())); |
703 } | 700 } |
704 | 701 |
705 void GCMService::RemoveCachedData() { | 702 void GCMService::RemoveCachedData() { |
706 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 703 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
707 // Remove all the queued tasks since they no longer make sense after | 704 // Remove all the queued tasks since they no longer make sense after |
708 // GCM service is stopped. | 705 // GCM service is stopped. |
709 weak_ptr_factory_.InvalidateWeakPtrs(); | 706 weak_ptr_factory_.InvalidateWeakPtrs(); |
710 | 707 |
(...skipping 15 matching lines...) Expand all Loading... |
726 | 723 |
727 content::BrowserThread::PostTask( | 724 content::BrowserThread::PostTask( |
728 content::BrowserThread::IO, | 725 content::BrowserThread::IO, |
729 FROM_HERE, | 726 FROM_HERE, |
730 base::Bind(&GCMService::IOWorker::CheckOut, | 727 base::Bind(&GCMService::IOWorker::CheckOut, |
731 base::Unretained(io_worker_.get()))); | 728 base::Unretained(io_worker_.get()))); |
732 } | 729 } |
733 | 730 |
734 GCMClient::Result GCMService::EnsureAppReady(const std::string& app_id) { | 731 GCMClient::Result GCMService::EnsureAppReady(const std::string& app_id) { |
735 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 732 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
736 // Ensure that check-in has been done. | |
737 EnsureLoaded(); | |
738 | 733 |
739 // If the service was not started, bail out. | 734 // Starts the service if not yet. |
| 735 EnsureStarted(); |
| 736 |
| 737 // If the service cannot be started, bail out. |
740 if (account_id_.empty()) | 738 if (account_id_.empty()) |
741 return GCMClient::NOT_SIGNED_IN; | 739 return GCMClient::NOT_SIGNED_IN; |
742 | 740 |
743 return GCMClient::SUCCESS; | 741 return GCMClient::SUCCESS; |
744 } | 742 } |
745 | 743 |
746 bool GCMService::IsAsyncOperationPending(const std::string& app_id) const { | 744 bool GCMService::IsAsyncOperationPending(const std::string& app_id) const { |
747 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 745 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
748 return register_callbacks_.find(app_id) != register_callbacks_.end() || | 746 return register_callbacks_.find(app_id) != register_callbacks_.end() || |
749 unregister_callbacks_.find(app_id) != unregister_callbacks_.end(); | 747 unregister_callbacks_.find(app_id) != unregister_callbacks_.end(); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 852 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
855 | 853 |
856 // Normally request_gcm_statistics_callback_ would not be null. | 854 // Normally request_gcm_statistics_callback_ would not be null. |
857 if (!request_gcm_statistics_callback_.is_null()) | 855 if (!request_gcm_statistics_callback_.is_null()) |
858 request_gcm_statistics_callback_.Run(stats); | 856 request_gcm_statistics_callback_.Run(stats); |
859 else | 857 else |
860 LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; | 858 LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; |
861 } | 859 } |
862 | 860 |
863 } // namespace gcm | 861 } // namespace gcm |
OLD | NEW |