summaryrefslogtreecommitdiffstats
path: root/components/gcm_driver/gcm_driver_desktop.cc
diff options
context:
space:
mode:
Diffstat (limited to 'components/gcm_driver/gcm_driver_desktop.cc')
-rw-r--r--components/gcm_driver/gcm_driver_desktop.cc21
1 files changed, 20 insertions, 1 deletions
diff --git a/components/gcm_driver/gcm_driver_desktop.cc b/components/gcm_driver/gcm_driver_desktop.cc
index 8d35c2c..82ca4b3 100644
--- a/components/gcm_driver/gcm_driver_desktop.cc
+++ b/components/gcm_driver/gcm_driver_desktop.cc
@@ -14,6 +14,7 @@
#include "base/sequenced_task_runner.h"
#include "base/threading/sequenced_worker_pool.h"
#include "components/gcm_driver/gcm_app_handler.h"
+#include "components/gcm_driver/gcm_channel_status_syncer.h"
#include "components/gcm_driver/gcm_client_factory.h"
#include "components/gcm_driver/gcm_delayed_task_controller.h"
#include "components/gcm_driver/system_encryptor.h"
@@ -329,18 +330,23 @@ void GCMDriverDesktop::IOWorker::RemoveAccountMapping(
GCMDriverDesktop::GCMDriverDesktop(
scoped_ptr<GCMClientFactory> gcm_client_factory,
const GCMClient::ChromeBuildInfo& chrome_build_info,
+ PrefService* prefs,
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)
- : signed_in_(false),
+ : gcm_channel_status_syncer_(
+ new GCMChannelStatusSyncer(this, prefs, request_context)),
+ signed_in_(false),
gcm_started_(false),
gcm_enabled_(true),
connected_(false),
ui_thread_(ui_thread),
io_thread_(io_thread),
weak_ptr_factory_(this) {
+ gcm_enabled_ = gcm_channel_status_syncer_->gcm_enabled();
+
// Create and initialize the GCMClient. Note that this does not initiate the
// GCM check-in.
io_worker_.reset(new IOWorker(ui_thread, io_thread));
@@ -361,6 +367,12 @@ GCMDriverDesktop::~GCMDriverDesktop() {
void GCMDriverDesktop::Shutdown() {
DCHECK(ui_thread_->RunsTasksOnCurrentThread());
GCMDriver::Shutdown();
+
+ // Dispose the syncer in order to release the reference to
+ // URLRequestContextGetter that needs to be done before IOThread gets
+ // deleted.
+ gcm_channel_status_syncer_.reset();
+
io_thread_->DeleteSoon(FROM_HERE, io_worker_.release());
}
@@ -442,6 +454,8 @@ void GCMDriverDesktop::Stop() {
if (!gcm_started_)
return;
+ gcm_channel_status_syncer_->Stop();
+
RemoveCachedData();
io_thread_->PostTask(
@@ -627,6 +641,11 @@ GCMClient::Result GCMDriverDesktop::EnsureStarted() {
DCHECK(!delayed_task_controller_);
delayed_task_controller_.reset(new GCMDelayedTaskController);
+ // Polling for channel status is only needed when GCM is supported for all
+ // users.
+ if (GCMDriver::IsAllowedForAllUsers())
+ gcm_channel_status_syncer_->EnsureStarted();
+
// Note that we need to pass weak pointer again since the existing weak
// pointer in IOWorker might have been invalidated when check-out occurs.
io_thread_->PostTask(