| Index: sync/notifier/chrome_invalidation_client.cc
|
| diff --git a/sync/notifier/chrome_invalidation_client.cc b/sync/notifier/chrome_invalidation_client.cc
|
| deleted file mode 100644
|
| index 938f7e679bb922c711acc1b4957eb4ca14a5182f..0000000000000000000000000000000000000000
|
| --- a/sync/notifier/chrome_invalidation_client.cc
|
| +++ /dev/null
|
| @@ -1,369 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "sync/notifier/chrome_invalidation_client.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/logging.h"
|
| -#include "base/tracked_objects.h"
|
| -#include "google/cacheinvalidation/include/invalidation-client.h"
|
| -#include "google/cacheinvalidation/include/types.h"
|
| -#include "google/cacheinvalidation/types.pb.h"
|
| -#include "jingle/notifier/listener/push_client.h"
|
| -#include "sync/notifier/invalidation_util.h"
|
| -#include "sync/notifier/registration_manager.h"
|
| -
|
| -namespace {
|
| -
|
| -const char kApplicationName[] = "chrome-sync";
|
| -
|
| -} // namespace
|
| -
|
| -namespace syncer {
|
| -
|
| -ChromeInvalidationClient::Listener::~Listener() {}
|
| -
|
| -ChromeInvalidationClient::ChromeInvalidationClient(
|
| - scoped_ptr<notifier::PushClient> push_client)
|
| - : push_client_(push_client.get()),
|
| - chrome_system_resources_(push_client.Pass(),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(this)),
|
| - listener_(NULL),
|
| - ticl_state_(DEFAULT_NOTIFICATION_ERROR),
|
| - push_client_state_(DEFAULT_NOTIFICATION_ERROR) {
|
| - DCHECK(CalledOnValidThread());
|
| - push_client_->AddObserver(this);
|
| -}
|
| -
|
| -ChromeInvalidationClient::~ChromeInvalidationClient() {
|
| - DCHECK(CalledOnValidThread());
|
| - push_client_->RemoveObserver(this);
|
| - Stop();
|
| - DCHECK(!listener_);
|
| -}
|
| -
|
| -void ChromeInvalidationClient::Start(
|
| - const CreateInvalidationClientCallback&
|
| - create_invalidation_client_callback,
|
| - const std::string& client_id, const std::string& client_info,
|
| - const std::string& state,
|
| - const InvalidationVersionMap& initial_max_invalidation_versions,
|
| - const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker,
|
| - Listener* listener) {
|
| - DCHECK(CalledOnValidThread());
|
| - Stop();
|
| -
|
| - chrome_system_resources_.set_platform(client_info);
|
| - chrome_system_resources_.Start();
|
| -
|
| - // The Storage resource is implemented as a write-through cache. We populate
|
| - // it with the initial state on startup, so subsequent writes go to disk and
|
| - // update the in-memory cache, while reads just return the cached state.
|
| - chrome_system_resources_.storage()->SetInitialState(state);
|
| -
|
| - max_invalidation_versions_ = initial_max_invalidation_versions;
|
| - if (max_invalidation_versions_.empty()) {
|
| - DVLOG(2) << "No initial max invalidation versions for any id";
|
| - } else {
|
| - for (InvalidationVersionMap::const_iterator it =
|
| - max_invalidation_versions_.begin();
|
| - it != max_invalidation_versions_.end(); ++it) {
|
| - DVLOG(2) << "Initial max invalidation version for "
|
| - << ObjectIdToString(it->first) << " is "
|
| - << it->second;
|
| - }
|
| - }
|
| - invalidation_state_tracker_ = invalidation_state_tracker;
|
| - DCHECK(invalidation_state_tracker_.IsInitialized());
|
| -
|
| - DCHECK(!listener_);
|
| - DCHECK(listener);
|
| - listener_ = listener;
|
| -
|
| - int client_type = ipc::invalidation::ClientType::CHROME_SYNC;
|
| - invalidation_client_.reset(
|
| - create_invalidation_client_callback.Run(
|
| - &chrome_system_resources_, client_type, client_id,
|
| - kApplicationName, this));
|
| - invalidation_client_->Start();
|
| -
|
| - registration_manager_.reset(
|
| - new RegistrationManager(invalidation_client_.get()));
|
| -}
|
| -
|
| -void ChromeInvalidationClient::UpdateCredentials(
|
| - const std::string& email, const std::string& token) {
|
| - DCHECK(CalledOnValidThread());
|
| - chrome_system_resources_.network()->UpdateCredentials(email, token);
|
| -}
|
| -
|
| -void ChromeInvalidationClient::UpdateRegisteredIds(const ObjectIdSet& ids) {
|
| - DCHECK(CalledOnValidThread());
|
| - registered_ids_ = ids;
|
| - // |ticl_state_| can go to NO_NOTIFICATION_ERROR even without a
|
| - // working XMPP connection (as observed by us), so check it instead
|
| - // of GetState() (see http://crbug.com/139424).
|
| - if (ticl_state_ == NO_NOTIFICATION_ERROR && registration_manager_.get()) {
|
| - DoRegistrationUpdate();
|
| - }
|
| -}
|
| -
|
| -void ChromeInvalidationClient::Ready(
|
| - invalidation::InvalidationClient* client) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(client, invalidation_client_.get());
|
| - ticl_state_ = NO_NOTIFICATION_ERROR;
|
| - EmitStateChange();
|
| - DoRegistrationUpdate();
|
| -}
|
| -
|
| -void ChromeInvalidationClient::Invalidate(
|
| - invalidation::InvalidationClient* client,
|
| - const invalidation::Invalidation& invalidation,
|
| - const invalidation::AckHandle& ack_handle) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(client, invalidation_client_.get());
|
| - DVLOG(1) << "Invalidate: " << InvalidationToString(invalidation);
|
| -
|
| - const invalidation::ObjectId& id = invalidation.object_id();
|
| -
|
| - // The invalidation API spec allows for the possibility of redundant
|
| - // invalidations, so keep track of the max versions and drop
|
| - // invalidations with old versions.
|
| - //
|
| - // TODO(akalin): Now that we keep track of registered ids, we
|
| - // should drop invalidations for unregistered ids. We may also
|
| - // have to filter it at a higher level, as invalidations for
|
| - // newly-unregistered ids may already be in flight.
|
| - InvalidationVersionMap::const_iterator it =
|
| - max_invalidation_versions_.find(id);
|
| - if ((it != max_invalidation_versions_.end()) &&
|
| - (invalidation.version() <= it->second)) {
|
| - // Drop redundant invalidations.
|
| - client->Acknowledge(ack_handle);
|
| - return;
|
| - }
|
| - DVLOG(2) << "Setting max invalidation version for " << ObjectIdToString(id)
|
| - << " to " << invalidation.version();
|
| - max_invalidation_versions_[id] = invalidation.version();
|
| - invalidation_state_tracker_.Call(
|
| - FROM_HERE,
|
| - &InvalidationStateTracker::SetMaxVersion,
|
| - id, invalidation.version());
|
| -
|
| - std::string payload;
|
| - // payload() CHECK()'s has_payload(), so we must check it ourselves first.
|
| - if (invalidation.has_payload())
|
| - payload = invalidation.payload();
|
| -
|
| - ObjectIdStateMap id_state_map;
|
| - id_state_map[id].payload = payload;
|
| - EmitInvalidation(id_state_map);
|
| - // TODO(akalin): We should really acknowledge only after we get the
|
| - // updates from the sync server. (see http://crbug.com/78462).
|
| - client->Acknowledge(ack_handle);
|
| -}
|
| -
|
| -void ChromeInvalidationClient::InvalidateUnknownVersion(
|
| - invalidation::InvalidationClient* client,
|
| - const invalidation::ObjectId& object_id,
|
| - const invalidation::AckHandle& ack_handle) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(client, invalidation_client_.get());
|
| - DVLOG(1) << "InvalidateUnknownVersion";
|
| -
|
| - ObjectIdStateMap id_state_map;
|
| - id_state_map[object_id].payload = std::string();
|
| - EmitInvalidation(id_state_map);
|
| - // TODO(akalin): We should really acknowledge only after we get the
|
| - // updates from the sync server. (see http://crbug.com/78462).
|
| - client->Acknowledge(ack_handle);
|
| -}
|
| -
|
| -// This should behave as if we got an invalidation with version
|
| -// UNKNOWN_OBJECT_VERSION for all known data types.
|
| -void ChromeInvalidationClient::InvalidateAll(
|
| - invalidation::InvalidationClient* client,
|
| - const invalidation::AckHandle& ack_handle) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(client, invalidation_client_.get());
|
| - DVLOG(1) << "InvalidateAll";
|
| -
|
| - ObjectIdStateMap id_state_map;
|
| - for (ObjectIdSet::const_iterator it = registered_ids_.begin();
|
| - it != registered_ids_.end(); ++it) {
|
| - id_state_map[*it].payload = std::string();
|
| - }
|
| - EmitInvalidation(id_state_map);
|
| - // TODO(akalin): We should really acknowledge only after we get the
|
| - // updates from the sync server. (see http://crbug.com/76482).
|
| - client->Acknowledge(ack_handle);
|
| -}
|
| -
|
| -void ChromeInvalidationClient::EmitInvalidation(
|
| - const ObjectIdStateMap& id_state_map) {
|
| - DCHECK(CalledOnValidThread());
|
| - listener_->OnInvalidate(id_state_map);
|
| -}
|
| -
|
| -void ChromeInvalidationClient::InformRegistrationStatus(
|
| - invalidation::InvalidationClient* client,
|
| - const invalidation::ObjectId& object_id,
|
| - InvalidationListener::RegistrationState new_state) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(client, invalidation_client_.get());
|
| - DVLOG(1) << "InformRegistrationStatus: "
|
| - << ObjectIdToString(object_id) << " " << new_state;
|
| -
|
| - if (new_state != InvalidationListener::REGISTERED) {
|
| - // Let |registration_manager_| handle the registration backoff policy.
|
| - registration_manager_->MarkRegistrationLost(object_id);
|
| - }
|
| -}
|
| -
|
| -void ChromeInvalidationClient::InformRegistrationFailure(
|
| - invalidation::InvalidationClient* client,
|
| - const invalidation::ObjectId& object_id,
|
| - bool is_transient,
|
| - const std::string& error_message) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(client, invalidation_client_.get());
|
| - DVLOG(1) << "InformRegistrationFailure: "
|
| - << ObjectIdToString(object_id)
|
| - << "is_transient=" << is_transient
|
| - << ", message=" << error_message;
|
| -
|
| - if (is_transient) {
|
| - // We don't care about |unknown_hint|; we let
|
| - // |registration_manager_| handle the registration backoff policy.
|
| - registration_manager_->MarkRegistrationLost(object_id);
|
| - } else {
|
| - // Non-transient failures require an action to resolve. This could happen
|
| - // because:
|
| - // - the server doesn't yet recognize the data type, which could happen for
|
| - // brand-new data types.
|
| - // - the user has changed his password and hasn't updated it yet locally.
|
| - // Either way, block future registration attempts for |object_id|. However,
|
| - // we don't forget any saved invalidation state since we may use it once the
|
| - // error is addressed.
|
| - registration_manager_->DisableId(object_id);
|
| - }
|
| -}
|
| -
|
| -void ChromeInvalidationClient::ReissueRegistrations(
|
| - invalidation::InvalidationClient* client,
|
| - const std::string& prefix,
|
| - int prefix_length) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(client, invalidation_client_.get());
|
| - DVLOG(1) << "AllRegistrationsLost";
|
| - registration_manager_->MarkAllRegistrationsLost();
|
| -}
|
| -
|
| -void ChromeInvalidationClient::InformError(
|
| - invalidation::InvalidationClient* client,
|
| - const invalidation::ErrorInfo& error_info) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK_EQ(client, invalidation_client_.get());
|
| - LOG(ERROR) << "Ticl error " << error_info.error_reason() << ": "
|
| - << error_info.error_message()
|
| - << " (transient = " << error_info.is_transient() << ")";
|
| - if (error_info.error_reason() == invalidation::ErrorReason::AUTH_FAILURE) {
|
| - ticl_state_ = NOTIFICATION_CREDENTIALS_REJECTED;
|
| - } else {
|
| - ticl_state_ = TRANSIENT_NOTIFICATION_ERROR;
|
| - }
|
| - EmitStateChange();
|
| -}
|
| -
|
| -void ChromeInvalidationClient::WriteState(const std::string& state) {
|
| - DCHECK(CalledOnValidThread());
|
| - DVLOG(1) << "WriteState";
|
| - invalidation_state_tracker_.Call(
|
| - FROM_HERE, &InvalidationStateTracker::SetInvalidationState, state);
|
| -}
|
| -
|
| -void ChromeInvalidationClient::DoRegistrationUpdate() {
|
| - DCHECK(CalledOnValidThread());
|
| - const ObjectIdSet& unregistered_ids =
|
| - registration_manager_->UpdateRegisteredIds(registered_ids_);
|
| - invalidation_state_tracker_.Call(
|
| - FROM_HERE, &InvalidationStateTracker::Forget, unregistered_ids);
|
| -}
|
| -
|
| -void ChromeInvalidationClient::StopForTest() {
|
| - DCHECK(CalledOnValidThread());
|
| - Stop();
|
| -}
|
| -
|
| -void ChromeInvalidationClient::Stop() {
|
| - DCHECK(CalledOnValidThread());
|
| - if (!invalidation_client_.get()) {
|
| - return;
|
| - }
|
| -
|
| - registration_manager_.reset();
|
| - chrome_system_resources_.Stop();
|
| - invalidation_client_->Stop();
|
| -
|
| - invalidation_client_.reset();
|
| - listener_ = NULL;
|
| -
|
| - invalidation_state_tracker_.Reset();
|
| - max_invalidation_versions_.clear();
|
| - ticl_state_ = DEFAULT_NOTIFICATION_ERROR;
|
| - push_client_state_ = DEFAULT_NOTIFICATION_ERROR;
|
| -}
|
| -
|
| -NotificationsDisabledReason ChromeInvalidationClient::GetState() const {
|
| - DCHECK(CalledOnValidThread());
|
| - if (ticl_state_ == NOTIFICATION_CREDENTIALS_REJECTED ||
|
| - push_client_state_ == NOTIFICATION_CREDENTIALS_REJECTED) {
|
| - // If either the ticl or the push client rejected our credentials,
|
| - // return NOTIFICATION_CREDENTIALS_REJECTED.
|
| - return NOTIFICATION_CREDENTIALS_REJECTED;
|
| - }
|
| - if (ticl_state_ == NO_NOTIFICATION_ERROR &&
|
| - push_client_state_ == NO_NOTIFICATION_ERROR) {
|
| - // If the ticl is ready and the push client notifications are
|
| - // enabled, return NO_NOTIFICATION_ERROR.
|
| - return NO_NOTIFICATION_ERROR;
|
| - }
|
| - // Otherwise, we have a transient error.
|
| - return TRANSIENT_NOTIFICATION_ERROR;
|
| -}
|
| -
|
| -void ChromeInvalidationClient::EmitStateChange() {
|
| - DCHECK(CalledOnValidThread());
|
| - if (GetState() == NO_NOTIFICATION_ERROR) {
|
| - listener_->OnNotificationsEnabled();
|
| - } else {
|
| - listener_->OnNotificationsDisabled(GetState());
|
| - }
|
| -}
|
| -
|
| -void ChromeInvalidationClient::OnNotificationsEnabled() {
|
| - DCHECK(CalledOnValidThread());
|
| - push_client_state_ = NO_NOTIFICATION_ERROR;
|
| - EmitStateChange();
|
| -}
|
| -
|
| -void ChromeInvalidationClient::OnNotificationsDisabled(
|
| - notifier::NotificationsDisabledReason reason) {
|
| - DCHECK(CalledOnValidThread());
|
| - push_client_state_ = FromNotifierReason(reason);
|
| - EmitStateChange();
|
| -}
|
| -
|
| -void ChromeInvalidationClient::OnIncomingNotification(
|
| - const notifier::Notification& notification) {
|
| - DCHECK(CalledOnValidThread());
|
| - // Do nothing, since this is already handled by |invalidation_client_|.
|
| -}
|
| -
|
| -} // namespace syncer
|
|
|