| Index: google_apis/gcm/gcm_client_impl.cc
|
| diff --git a/google_apis/gcm/gcm_client_impl.cc b/google_apis/gcm/gcm_client_impl.cc
|
| index 9aaa043285e8774c24159866596b7134fad6274b..18f6176ce077952c8b27aab1795abcbcbc16c998 100644
|
| --- a/google_apis/gcm/gcm_client_impl.cc
|
| +++ b/google_apis/gcm/gcm_client_impl.cc
|
| @@ -11,6 +11,7 @@
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/sequenced_task_runner.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| #include "base/time/default_clock.h"
|
| #include "google_apis/gcm/base/mcs_message.h"
|
| #include "google_apis/gcm/base/mcs_util.h"
|
| @@ -213,6 +214,8 @@ void GCMClientImpl::OnLoadCompleted(scoped_ptr<GCMStore::LoadResult> result) {
|
| device_checkin_info_.android_id = result->device_android_id;
|
| device_checkin_info_.secret = result->device_security_token;
|
| base::Time last_checkin_time = result->last_checkin_time;
|
| + gservices_settings_ = result->gservices_settings;
|
| + gservices_digest_ = result->gservices_digest;
|
| InitializeMCSClient(result.Pass());
|
|
|
| if (device_checkin_info_.IsValid()) {
|
| @@ -285,32 +288,36 @@ void GCMClientImpl::ResetState() {
|
| }
|
|
|
| void GCMClientImpl::StartCheckin() {
|
| + CheckinRequest::RequestInfo request_info(
|
| + device_checkin_info_.android_id,
|
| + device_checkin_info_.secret,
|
| + gservices_digest_,
|
| + account_ids_,
|
| + chrome_build_proto_);
|
| checkin_request_.reset(
|
| - new CheckinRequest(base::Bind(&GCMClientImpl::OnCheckinCompleted,
|
| - weak_ptr_factory_.GetWeakPtr()),
|
| + new CheckinRequest(request_info,
|
| kDefaultBackoffPolicy,
|
| - chrome_build_proto_,
|
| - device_checkin_info_.android_id,
|
| - device_checkin_info_.secret,
|
| - account_ids_,
|
| + base::Bind(&GCMClientImpl::OnCheckinCompleted,
|
| + weak_ptr_factory_.GetWeakPtr()),
|
| url_request_context_getter_));
|
| checkin_request_->Start();
|
| }
|
|
|
| -void GCMClientImpl::OnCheckinCompleted(uint64 android_id,
|
| - uint64 security_token) {
|
| +void GCMClientImpl::OnCheckinCompleted(
|
| + const checkin_proto::AndroidCheckinResponse& checkin_response) {
|
| checkin_request_.reset();
|
|
|
| - CheckinInfo checkin_info;
|
| - checkin_info.android_id = android_id;
|
| - checkin_info.secret = security_token;
|
| -
|
| - if (!checkin_info.IsValid()) {
|
| - // TODO(fgorski): I don't think a retry here will help, we should probalby
|
| + if (!checkin_response.has_android_id() ||
|
| + !checkin_response.has_security_token()) {
|
| + // TODO(fgorski): I don't think a retry here will help, we should probably
|
| // start over. By checking in with (0, 0).
|
| return;
|
| }
|
|
|
| + CheckinInfo checkin_info;
|
| + checkin_info.android_id = checkin_response.android_id();
|
| + checkin_info.secret = checkin_response.security_token();
|
| +
|
| if (state_ == INITIAL_DEVICE_CHECKIN) {
|
| OnFirstTimeDeviceCheckinCompleted(checkin_info);
|
| } else {
|
| @@ -327,6 +334,7 @@ void GCMClientImpl::OnCheckinCompleted(uint64 android_id,
|
| last_checkin_time,
|
| base::Bind(&GCMClientImpl::SetLastCheckinTimeCallback,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| + UpdateGServicesSettings(checkin_response);
|
| SchedulePeriodicCheckin(last_checkin_time);
|
| }
|
| }
|
| @@ -694,4 +702,31 @@ void GCMClientImpl::HandleIncomingSendError(
|
| send_error_details);
|
| }
|
|
|
| +void GCMClientImpl::UpdateGServicesSettings(
|
| + const checkin_proto::AndroidCheckinResponse& checkin_response) {
|
| + if (!checkin_response.has_digest() ||
|
| + checkin_response.digest() == gservices_digest_) {
|
| + return;
|
| + }
|
| +
|
| + gservices_digest_ = checkin_response.digest();
|
| + gservices_settings_.clear();
|
| +
|
| + for (int i = 0; i < checkin_response.setting_size(); ++i) {
|
| + std::string name = checkin_response.setting(i).name();
|
| + std::string value = checkin_response.setting(i).value();
|
| + gservices_settings_[name] = value;
|
| + }
|
| +
|
| + gcm_store_->SetGServicesSettings(
|
| + gservices_settings_,
|
| + gservices_digest_,
|
| + base::Bind(&GCMClientImpl::UpdateGServicesSettingsCallback,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| +}
|
| +
|
| +void GCMClientImpl::UpdateGServicesSettingsCallback(bool success) {
|
| + DCHECK(success);
|
| +}
|
| +
|
| } // namespace gcm
|
|
|