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 |