Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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_profile_service.h" | 5 #include "chrome/browser/services/gcm/gcm_profile_service.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 GCMClient::Result result) OVERRIDE; | 257 GCMClient::Result result) OVERRIDE; |
| 258 virtual void OnGCMReady() OVERRIDE; | 258 virtual void OnGCMReady() OVERRIDE; |
| 259 | 259 |
| 260 // Called on IO thread. | 260 // Called on IO thread. |
| 261 void Initialize(scoped_ptr<GCMClientFactory> gcm_client_factory, | 261 void Initialize(scoped_ptr<GCMClientFactory> gcm_client_factory, |
| 262 const base::FilePath& store_path, | 262 const base::FilePath& store_path, |
| 263 const std::vector<std::string>& account_ids, | 263 const std::vector<std::string>& account_ids, |
| 264 const scoped_refptr<net::URLRequestContextGetter>& | 264 const scoped_refptr<net::URLRequestContextGetter>& |
| 265 url_request_context_getter); | 265 url_request_context_getter); |
| 266 void Reset(); | 266 void Reset(); |
| 267 void Load(const base::WeakPtr<GCMProfileService>& service); | 267 void Load(const base::WeakPtr<GCMProfileService>& service); |
|
Dmitry Titov
2014/03/04 02:47:51
Note: If you rename GCMClient::Load -> Start, you
jianli
2014/03/04 05:14:26
Yes, will rename all these if we proceed with the
| |
| 268 void Stop(); | |
| 268 void CheckOut(); | 269 void CheckOut(); |
| 269 void Register(const std::string& app_id, | 270 void Register(const std::string& app_id, |
| 270 const std::vector<std::string>& sender_ids, | 271 const std::vector<std::string>& sender_ids, |
| 271 const std::string& cert); | 272 const std::string& cert); |
| 272 void Unregister(const std::string& app_id); | 273 void Unregister(const std::string& app_id); |
| 273 void Send(const std::string& app_id, | 274 void Send(const std::string& app_id, |
| 274 const std::string& receiver_id, | 275 const std::string& receiver_id, |
| 275 const GCMClient::OutgoingMessage& message); | 276 const GCMClient::OutgoingMessage& message); |
| 276 | 277 |
| 277 // For testing purpose. Can be called from UI thread. Use with care. | 278 // For testing purpose. Can be called from UI thread. Use with care. |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 419 } | 420 } |
| 420 | 421 |
| 421 void GCMProfileService::IOWorker::Load( | 422 void GCMProfileService::IOWorker::Load( |
| 422 const base::WeakPtr<GCMProfileService>& service) { | 423 const base::WeakPtr<GCMProfileService>& service) { |
| 423 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 424 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| 424 | 425 |
| 425 service_ = service; | 426 service_ = service; |
| 426 gcm_client_->Load(); | 427 gcm_client_->Load(); |
| 427 } | 428 } |
| 428 | 429 |
| 430 void GCMProfileService::IOWorker::Stop() { | |
| 431 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | |
| 432 | |
| 433 gcm_client_->Stop(); | |
| 434 } | |
| 435 | |
| 429 void GCMProfileService::IOWorker::CheckOut() { | 436 void GCMProfileService::IOWorker::CheckOut() { |
| 430 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 437 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| 431 | 438 |
| 432 gcm_client_->CheckOut(); | 439 gcm_client_->CheckOut(); |
| 433 | 440 |
| 434 // Note that we still need to keep GCMClient instance alive since the profile | 441 // Note that we still need to keep GCMClient instance alive since the profile |
| 435 // might be signed in again. | 442 // might be signed in again. |
| 436 } | 443 } |
| 437 | 444 |
| 438 void GCMProfileService::IOWorker::Register( | 445 void GCMProfileService::IOWorker::Register( |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 552 profile_->GetPath().Append(chrome::kGCMStoreDirname), | 559 profile_->GetPath().Append(chrome::kGCMStoreDirname), |
| 553 account_ids, | 560 account_ids, |
| 554 url_request_context_getter)); | 561 url_request_context_getter)); |
| 555 | 562 |
| 556 // Load from the GCM store and initiate the GCM check-in if the rollout signal | 563 // Load from the GCM store and initiate the GCM check-in if the rollout signal |
| 557 // indicates yes. | 564 // indicates yes. |
| 558 if (GetGCMEnabledState(profile_) == ALWAYS_ENABLED) | 565 if (GetGCMEnabledState(profile_) == ALWAYS_ENABLED) |
| 559 EnsureLoaded(); | 566 EnsureLoaded(); |
| 560 } | 567 } |
| 561 | 568 |
| 569 void GCMProfileService::Start() { | |
| 570 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 571 | |
| 572 EnsureLoaded(); | |
| 573 } | |
| 574 | |
| 575 void GCMProfileService::Stop() { | |
| 576 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 577 | |
| 578 // No need to stop GCM service if not signed in yet. | |
| 579 if (username_.empty()) | |
| 580 return; | |
| 581 username_.clear(); | |
|
fgorski
2014/03/04 20:07:49
Seems that clearing username could be a part of Re
jianli
2014/03/04 20:52:26
Done.
| |
| 582 | |
| 583 RemoveCachedData(); | |
| 584 | |
| 585 content::BrowserThread::PostTask( | |
| 586 content::BrowserThread::IO, | |
| 587 FROM_HERE, | |
| 588 base::Bind(&GCMProfileService::IOWorker::Stop, io_worker_)); | |
| 589 } | |
| 590 | |
| 562 void GCMProfileService::Register(const std::string& app_id, | 591 void GCMProfileService::Register(const std::string& app_id, |
| 563 const std::vector<std::string>& sender_ids, | 592 const std::vector<std::string>& sender_ids, |
| 564 const std::string& cert, | 593 const std::string& cert, |
| 565 RegisterCallback callback) { | 594 RegisterCallback callback) { |
| 566 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 595 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 567 DCHECK(!app_id.empty() && !sender_ids.empty() && !callback.is_null()); | 596 DCHECK(!app_id.empty() && !sender_ids.empty() && !callback.is_null()); |
| 568 | 597 |
| 569 // Ensure that check-in has been done. | 598 // Ensure that check-in has been done. |
| 570 EnsureLoaded(); | 599 EnsureLoaded(); |
| 571 | 600 |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 765 // Note that we need to pass weak pointer again since the existing weak | 794 // Note that we need to pass weak pointer again since the existing weak |
| 766 // pointer in IOWorker might have been invalidated when check-out occurs. | 795 // pointer in IOWorker might have been invalidated when check-out occurs. |
| 767 content::BrowserThread::PostTask( | 796 content::BrowserThread::PostTask( |
| 768 content::BrowserThread::IO, | 797 content::BrowserThread::IO, |
| 769 FROM_HERE, | 798 FROM_HERE, |
| 770 base::Bind(&GCMProfileService::IOWorker::Load, | 799 base::Bind(&GCMProfileService::IOWorker::Load, |
| 771 io_worker_, | 800 io_worker_, |
| 772 weak_ptr_factory_.GetWeakPtr())); | 801 weak_ptr_factory_.GetWeakPtr())); |
| 773 } | 802 } |
| 774 | 803 |
| 775 void GCMProfileService::CheckOut() { | 804 void GCMProfileService::RemoveCachedData() { |
| 776 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 777 | |
| 778 // We still proceed with the check-out logic even if the check-in is not | |
| 779 // initiated in the current session. This will make sure that all the | |
| 780 // persisted data written previously will get purged. | |
| 781 username_.clear(); | |
| 782 | |
| 783 // Remove all the queued tasks since they no longer make sense after | 805 // Remove all the queued tasks since they no longer make sense after |
| 784 // check-out. | 806 // GCM service is stopped. |
| 785 weak_ptr_factory_.InvalidateWeakPtrs(); | 807 weak_ptr_factory_.InvalidateWeakPtrs(); |
| 786 | 808 |
| 809 gcm_client_ready_ = false; | |
| 810 delayed_task_controller_.reset(); | |
| 811 register_callbacks_.clear(); | |
| 812 send_callbacks_.clear(); | |
| 813 registration_info_map_.clear(); | |
| 814 } | |
| 815 | |
| 816 void GCMProfileService::RemovePersistedData() { | |
| 787 // Remove persisted data from app's state store. | 817 // Remove persisted data from app's state store. |
| 788 for (RegistrationInfoMap::const_iterator iter = | 818 for (RegistrationInfoMap::const_iterator iter = |
| 789 registration_info_map_.begin(); | 819 registration_info_map_.begin(); |
| 790 iter != registration_info_map_.end(); ++iter) { | 820 iter != registration_info_map_.end(); ++iter) { |
| 791 DeleteRegistrationInfo(iter->first); | 821 DeleteRegistrationInfo(iter->first); |
| 792 } | 822 } |
| 793 | 823 |
| 794 // Remove persisted data from prefs store. | 824 // Remove persisted data from prefs store. |
| 795 profile_->GetPrefs()->ClearPref(prefs::kGCMRegisteredAppIDs); | 825 profile_->GetPrefs()->ClearPref(prefs::kGCMRegisteredAppIDs); |
| 826 } | |
| 796 | 827 |
| 797 gcm_client_ready_ = false; | 828 void GCMProfileService::CheckOut() { |
| 798 delayed_task_controller_.reset(); | 829 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 799 register_callbacks_.clear(); | 830 |
| 800 send_callbacks_.clear(); | 831 // We still proceed with the check-out logic even if the check-in is not |
| 801 registration_info_map_.clear(); | 832 // initiated in the current session. This will make sure that all the |
| 833 // persisted data written previously will get purged. | |
| 834 username_.clear(); | |
| 835 | |
| 836 // This has to be done before removing the cached data since we need to do | |
| 837 // the lookup based on the cached data. | |
| 838 RemovePersistedData(); | |
| 839 | |
| 840 RemoveCachedData(); | |
| 802 | 841 |
| 803 content::BrowserThread::PostTask( | 842 content::BrowserThread::PostTask( |
| 804 content::BrowserThread::IO, | 843 content::BrowserThread::IO, |
| 805 FROM_HERE, | 844 FROM_HERE, |
| 806 base::Bind(&GCMProfileService::IOWorker::CheckOut, io_worker_)); | 845 base::Bind(&GCMProfileService::IOWorker::CheckOut, io_worker_)); |
| 807 } | 846 } |
| 808 | 847 |
| 809 void GCMProfileService::ResetGCMClient() { | 848 void GCMProfileService::ResetGCMClient() { |
| 810 content::BrowserThread::PostTask( | 849 content::BrowserThread::PostTask( |
| 811 content::BrowserThread::IO, | 850 content::BrowserThread::IO, |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1069 | 1108 |
| 1070 return true; | 1109 return true; |
| 1071 } | 1110 } |
| 1072 | 1111 |
| 1073 // static | 1112 // static |
| 1074 const char* GCMProfileService::GetPersistentRegisterKeyForTesting() { | 1113 const char* GCMProfileService::GetPersistentRegisterKeyForTesting() { |
| 1075 return kRegistrationKey; | 1114 return kRegistrationKey; |
| 1076 } | 1115 } |
| 1077 | 1116 |
| 1078 } // namespace gcm | 1117 } // namespace gcm |
| OLD | NEW |