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/p2p_invalidator.h" | 5 #include "sync/notifier/p2p_invalidator.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 } | 151 } |
152 int source_num = 0; | 152 int source_num = 0; |
153 if (!data_dict->GetInteger(kSourceKey, &source_num)) { | 153 if (!data_dict->GetInteger(kSourceKey, &source_num)) { |
154 LOG(WARNING) << "Could not find integer value for " << kSourceKey; | 154 LOG(WARNING) << "Could not find integer value for " << kSourceKey; |
155 } | 155 } |
156 source_ = P2PNotificationSourceFromInteger(source_num); | 156 source_ = P2PNotificationSourceFromInteger(source_num); |
157 return true; | 157 return true; |
158 } | 158 } |
159 | 159 |
160 P2PInvalidator::P2PInvalidator(scoped_ptr<notifier::PushClient> push_client, | 160 P2PInvalidator::P2PInvalidator(scoped_ptr<notifier::PushClient> push_client, |
| 161 const std::string& invalidator_client_id, |
161 P2PNotificationTarget send_notification_target) | 162 P2PNotificationTarget send_notification_target) |
162 : push_client_(push_client.Pass()), | 163 : push_client_(push_client.Pass()), |
| 164 invalidator_client_id_(invalidator_client_id), |
163 logged_in_(false), | 165 logged_in_(false), |
164 notifications_enabled_(false), | 166 notifications_enabled_(false), |
165 send_notification_target_(send_notification_target) { | 167 send_notification_target_(send_notification_target) { |
166 DCHECK(send_notification_target_ == NOTIFY_OTHERS || | 168 DCHECK(send_notification_target_ == NOTIFY_OTHERS || |
167 send_notification_target_ == NOTIFY_ALL); | 169 send_notification_target_ == NOTIFY_ALL); |
168 push_client_->AddObserver(this); | 170 push_client_->AddObserver(this); |
169 } | 171 } |
170 | 172 |
171 P2PInvalidator::~P2PInvalidator() { | 173 P2PInvalidator::~P2PInvalidator() { |
172 DCHECK(thread_checker_.CalledOnValidThread()); | 174 DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 10 matching lines...) Expand all Loading... |
183 // TODO(akalin): Handle arbitrary object IDs (http://crbug.com/140411). | 185 // TODO(akalin): Handle arbitrary object IDs (http://crbug.com/140411). |
184 DCHECK(thread_checker_.CalledOnValidThread()); | 186 DCHECK(thread_checker_.CalledOnValidThread()); |
185 ObjectIdSet new_ids; | 187 ObjectIdSet new_ids; |
186 const ObjectIdSet& old_ids = registrar_.GetRegisteredIds(handler); | 188 const ObjectIdSet& old_ids = registrar_.GetRegisteredIds(handler); |
187 std::set_difference(ids.begin(), ids.end(), | 189 std::set_difference(ids.begin(), ids.end(), |
188 old_ids.begin(), old_ids.end(), | 190 old_ids.begin(), old_ids.end(), |
189 std::inserter(new_ids, new_ids.end()), | 191 std::inserter(new_ids, new_ids.end()), |
190 ObjectIdLessThan()); | 192 ObjectIdLessThan()); |
191 registrar_.UpdateRegisteredIds(handler, ids); | 193 registrar_.UpdateRegisteredIds(handler, ids); |
192 const P2PNotificationData notification_data( | 194 const P2PNotificationData notification_data( |
193 unique_id_, NOTIFY_SELF, ObjectIdSetToInvalidationMap(new_ids, ""), | 195 invalidator_client_id_, NOTIFY_SELF, |
194 REMOTE_INVALIDATION); | 196 ObjectIdSetToInvalidationMap(new_ids, ""), REMOTE_INVALIDATION); |
195 SendNotificationData(notification_data); | 197 SendNotificationData(notification_data); |
196 } | 198 } |
197 | 199 |
198 void P2PInvalidator::UnregisterHandler(InvalidationHandler* handler) { | 200 void P2PInvalidator::UnregisterHandler(InvalidationHandler* handler) { |
199 DCHECK(thread_checker_.CalledOnValidThread()); | 201 DCHECK(thread_checker_.CalledOnValidThread()); |
200 registrar_.UnregisterHandler(handler); | 202 registrar_.UnregisterHandler(handler); |
201 } | 203 } |
202 | 204 |
203 InvalidatorState P2PInvalidator::GetInvalidatorState() const { | 205 InvalidatorState P2PInvalidator::GetInvalidatorState() const { |
204 DCHECK(thread_checker_.CalledOnValidThread()); | 206 DCHECK(thread_checker_.CalledOnValidThread()); |
205 return registrar_.GetInvalidatorState(); | 207 return registrar_.GetInvalidatorState(); |
206 } | 208 } |
207 | 209 |
208 void P2PInvalidator::SetUniqueId(const std::string& unique_id) { | |
209 DCHECK(thread_checker_.CalledOnValidThread()); | |
210 unique_id_ = unique_id; | |
211 } | |
212 | |
213 void P2PInvalidator::UpdateCredentials( | 210 void P2PInvalidator::UpdateCredentials( |
214 const std::string& email, const std::string& token) { | 211 const std::string& email, const std::string& token) { |
215 DCHECK(thread_checker_.CalledOnValidThread()); | 212 DCHECK(thread_checker_.CalledOnValidThread()); |
216 notifier::Subscription subscription; | 213 notifier::Subscription subscription; |
217 subscription.channel = kSyncP2PNotificationChannel; | 214 subscription.channel = kSyncP2PNotificationChannel; |
218 // There may be some subtle issues around case sensitivity of the | 215 // There may be some subtle issues around case sensitivity of the |
219 // from field, but it doesn't matter too much since this is only | 216 // from field, but it doesn't matter too much since this is only |
220 // used in p2p mode (which is only used in testing). | 217 // used in p2p mode (which is only used in testing). |
221 subscription.from = email; | 218 subscription.from = email; |
222 push_client_->UpdateSubscriptions( | 219 push_client_->UpdateSubscriptions( |
223 notifier::SubscriptionList(1, subscription)); | 220 notifier::SubscriptionList(1, subscription)); |
224 // If already logged in, the new credentials will take effect on the | 221 // If already logged in, the new credentials will take effect on the |
225 // next reconnection. | 222 // next reconnection. |
226 push_client_->UpdateCredentials(email, token); | 223 push_client_->UpdateCredentials(email, token); |
227 logged_in_ = true; | 224 logged_in_ = true; |
228 } | 225 } |
229 | 226 |
230 void P2PInvalidator::SendInvalidation( | 227 void P2PInvalidator::SendInvalidation( |
231 const ObjectIdInvalidationMap& invalidation_map) { | 228 const ObjectIdInvalidationMap& invalidation_map) { |
232 DCHECK(thread_checker_.CalledOnValidThread()); | 229 DCHECK(thread_checker_.CalledOnValidThread()); |
233 const P2PNotificationData notification_data( | 230 const P2PNotificationData notification_data( |
234 unique_id_, send_notification_target_, invalidation_map, | 231 invalidator_client_id_, send_notification_target_, invalidation_map, |
235 REMOTE_INVALIDATION); | 232 REMOTE_INVALIDATION); |
236 SendNotificationData(notification_data); | 233 SendNotificationData(notification_data); |
237 } | 234 } |
238 | 235 |
239 void P2PInvalidator::OnNotificationsEnabled() { | 236 void P2PInvalidator::OnNotificationsEnabled() { |
240 DCHECK(thread_checker_.CalledOnValidThread()); | 237 DCHECK(thread_checker_.CalledOnValidThread()); |
241 bool just_turned_on = (notifications_enabled_ == false); | 238 bool just_turned_on = (notifications_enabled_ == false); |
242 notifications_enabled_ = true; | 239 notifications_enabled_ = true; |
243 registrar_.UpdateInvalidatorState(INVALIDATIONS_ENABLED); | 240 registrar_.UpdateInvalidatorState(INVALIDATIONS_ENABLED); |
244 if (just_turned_on) { | 241 if (just_turned_on) { |
245 const P2PNotificationData notification_data( | 242 const P2PNotificationData notification_data( |
246 unique_id_, NOTIFY_SELF, | 243 invalidator_client_id_, NOTIFY_SELF, |
247 ObjectIdSetToInvalidationMap(registrar_.GetAllRegisteredIds(), ""), | 244 ObjectIdSetToInvalidationMap(registrar_.GetAllRegisteredIds(), ""), |
248 REMOTE_INVALIDATION); | 245 REMOTE_INVALIDATION); |
249 SendNotificationData(notification_data); | 246 SendNotificationData(notification_data); |
250 } | 247 } |
251 } | 248 } |
252 | 249 |
253 void P2PInvalidator::OnNotificationsDisabled( | 250 void P2PInvalidator::OnNotificationsDisabled( |
254 notifier::NotificationsDisabledReason reason) { | 251 notifier::NotificationsDisabledReason reason) { |
255 DCHECK(thread_checker_.CalledOnValidThread()); | 252 DCHECK(thread_checker_.CalledOnValidThread()); |
256 registrar_.UpdateInvalidatorState(FromNotifierReason(reason)); | 253 registrar_.UpdateInvalidatorState(FromNotifierReason(reason)); |
(...skipping 14 matching lines...) Expand all Loading... |
271 if (notification.channel != kSyncP2PNotificationChannel) { | 268 if (notification.channel != kSyncP2PNotificationChannel) { |
272 LOG(WARNING) << "Notification from unexpected source " | 269 LOG(WARNING) << "Notification from unexpected source " |
273 << notification.channel; | 270 << notification.channel; |
274 } | 271 } |
275 P2PNotificationData notification_data; | 272 P2PNotificationData notification_data; |
276 if (!notification_data.ResetFromString(notification.data)) { | 273 if (!notification_data.ResetFromString(notification.data)) { |
277 LOG(WARNING) << "Could not parse notification data from " | 274 LOG(WARNING) << "Could not parse notification data from " |
278 << notification.data; | 275 << notification.data; |
279 notification_data = | 276 notification_data = |
280 P2PNotificationData( | 277 P2PNotificationData( |
281 unique_id_, NOTIFY_ALL, | 278 invalidator_client_id_, NOTIFY_ALL, |
282 ObjectIdSetToInvalidationMap(registrar_.GetAllRegisteredIds(), ""), | 279 ObjectIdSetToInvalidationMap(registrar_.GetAllRegisteredIds(), ""), |
283 REMOTE_INVALIDATION); | 280 REMOTE_INVALIDATION); |
284 } | 281 } |
285 if (!notification_data.IsTargeted(unique_id_)) { | 282 if (!notification_data.IsTargeted(invalidator_client_id_)) { |
286 DVLOG(1) << "Not a target of the notification -- " | 283 DVLOG(1) << "Not a target of the notification -- " |
287 << "not emitting notification"; | 284 << "not emitting notification"; |
288 return; | 285 return; |
289 } | 286 } |
290 registrar_.DispatchInvalidationsToHandlers( | 287 registrar_.DispatchInvalidationsToHandlers( |
291 notification_data.GetIdInvalidationMap(), | 288 notification_data.GetIdInvalidationMap(), |
292 REMOTE_INVALIDATION); | 289 REMOTE_INVALIDATION); |
293 } | 290 } |
294 | 291 |
295 void P2PInvalidator::SendNotificationDataForTest( | 292 void P2PInvalidator::SendNotificationDataForTest( |
(...skipping 11 matching lines...) Expand all Loading... |
307 return; | 304 return; |
308 } | 305 } |
309 notifier::Notification notification; | 306 notifier::Notification notification; |
310 notification.channel = kSyncP2PNotificationChannel; | 307 notification.channel = kSyncP2PNotificationChannel; |
311 notification.data = notification_data.ToString(); | 308 notification.data = notification_data.ToString(); |
312 DVLOG(1) << "Sending XMPP notification: " << notification.ToString(); | 309 DVLOG(1) << "Sending XMPP notification: " << notification.ToString(); |
313 push_client_->SendNotification(notification); | 310 push_client_->SendNotification(notification); |
314 } | 311 } |
315 | 312 |
316 } // namespace syncer | 313 } // namespace syncer |
OLD | NEW |