| 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_driver.h" | 5 #include "chrome/browser/services/gcm/gcm_driver.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" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.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 "chrome/common/chrome_version_info.h" | 16 #include "chrome/common/chrome_version_info.h" |
| 17 #include "components/gcm_driver/gcm_app_handler.h" | 17 #include "components/gcm_driver/gcm_app_handler.h" |
| 18 #include "components/gcm_driver/gcm_client_factory.h" | 18 #include "components/gcm_driver/gcm_client_factory.h" |
| 19 #include "components/gcm_driver/system_encryptor.h" | 19 #include "components/gcm_driver/system_encryptor.h" |
| 20 #include "google_apis/gaia/oauth2_token_service.h" | 20 #include "google_apis/gaia/oauth2_token_service.h" |
| 21 #include "google_apis/gcm/protocol/android_checkin.pb.h" | |
| 22 #include "net/url_request/url_request_context_getter.h" | 21 #include "net/url_request/url_request_context_getter.h" |
| 23 | 22 |
| 24 namespace gcm { | 23 namespace gcm { |
| 25 | 24 |
| 26 namespace { | |
| 27 | |
| 28 checkin_proto::ChromeBuildProto_Platform GetPlatform() { | |
| 29 #if defined(OS_WIN) | |
| 30 return checkin_proto::ChromeBuildProto_Platform_PLATFORM_WIN; | |
| 31 #elif defined(OS_MACOSX) | |
| 32 return checkin_proto::ChromeBuildProto_Platform_PLATFORM_MAC; | |
| 33 #elif defined(OS_IOS) | |
| 34 return checkin_proto::ChromeBuildProto_Platform_PLATFORM_IOS; | |
| 35 #elif defined(OS_CHROMEOS) | |
| 36 return checkin_proto::ChromeBuildProto_Platform_PLATFORM_CROS; | |
| 37 #elif defined(OS_LINUX) | |
| 38 return checkin_proto::ChromeBuildProto_Platform_PLATFORM_LINUX; | |
| 39 #else | |
| 40 // For all other platforms, return as LINUX. | |
| 41 return checkin_proto::ChromeBuildProto_Platform_PLATFORM_LINUX; | |
| 42 #endif | |
| 43 } | |
| 44 | |
| 45 std::string GetVersion() { | |
| 46 chrome::VersionInfo version_info; | |
| 47 return version_info.Version(); | |
| 48 } | |
| 49 | |
| 50 checkin_proto::ChromeBuildProto_Channel GetChannel() { | |
| 51 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | |
| 52 switch (channel) { | |
| 53 case chrome::VersionInfo::CHANNEL_UNKNOWN: | |
| 54 return checkin_proto::ChromeBuildProto_Channel_CHANNEL_UNKNOWN; | |
| 55 case chrome::VersionInfo::CHANNEL_CANARY: | |
| 56 return checkin_proto::ChromeBuildProto_Channel_CHANNEL_CANARY; | |
| 57 case chrome::VersionInfo::CHANNEL_DEV: | |
| 58 return checkin_proto::ChromeBuildProto_Channel_CHANNEL_DEV; | |
| 59 case chrome::VersionInfo::CHANNEL_BETA: | |
| 60 return checkin_proto::ChromeBuildProto_Channel_CHANNEL_BETA; | |
| 61 case chrome::VersionInfo::CHANNEL_STABLE: | |
| 62 return checkin_proto::ChromeBuildProto_Channel_CHANNEL_STABLE; | |
| 63 default: | |
| 64 NOTREACHED(); | |
| 65 return checkin_proto::ChromeBuildProto_Channel_CHANNEL_UNKNOWN; | |
| 66 } | |
| 67 } | |
| 68 | |
| 69 } // namespace | |
| 70 | |
| 71 // 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. |
| 72 class GCMDriver::DelayedTaskController { | 26 class GCMDriver::DelayedTaskController { |
| 73 public: | 27 public: |
| 74 DelayedTaskController(); | 28 DelayedTaskController(); |
| 75 ~DelayedTaskController(); | 29 ~DelayedTaskController(); |
| 76 | 30 |
| 77 // Adds a task that will be invoked once we're ready. | 31 // Adds a task that will be invoked once we're ready. |
| 78 void AddTask(const base::Closure& task); | 32 void AddTask(const base::Closure& task); |
| 79 | 33 |
| 80 // Sets ready status. It is ready only when check-in is completed and | 34 // Sets ready status. It is ready only when check-in is completed and |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE; | 99 virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE; |
| 146 virtual void OnMessageSendError( | 100 virtual void OnMessageSendError( |
| 147 const std::string& app_id, | 101 const std::string& app_id, |
| 148 const GCMClient::SendErrorDetails& send_error_details) OVERRIDE; | 102 const GCMClient::SendErrorDetails& send_error_details) OVERRIDE; |
| 149 virtual void OnGCMReady() OVERRIDE; | 103 virtual void OnGCMReady() OVERRIDE; |
| 150 virtual void OnActivityRecorded() OVERRIDE; | 104 virtual void OnActivityRecorded() OVERRIDE; |
| 151 | 105 |
| 152 // Called on IO thread. | 106 // Called on IO thread. |
| 153 void Initialize( | 107 void Initialize( |
| 154 scoped_ptr<GCMClientFactory> gcm_client_factory, | 108 scoped_ptr<GCMClientFactory> gcm_client_factory, |
| 109 const GCMClient::ChromeBuildInfo& chrome_build_info, |
| 155 const base::FilePath& store_path, | 110 const base::FilePath& store_path, |
| 156 const std::vector<std::string>& account_ids, | 111 const std::vector<std::string>& account_ids, |
| 157 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 112 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 158 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); | 113 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); |
| 159 void Start(const base::WeakPtr<GCMDriver>& service); | 114 void Start(const base::WeakPtr<GCMDriver>& service); |
| 160 void Stop(); | 115 void Stop(); |
| 161 void CheckOut(); | 116 void CheckOut(); |
| 162 void Register(const std::string& app_id, | 117 void Register(const std::string& app_id, |
| 163 const std::vector<std::string>& sender_ids); | 118 const std::vector<std::string>& sender_ids); |
| 164 void Unregister(const std::string& app_id); | 119 void Unregister(const std::string& app_id); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 189 io_thread_(io_thread) { | 144 io_thread_(io_thread) { |
| 190 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 145 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 191 } | 146 } |
| 192 | 147 |
| 193 GCMDriver::IOWorker::~IOWorker() { | 148 GCMDriver::IOWorker::~IOWorker() { |
| 194 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 149 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| 195 } | 150 } |
| 196 | 151 |
| 197 void GCMDriver::IOWorker::Initialize( | 152 void GCMDriver::IOWorker::Initialize( |
| 198 scoped_ptr<GCMClientFactory> gcm_client_factory, | 153 scoped_ptr<GCMClientFactory> gcm_client_factory, |
| 154 const GCMClient::ChromeBuildInfo& chrome_build_info, |
| 199 const base::FilePath& store_path, | 155 const base::FilePath& store_path, |
| 200 const std::vector<std::string>& account_ids, | 156 const std::vector<std::string>& account_ids, |
| 201 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 157 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 202 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { | 158 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { |
| 203 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 159 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
| 204 | 160 |
| 205 gcm_client_ = gcm_client_factory->BuildInstance(); | 161 gcm_client_ = gcm_client_factory->BuildInstance(); |
| 206 | 162 |
| 207 checkin_proto::ChromeBuildProto chrome_build_proto; | 163 gcm_client_->Initialize(chrome_build_info, |
| 208 chrome_build_proto.set_platform(GetPlatform()); | |
| 209 chrome_build_proto.set_chrome_version(GetVersion()); | |
| 210 chrome_build_proto.set_channel(GetChannel()); | |
| 211 | |
| 212 gcm_client_->Initialize(chrome_build_proto, | |
| 213 store_path, | 164 store_path, |
| 214 account_ids, | 165 account_ids, |
| 215 blocking_task_runner, | 166 blocking_task_runner, |
| 216 request_context, | 167 request_context, |
| 217 make_scoped_ptr<Encryptor>(new SystemEncryptor), | 168 make_scoped_ptr<Encryptor>(new SystemEncryptor), |
| 218 this); | 169 this); |
| 219 } | 170 } |
| 220 | 171 |
| 221 void GCMDriver::IOWorker::OnRegisterFinished( | 172 void GCMDriver::IOWorker::OnRegisterFinished( |
| 222 const std::string& app_id, | 173 const std::string& app_id, |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 } | 313 } |
| 363 | 314 |
| 364 ui_thread_->PostTask( | 315 ui_thread_->PostTask( |
| 365 FROM_HERE, | 316 FROM_HERE, |
| 366 base::Bind(&GCMDriver::GetGCMStatisticsFinished, service_, stats)); | 317 base::Bind(&GCMDriver::GetGCMStatisticsFinished, service_, stats)); |
| 367 } | 318 } |
| 368 | 319 |
| 369 GCMDriver::GCMDriver( | 320 GCMDriver::GCMDriver( |
| 370 scoped_ptr<GCMClientFactory> gcm_client_factory, | 321 scoped_ptr<GCMClientFactory> gcm_client_factory, |
| 371 scoped_ptr<IdentityProvider> identity_provider, | 322 scoped_ptr<IdentityProvider> identity_provider, |
| 323 const GCMClient::ChromeBuildInfo& chrome_build_info, |
| 372 const base::FilePath& store_path, | 324 const base::FilePath& store_path, |
| 373 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 325 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 374 const scoped_refptr<base::SequencedTaskRunner>& ui_thread, | 326 const scoped_refptr<base::SequencedTaskRunner>& ui_thread, |
| 375 const scoped_refptr<base::SequencedTaskRunner>& io_thread, | 327 const scoped_refptr<base::SequencedTaskRunner>& io_thread, |
| 376 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) | 328 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) |
| 377 : gcm_enabled_(true), | 329 : gcm_enabled_(true), |
| 378 gcm_client_ready_(false), | 330 gcm_client_ready_(false), |
| 379 identity_provider_(identity_provider.Pass()), | 331 identity_provider_(identity_provider.Pass()), |
| 380 ui_thread_(ui_thread), | 332 ui_thread_(ui_thread), |
| 381 io_thread_(io_thread), | 333 io_thread_(io_thread), |
| 382 weak_ptr_factory_(this) { | 334 weak_ptr_factory_(this) { |
| 383 // Get the list of available accounts. | 335 // Get the list of available accounts. |
| 384 std::vector<std::string> account_ids; | 336 std::vector<std::string> account_ids; |
| 385 #if !defined(OS_ANDROID) | 337 #if !defined(OS_ANDROID) |
| 386 account_ids = identity_provider_->GetTokenService()->GetAccounts(); | 338 account_ids = identity_provider_->GetTokenService()->GetAccounts(); |
| 387 #endif | 339 #endif |
| 388 | 340 |
| 389 // Create and initialize the GCMClient. Note that this does not initiate the | 341 // Create and initialize the GCMClient. Note that this does not initiate the |
| 390 // GCM check-in. | 342 // GCM check-in. |
| 391 io_worker_.reset(new IOWorker(ui_thread, io_thread)); | 343 io_worker_.reset(new IOWorker(ui_thread, io_thread)); |
| 392 io_thread_->PostTask( | 344 io_thread_->PostTask( |
| 393 FROM_HERE, | 345 FROM_HERE, |
| 394 base::Bind(&GCMDriver::IOWorker::Initialize, | 346 base::Bind(&GCMDriver::IOWorker::Initialize, |
| 395 base::Unretained(io_worker_.get()), | 347 base::Unretained(io_worker_.get()), |
| 396 base::Passed(&gcm_client_factory), | 348 base::Passed(&gcm_client_factory), |
| 349 chrome_build_info, |
| 397 store_path, | 350 store_path, |
| 398 account_ids, | 351 account_ids, |
| 399 request_context, | 352 request_context, |
| 400 blocking_task_runner)); | 353 blocking_task_runner)); |
| 401 | 354 |
| 402 identity_provider_->AddObserver(this); | 355 identity_provider_->AddObserver(this); |
| 403 } | 356 } |
| 404 | 357 |
| 405 GCMDriver::GCMDriver() | 358 GCMDriver::GCMDriver() |
| 406 : gcm_enabled_(true), | 359 : gcm_enabled_(true), |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; | 804 LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; |
| 852 } | 805 } |
| 853 | 806 |
| 854 std::string GCMDriver::SignedInUserName() const { | 807 std::string GCMDriver::SignedInUserName() const { |
| 855 if (IsStarted()) | 808 if (IsStarted()) |
| 856 return identity_provider_->GetActiveUsername(); | 809 return identity_provider_->GetActiveUsername(); |
| 857 return std::string(); | 810 return std::string(); |
| 858 } | 811 } |
| 859 | 812 |
| 860 } // namespace gcm | 813 } // namespace gcm |
| OLD | NEW |