| Index: components/gcm_driver/gcm_driver_desktop.cc
|
| diff --git a/components/gcm_driver/gcm_driver_desktop.cc b/components/gcm_driver/gcm_driver_desktop.cc
|
| index d69a98cffa4802c3fecaae185fa2e8f5055c2b86..f0f747403258be2553117094aba4cf2ff8df331d 100644
|
| --- a/components/gcm_driver/gcm_driver_desktop.cc
|
| +++ b/components/gcm_driver/gcm_driver_desktop.cc
|
| @@ -16,7 +16,6 @@
|
| #include "components/gcm_driver/gcm_app_handler.h"
|
| #include "components/gcm_driver/gcm_client_factory.h"
|
| #include "components/gcm_driver/system_encryptor.h"
|
| -#include "google_apis/gaia/oauth2_token_service.h"
|
| #include "net/base/ip_endpoint.h"
|
| #include "net/url_request/url_request_context_getter.h"
|
|
|
| @@ -119,7 +118,6 @@ class GCMDriverDesktop::IOWorker : public GCMClient::Delegate {
|
| scoped_ptr<GCMClientFactory> gcm_client_factory,
|
| const GCMClient::ChromeBuildInfo& chrome_build_info,
|
| const base::FilePath& store_path,
|
| - const std::vector<std::string>& account_ids,
|
| const scoped_refptr<net::URLRequestContextGetter>& request_context,
|
| const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner);
|
| void Start(const base::WeakPtr<GCMDriverDesktop>& service);
|
| @@ -164,7 +162,6 @@ void GCMDriverDesktop::IOWorker::Initialize(
|
| scoped_ptr<GCMClientFactory> gcm_client_factory,
|
| const GCMClient::ChromeBuildInfo& chrome_build_info,
|
| const base::FilePath& store_path,
|
| - const std::vector<std::string>& account_ids,
|
| const scoped_refptr<net::URLRequestContextGetter>& request_context,
|
| const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) {
|
| DCHECK(io_thread_->RunsTasksOnCurrentThread());
|
| @@ -173,7 +170,6 @@ void GCMDriverDesktop::IOWorker::Initialize(
|
|
|
| gcm_client_->Initialize(chrome_build_info,
|
| store_path,
|
| - account_ids,
|
| blocking_task_runner,
|
| request_context,
|
| make_scoped_ptr<Encryptor>(new SystemEncryptor),
|
| @@ -351,24 +347,20 @@ void GCMDriverDesktop::IOWorker::SetGCMRecording(bool recording) {
|
|
|
| GCMDriverDesktop::GCMDriverDesktop(
|
| scoped_ptr<GCMClientFactory> gcm_client_factory,
|
| - scoped_ptr<IdentityProvider> identity_provider,
|
| const GCMClient::ChromeBuildInfo& chrome_build_info,
|
| const base::FilePath& store_path,
|
| const scoped_refptr<net::URLRequestContextGetter>& request_context,
|
| const scoped_refptr<base::SequencedTaskRunner>& ui_thread,
|
| const scoped_refptr<base::SequencedTaskRunner>& io_thread,
|
| const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner)
|
| - : gcm_enabled_(true),
|
| + : signed_in_(false),
|
| + gcm_started_(false),
|
| + gcm_enabled_(true),
|
| gcm_client_ready_(false),
|
| connected_(false),
|
| - identity_provider_(identity_provider.Pass()),
|
| ui_thread_(ui_thread),
|
| io_thread_(io_thread),
|
| weak_ptr_factory_(this) {
|
| - // Get the list of available accounts.
|
| - std::vector<std::string> account_ids;
|
| - account_ids = identity_provider_->GetTokenService()->GetAccounts();
|
| -
|
| // Create and initialize the GCMClient. Note that this does not initiate the
|
| // GCM check-in.
|
| io_worker_.reset(new IOWorker(ui_thread, io_thread));
|
| @@ -379,29 +371,36 @@ GCMDriverDesktop::GCMDriverDesktop(
|
| base::Passed(&gcm_client_factory),
|
| chrome_build_info,
|
| store_path,
|
| - account_ids,
|
| request_context,
|
| blocking_task_runner));
|
| -
|
| - identity_provider_->AddObserver(this);
|
| }
|
|
|
| GCMDriverDesktop::~GCMDriverDesktop() {
|
| }
|
|
|
| -void GCMDriverDesktop::OnActiveAccountLogin() {
|
| - EnsureStarted();
|
| +void GCMDriverDesktop::Shutdown() {
|
| + DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
| + GCMDriver::Shutdown();
|
| + io_thread_->DeleteSoon(FROM_HERE, io_worker_.release());
|
| }
|
|
|
| -void GCMDriverDesktop::OnActiveAccountLogout() {
|
| - CheckOut();
|
| +void GCMDriverDesktop::OnSignedIn() {
|
| + signed_in_ = true;
|
| + EnsureStarted();
|
| }
|
|
|
| -void GCMDriverDesktop::Shutdown() {
|
| +void GCMDriverDesktop::Purge() {
|
| DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
| - identity_provider_->RemoveObserver(this);
|
| - GCMDriver::Shutdown();
|
| - io_thread_->DeleteSoon(FROM_HERE, io_worker_.release());
|
| +
|
| + // We still proceed with the check-out logic even if the check-in is not
|
| + // initiated in the current session. This will make sure that all the
|
| + // persisted data written previously will get purged.
|
| + signed_in_ = false;
|
| + RemoveCachedData();
|
| +
|
| + io_thread_->PostTask(FROM_HERE,
|
| + base::Bind(&GCMDriverDesktop::IOWorker::CheckOut,
|
| + base::Unretained(io_worker_.get())));
|
| }
|
|
|
| void GCMDriverDesktop::AddAppHandler(const std::string& app_id,
|
| @@ -446,7 +445,7 @@ void GCMDriverDesktop::Stop() {
|
| DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
|
|
| // No need to stop GCM service if not started yet.
|
| - if (account_id_.empty())
|
| + if (!gcm_started_)
|
| return;
|
|
|
| RemoveCachedData();
|
| @@ -550,7 +549,7 @@ GCMClient* GCMDriverDesktop::GetGCMClientForTesting() const {
|
|
|
| bool GCMDriverDesktop::IsStarted() const {
|
| DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
| - return !account_id_.empty();
|
| + return gcm_started_;
|
| }
|
|
|
| bool GCMDriverDesktop::IsGCMClientReady() const {
|
| @@ -591,6 +590,9 @@ void GCMDriverDesktop::SetGCMRecording(const GetGCMStatisticsCallback& callback,
|
| GCMClient::Result GCMDriverDesktop::EnsureStarted() {
|
| DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
|
|
| + if (gcm_started_)
|
| + return GCMClient::SUCCESS;
|
| +
|
| if (!gcm_enabled_)
|
| return GCMClient::GCM_DISABLED;
|
|
|
| @@ -598,18 +600,10 @@ GCMClient::Result GCMDriverDesktop::EnsureStarted() {
|
| if (app_handlers().empty())
|
| return GCMClient::UNKNOWN_ERROR;
|
|
|
| - // Is the user signed in?
|
| - const std::string account_id = identity_provider_->GetActiveAccountId();
|
| - if (account_id.empty())
|
| + // TODO(jianli): To be removed when sign-in enforcement is dropped.
|
| + if (!signed_in_)
|
| return GCMClient::NOT_SIGNED_IN;
|
|
|
| - // CheckIn could be called more than once when:
|
| - // 1) The password changes.
|
| - // 2) Register/send function calls it to ensure CheckIn is done.
|
| - if (account_id_ == account_id)
|
| - return GCMClient::SUCCESS;
|
| - account_id_ = account_id;
|
| -
|
| DCHECK(!delayed_task_controller_);
|
| delayed_task_controller_.reset(new DelayedTaskController);
|
|
|
| @@ -621,6 +615,7 @@ GCMClient::Result GCMDriverDesktop::EnsureStarted() {
|
| base::Unretained(io_worker_.get()),
|
| weak_ptr_factory_.GetWeakPtr()));
|
|
|
| + gcm_started_ = true;
|
| return GCMClient::SUCCESS;
|
| }
|
|
|
| @@ -630,34 +625,19 @@ void GCMDriverDesktop::RemoveCachedData() {
|
| // GCM service is stopped.
|
| weak_ptr_factory_.InvalidateWeakPtrs();
|
|
|
| - account_id_.clear();
|
| + gcm_started_ = false;
|
| gcm_client_ready_ = false;
|
| delayed_task_controller_.reset();
|
| ClearCallbacks();
|
| }
|
|
|
| -void GCMDriverDesktop::CheckOut() {
|
| - DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
| -
|
| - // We still proceed with the check-out logic even if the check-in is not
|
| - // initiated in the current session. This will make sure that all the
|
| - // persisted data written previously will get purged.
|
| -
|
| - RemoveCachedData();
|
| -
|
| - io_thread_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&GCMDriverDesktop::IOWorker::CheckOut,
|
| - base::Unretained(io_worker_.get())));
|
| -}
|
| -
|
| void GCMDriverDesktop::MessageReceived(
|
| const std::string& app_id,
|
| const GCMClient::IncomingMessage& message) {
|
| DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
|
|
| - // Drop the event if signed out.
|
| - if (account_id_.empty())
|
| + // Drop the event if the service has been stopped.
|
| + if (!gcm_started_)
|
| return;
|
|
|
| GetAppHandler(app_id)->OnMessage(app_id, message);
|
| @@ -666,8 +646,8 @@ void GCMDriverDesktop::MessageReceived(
|
| void GCMDriverDesktop::MessagesDeleted(const std::string& app_id) {
|
| DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
|
|
| - // Drop the event if signed out.
|
| - if (account_id_.empty())
|
| + // Drop the event if the service has been stopped.
|
| + if (!gcm_started_)
|
| return;
|
|
|
| GetAppHandler(app_id)->OnMessagesDeleted(app_id);
|
| @@ -678,8 +658,8 @@ void GCMDriverDesktop::MessageSendError(
|
| const GCMClient::SendErrorDetails& send_error_details) {
|
| DCHECK(ui_thread_->RunsTasksOnCurrentThread());
|
|
|
| - // Drop the event if signed out.
|
| - if (account_id_.empty())
|
| + // Drop the event if the service has been stopped.
|
| + if (!gcm_started_)
|
| return;
|
|
|
| GetAppHandler(app_id)->OnSendError(app_id, send_error_details);
|
| @@ -701,7 +681,7 @@ void GCMDriverDesktop::OnConnected(const net::IPEndPoint& ip_endpoint) {
|
| connected_ = true;
|
|
|
| // Drop the event if signed out.
|
| - if (account_id_.empty())
|
| + if (!signed_in_)
|
| return;
|
|
|
| const GCMAppHandlerMap& app_handler_map = app_handlers();
|
| @@ -719,7 +699,7 @@ void GCMDriverDesktop::OnDisconnected() {
|
| connected_ = false;
|
|
|
| // Drop the event if signed out.
|
| - if (account_id_.empty())
|
| + if (!signed_in_)
|
| return;
|
|
|
| const GCMAppHandlerMap& app_handler_map = app_handlers();
|
| @@ -742,11 +722,5 @@ void GCMDriverDesktop::GetGCMStatisticsFinished(
|
| LOG(WARNING) << "request_gcm_statistics_callback_ is NULL.";
|
| }
|
|
|
| -std::string GCMDriverDesktop::SignedInUserName() const {
|
| - if (IsStarted())
|
| - return identity_provider_->GetActiveUsername();
|
| - return std::string();
|
| -}
|
| -
|
| } // namespace gcm
|
|
|
|
|