Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Unified Diff: sync/notifier/chrome_invalidation_client.cc

Issue 10545170: [Sync] Propagate XMPP auth errors to SyncNotifierObservers (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix compile error Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sync/notifier/chrome_invalidation_client.cc
diff --git a/sync/notifier/chrome_invalidation_client.cc b/sync/notifier/chrome_invalidation_client.cc
index 278076f33edca17bf7f595519e1081792656e3d7..c54d683525419e5a88f578f07c52718bcb95951f 100644
--- a/sync/notifier/chrome_invalidation_client.cc
+++ b/sync/notifier/chrome_invalidation_client.cc
@@ -31,15 +31,19 @@ ChromeInvalidationClient::Listener::~Listener() {}
ChromeInvalidationClient::ChromeInvalidationClient(
scoped_ptr<notifier::PushClient> push_client)
- : chrome_system_resources_(push_client.Pass(),
+ : push_client_(push_client.get()),
+ chrome_system_resources_(push_client.Pass(),
ALLOW_THIS_IN_INITIALIZER_LIST(this)),
listener_(NULL),
- ticl_ready_(false) {
+ ticl_sync_notifier_state_(NOTIFICATIONS_OFF),
+ push_client_sync_notifier_state_(NOTIFICATIONS_OFF) {
DCHECK(CalledOnValidThread());
+ push_client_->AddObserver(this);
}
ChromeInvalidationClient::~ChromeInvalidationClient() {
DCHECK(CalledOnValidThread());
+ push_client_->RemoveObserver(this);
Stop();
DCHECK(!listener_);
}
@@ -98,27 +102,11 @@ void ChromeInvalidationClient::UpdateCredentials(
chrome_system_resources_.network()->UpdateCredentials(email, token);
}
-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();
-}
-
void ChromeInvalidationClient::RegisterTypes(syncable::ModelTypeSet types) {
DCHECK(CalledOnValidThread());
registered_types_ = types;
- if (ticl_ready_ && registration_manager_.get()) {
+ if (GetSyncNotifierState() == NOTIFICATIONS_ON &&
+ registration_manager_.get()) {
registration_manager_->SetRegisteredTypes(registered_types_);
}
// TODO(akalin): Clear invalidation versions for unregistered types.
@@ -126,8 +114,8 @@ void ChromeInvalidationClient::RegisterTypes(syncable::ModelTypeSet types) {
void ChromeInvalidationClient::Ready(
invalidation::InvalidationClient* client) {
- ticl_ready_ = true;
- listener_->OnSessionStatusChanged(true);
+ ticl_sync_notifier_state_ = NOTIFICATIONS_ON;
+ EmitStateChange();
registration_manager_->SetRegisteredTypes(registered_types_);
}
@@ -286,9 +274,15 @@ void ChromeInvalidationClient::ReissueRegistrations(
void ChromeInvalidationClient::InformError(
invalidation::InvalidationClient* client,
const invalidation::ErrorInfo& error_info) {
- listener_->OnSessionStatusChanged(false);
- LOG(ERROR) << "Invalidation client encountered an error";
- // TODO(ghc): handle the error.
+ 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_sync_notifier_state_ = CREDENTIALS_REJECTED;
+ } else {
+ ticl_sync_notifier_state_ = NOTIFICATIONS_OFF;
+ }
+ EmitStateChange();
}
void ChromeInvalidationClient::WriteState(const std::string& state) {
@@ -298,4 +292,60 @@ void ChromeInvalidationClient::WriteState(const std::string& state) {
FROM_HERE, &InvalidationStateTracker::SetInvalidationState, state);
}
+void ChromeInvalidationClient::OnPushClientStateChange(
+ notifier::PushClientState push_client_state) {
+ DCHECK(CalledOnValidThread());
+ push_client_sync_notifier_state_ =
+ PushClientStateToSyncNotifierState(push_client_state);
+ EmitStateChange();
+}
+
+SyncNotifierState ChromeInvalidationClient::GetSyncNotifierState() const {
+ DCHECK(CalledOnValidThread());
+ if (ticl_sync_notifier_state_ == CREDENTIALS_REJECTED ||
+ push_client_sync_notifier_state_ == CREDENTIALS_REJECTED) {
+ // If either state is CREDENTIALS_REJECTED, return
+ // CREDENTIALS_REJECTED.
+ return CREDENTIALS_REJECTED;
+ }
+ if (ticl_sync_notifier_state_ == NOTIFICATIONS_ON &&
+ push_client_sync_notifier_state_ == NOTIFICATIONS_ON) {
+ // Emit NOTIFICATIONS_ON only when both states are
+ // NOTIFICATIONS_ON.
+ return NOTIFICATIONS_ON;
+ }
+ // Otherwise return NOTIFICATIONS_OFF.
+ return NOTIFICATIONS_OFF;
+}
+
+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_sync_notifier_state_ = NOTIFICATIONS_OFF;
+ push_client_sync_notifier_state_ = NOTIFICATIONS_OFF;
+}
+
+void ChromeInvalidationClient::EmitStateChange() {
+ DCHECK(CalledOnValidThread());
+ listener_->OnSyncNotifierStateChange(GetSyncNotifierState());
+}
+
+void ChromeInvalidationClient::OnIncomingNotification(
+ const notifier::Notification& notification) {
+ DCHECK(CalledOnValidThread());
+ // Do nothing, since this is already handled by |invalidation_client_|.
+}
+
} // namespace sync_notifier

Powered by Google App Engine
This is Rietveld 408576698