OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "sync/notifier/non_blocking_invalidation_notifier.h" | 5 #include "sync/notifier/non_blocking_invalidation_notifier.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 const WeakHandle<SyncNotifierObserver>& delegate_observer); | 26 const WeakHandle<SyncNotifierObserver>& delegate_observer); |
27 | 27 |
28 // Helpers called on I/O thread. | 28 // Helpers called on I/O thread. |
29 void Initialize( | 29 void Initialize( |
30 const notifier::NotifierOptions& notifier_options, | 30 const notifier::NotifierOptions& notifier_options, |
31 const InvalidationVersionMap& initial_max_invalidation_versions, | 31 const InvalidationVersionMap& initial_max_invalidation_versions, |
32 const std::string& initial_invalidation_state, | 32 const std::string& initial_invalidation_state, |
33 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, | 33 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, |
34 const std::string& client_info); | 34 const std::string& client_info); |
35 void Teardown(); | 35 void Teardown(); |
| 36 void UpdateRegisteredIds(const ObjectIdSet& ids); |
36 void SetUniqueId(const std::string& unique_id); | 37 void SetUniqueId(const std::string& unique_id); |
37 void SetStateDeprecated(const std::string& state); | 38 void SetStateDeprecated(const std::string& state); |
38 void UpdateCredentials(const std::string& email, const std::string& token); | 39 void UpdateCredentials(const std::string& email, const std::string& token); |
39 void UpdateEnabledTypes(ModelTypeSet enabled_types); | |
40 | 40 |
41 // SyncNotifierObserver implementation (all called on I/O thread by | 41 // SyncNotifierObserver implementation (all called on I/O thread by |
42 // InvalidationNotifier). | 42 // InvalidationNotifier). |
43 virtual void OnNotificationsEnabled() OVERRIDE; | 43 virtual void OnNotificationsEnabled() OVERRIDE; |
44 virtual void OnNotificationsDisabled( | 44 virtual void OnNotificationsDisabled( |
45 NotificationsDisabledReason reason) OVERRIDE; | 45 NotificationsDisabledReason reason) OVERRIDE; |
46 virtual void OnIncomingNotification( | 46 virtual void OnIncomingNotification( |
47 const ModelTypePayloadMap& type_payloads, | 47 const ObjectIdPayloadMap& id_payloads, |
48 IncomingNotificationSource source) OVERRIDE; | 48 IncomingNotificationSource source) OVERRIDE; |
49 | 49 |
50 private: | 50 private: |
51 friend class | 51 friend class |
52 base::RefCountedThreadSafe<NonBlockingInvalidationNotifier::Core>; | 52 base::RefCountedThreadSafe<NonBlockingInvalidationNotifier::Core>; |
53 // Called on parent or I/O thread. | 53 // Called on parent or I/O thread. |
54 ~Core(); | 54 ~Core(); |
55 | 55 |
56 // The variables below should be used only on the I/O thread. | 56 // The variables below should be used only on the I/O thread. |
57 const WeakHandle<SyncNotifierObserver> delegate_observer_; | 57 const WeakHandle<SyncNotifierObserver> delegate_observer_; |
(...skipping 24 matching lines...) Expand all Loading... |
82 network_task_runner_ = notifier_options.request_context_getter-> | 82 network_task_runner_ = notifier_options.request_context_getter-> |
83 GetNetworkTaskRunner(); | 83 GetNetworkTaskRunner(); |
84 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 84 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
85 invalidation_notifier_.reset( | 85 invalidation_notifier_.reset( |
86 new InvalidationNotifier( | 86 new InvalidationNotifier( |
87 notifier::PushClient::CreateDefaultOnIOThread(notifier_options), | 87 notifier::PushClient::CreateDefaultOnIOThread(notifier_options), |
88 initial_max_invalidation_versions, | 88 initial_max_invalidation_versions, |
89 initial_invalidation_state, | 89 initial_invalidation_state, |
90 invalidation_state_tracker, | 90 invalidation_state_tracker, |
91 client_info)); | 91 client_info)); |
92 invalidation_notifier_->AddObserver(this); | |
93 } | 92 } |
94 | 93 |
95 | 94 |
96 void NonBlockingInvalidationNotifier::Core::Teardown() { | 95 void NonBlockingInvalidationNotifier::Core::Teardown() { |
97 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 96 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
98 invalidation_notifier_->RemoveObserver(this); | 97 invalidation_notifier_->UpdateRegisteredIds(this, ObjectIdSet()); |
99 invalidation_notifier_.reset(); | 98 invalidation_notifier_.reset(); |
100 network_task_runner_ = NULL; | 99 network_task_runner_ = NULL; |
101 } | 100 } |
102 | 101 |
| 102 void NonBlockingInvalidationNotifier::Core::UpdateRegisteredIds( |
| 103 const ObjectIdSet& ids) { |
| 104 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 105 invalidation_notifier_->UpdateRegisteredIds(this, ids); |
| 106 } |
| 107 |
103 void NonBlockingInvalidationNotifier::Core::SetUniqueId( | 108 void NonBlockingInvalidationNotifier::Core::SetUniqueId( |
104 const std::string& unique_id) { | 109 const std::string& unique_id) { |
105 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 110 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
106 invalidation_notifier_->SetUniqueId(unique_id); | 111 invalidation_notifier_->SetUniqueId(unique_id); |
107 } | 112 } |
108 | 113 |
109 void NonBlockingInvalidationNotifier::Core::SetStateDeprecated( | 114 void NonBlockingInvalidationNotifier::Core::SetStateDeprecated( |
110 const std::string& state) { | 115 const std::string& state) { |
111 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 116 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
112 invalidation_notifier_->SetStateDeprecated(state); | 117 invalidation_notifier_->SetStateDeprecated(state); |
113 } | 118 } |
114 | 119 |
115 void NonBlockingInvalidationNotifier::Core::UpdateCredentials( | 120 void NonBlockingInvalidationNotifier::Core::UpdateCredentials( |
116 const std::string& email, const std::string& token) { | 121 const std::string& email, const std::string& token) { |
117 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 122 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
118 invalidation_notifier_->UpdateCredentials(email, token); | 123 invalidation_notifier_->UpdateCredentials(email, token); |
119 } | 124 } |
120 | 125 |
121 void NonBlockingInvalidationNotifier::Core::UpdateEnabledTypes( | |
122 ModelTypeSet enabled_types) { | |
123 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
124 invalidation_notifier_->UpdateEnabledTypes(enabled_types); | |
125 } | |
126 | |
127 void NonBlockingInvalidationNotifier::Core::OnNotificationsEnabled() { | 126 void NonBlockingInvalidationNotifier::Core::OnNotificationsEnabled() { |
128 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 127 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
129 delegate_observer_.Call(FROM_HERE, | 128 delegate_observer_.Call(FROM_HERE, |
130 &SyncNotifierObserver::OnNotificationsEnabled); | 129 &SyncNotifierObserver::OnNotificationsEnabled); |
131 } | 130 } |
132 | 131 |
133 void NonBlockingInvalidationNotifier::Core::OnNotificationsDisabled( | 132 void NonBlockingInvalidationNotifier::Core::OnNotificationsDisabled( |
134 NotificationsDisabledReason reason) { | 133 NotificationsDisabledReason reason) { |
135 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 134 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
136 delegate_observer_.Call( | 135 delegate_observer_.Call( |
137 FROM_HERE, &SyncNotifierObserver::OnNotificationsDisabled, reason); | 136 FROM_HERE, &SyncNotifierObserver::OnNotificationsDisabled, reason); |
138 } | 137 } |
139 | 138 |
140 void NonBlockingInvalidationNotifier::Core::OnIncomingNotification( | 139 void NonBlockingInvalidationNotifier::Core::OnIncomingNotification( |
141 const ModelTypePayloadMap& type_payloads, | 140 const ObjectIdPayloadMap& id_payloads, IncomingNotificationSource source) { |
142 IncomingNotificationSource source) { | |
143 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 141 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
144 delegate_observer_.Call(FROM_HERE, | 142 delegate_observer_.Call(FROM_HERE, |
145 &SyncNotifierObserver::OnIncomingNotification, | 143 &SyncNotifierObserver::OnIncomingNotification, |
146 type_payloads, | 144 id_payloads, |
147 source); | 145 source); |
148 } | 146 } |
149 | 147 |
150 NonBlockingInvalidationNotifier::NonBlockingInvalidationNotifier( | 148 NonBlockingInvalidationNotifier::NonBlockingInvalidationNotifier( |
151 const notifier::NotifierOptions& notifier_options, | 149 const notifier::NotifierOptions& notifier_options, |
152 const InvalidationVersionMap& initial_max_invalidation_versions, | 150 const InvalidationVersionMap& initial_max_invalidation_versions, |
153 const std::string& initial_invalidation_state, | 151 const std::string& initial_invalidation_state, |
154 const WeakHandle<InvalidationStateTracker>& | 152 const WeakHandle<InvalidationStateTracker>& |
155 invalidation_state_tracker, | 153 invalidation_state_tracker, |
156 const std::string& client_info) | 154 const std::string& client_info) |
(...skipping 21 matching lines...) Expand all Loading... |
178 NonBlockingInvalidationNotifier::~NonBlockingInvalidationNotifier() { | 176 NonBlockingInvalidationNotifier::~NonBlockingInvalidationNotifier() { |
179 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 177 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
180 if (!network_task_runner_->PostTask( | 178 if (!network_task_runner_->PostTask( |
181 FROM_HERE, | 179 FROM_HERE, |
182 base::Bind(&NonBlockingInvalidationNotifier::Core::Teardown, | 180 base::Bind(&NonBlockingInvalidationNotifier::Core::Teardown, |
183 core_.get()))) { | 181 core_.get()))) { |
184 NOTREACHED(); | 182 NOTREACHED(); |
185 } | 183 } |
186 } | 184 } |
187 | 185 |
188 void NonBlockingInvalidationNotifier::AddObserver( | 186 void NonBlockingInvalidationNotifier::UpdateRegisteredIds( |
189 SyncNotifierObserver* observer) { | 187 SyncNotifierObserver* handler, const ObjectIdSet& ids) { |
190 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 188 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
191 observers_.AddObserver(observer); | 189 const ObjectIdSet& all_registered_ids = |
192 } | 190 helper_.UpdateRegisteredIds(handler, ids); |
193 | 191 if (!network_task_runner_->PostTask( |
194 void NonBlockingInvalidationNotifier::RemoveObserver( | 192 FROM_HERE, |
195 SyncNotifierObserver* observer) { | 193 base::Bind( |
196 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 194 &NonBlockingInvalidationNotifier::Core::UpdateRegisteredIds, |
197 observers_.RemoveObserver(observer); | 195 core_.get(), |
| 196 all_registered_ids))) { |
| 197 NOTREACHED(); |
| 198 } |
198 } | 199 } |
199 | 200 |
200 void NonBlockingInvalidationNotifier::SetUniqueId( | 201 void NonBlockingInvalidationNotifier::SetUniqueId( |
201 const std::string& unique_id) { | 202 const std::string& unique_id) { |
202 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 203 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
203 if (!network_task_runner_->PostTask( | 204 if (!network_task_runner_->PostTask( |
204 FROM_HERE, | 205 FROM_HERE, |
205 base::Bind(&NonBlockingInvalidationNotifier::Core::SetUniqueId, | 206 base::Bind(&NonBlockingInvalidationNotifier::Core::SetUniqueId, |
206 core_.get(), unique_id))) { | 207 core_.get(), unique_id))) { |
207 NOTREACHED(); | 208 NOTREACHED(); |
(...skipping 16 matching lines...) Expand all Loading... |
224 const std::string& email, const std::string& token) { | 225 const std::string& email, const std::string& token) { |
225 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 226 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
226 if (!network_task_runner_->PostTask( | 227 if (!network_task_runner_->PostTask( |
227 FROM_HERE, | 228 FROM_HERE, |
228 base::Bind(&NonBlockingInvalidationNotifier::Core::UpdateCredentials, | 229 base::Bind(&NonBlockingInvalidationNotifier::Core::UpdateCredentials, |
229 core_.get(), email, token))) { | 230 core_.get(), email, token))) { |
230 NOTREACHED(); | 231 NOTREACHED(); |
231 } | 232 } |
232 } | 233 } |
233 | 234 |
234 void NonBlockingInvalidationNotifier::UpdateEnabledTypes( | |
235 ModelTypeSet enabled_types) { | |
236 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | |
237 if (!network_task_runner_->PostTask( | |
238 FROM_HERE, | |
239 base::Bind(&NonBlockingInvalidationNotifier::Core::UpdateEnabledTypes, | |
240 core_.get(), enabled_types))) { | |
241 NOTREACHED(); | |
242 } | |
243 } | |
244 | |
245 void NonBlockingInvalidationNotifier::SendNotification( | 235 void NonBlockingInvalidationNotifier::SendNotification( |
246 ModelTypeSet changed_types) { | 236 ModelTypeSet changed_types) { |
247 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 237 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
248 // InvalidationClient doesn't implement SendNotification(), so no | 238 // InvalidationClient doesn't implement SendNotification(), so no |
249 // need to forward on the call. | 239 // need to forward on the call. |
250 } | 240 } |
251 | 241 |
252 void NonBlockingInvalidationNotifier::OnNotificationsEnabled() { | 242 void NonBlockingInvalidationNotifier::OnNotificationsEnabled() { |
253 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 243 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
254 FOR_EACH_OBSERVER(SyncNotifierObserver, observers_, | 244 helper_.EmitOnNotificationsEnabled(); |
255 OnNotificationsEnabled()); | |
256 } | 245 } |
257 | 246 |
258 void NonBlockingInvalidationNotifier::OnNotificationsDisabled( | 247 void NonBlockingInvalidationNotifier::OnNotificationsDisabled( |
259 NotificationsDisabledReason reason) { | 248 NotificationsDisabledReason reason) { |
260 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 249 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
261 FOR_EACH_OBSERVER(SyncNotifierObserver, observers_, | 250 helper_.EmitOnNotificationsDisabled(reason); |
262 OnNotificationsDisabled(reason)); | |
263 } | 251 } |
264 | 252 |
265 void NonBlockingInvalidationNotifier::OnIncomingNotification( | 253 void NonBlockingInvalidationNotifier::OnIncomingNotification( |
266 const ModelTypePayloadMap& type_payloads, | 254 const ObjectIdPayloadMap& id_payloads, |
267 IncomingNotificationSource source) { | 255 IncomingNotificationSource source) { |
268 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 256 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
269 FOR_EACH_OBSERVER(SyncNotifierObserver, observers_, | 257 helper_.DispatchInvalidationsToHandlers(id_payloads, source); |
270 OnIncomingNotification(type_payloads, source)); | |
271 } | 258 } |
272 | 259 |
273 } // namespace syncer | 260 } // namespace syncer |
OLD | NEW |