p2p_invalidator.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/p2p_invalidator.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <iterator> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_handler.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/invalidation_util.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/notifier_reason_util.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/object_id_invalidation_map.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/push_client.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSyncP2PNotificationChannel[] = "http://www.google.com/chrome/sync"; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNotifySelf[] = "notifySelf"; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNotifyOthers[] = "notifyOthers"; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNotifyAll[] = "notifyAll"; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSenderIdKey[] = "senderId"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNotificationTypeKey[] = "notificationType"; 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kInvalidationsKey[] = "invalidations"; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string P2PNotificationTargetToString(P2PNotificationTarget target) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (target) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFY_SELF: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kNotifySelf; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFY_OTHERS: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kNotifyOthers; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFY_ALL: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kNotifyAll; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)P2PNotificationTarget P2PNotificationTargetFromString( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& target_str) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_str == kNotifySelf) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NOTIFY_SELF; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_str == kNotifyOthers) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NOTIFY_OTHERS; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_str == kNotifyAll) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NOTIFY_ALL; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Could not parse " << target_str; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NOTIFY_SELF; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)P2PNotificationData::P2PNotificationData() 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : target_(NOTIFY_SELF) {} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)P2PNotificationData::P2PNotificationData( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& sender_id, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2PNotificationTarget target, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ObjectIdInvalidationMap& invalidation_map) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : sender_id_(sender_id), 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target), 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) invalidation_map_(invalidation_map) {} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)P2PNotificationData::~P2PNotificationData() {} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool P2PNotificationData::IsTargeted(const std::string& id) const { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (target_) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFY_SELF: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sender_id_ == id; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFY_OTHERS: 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sender_id_ != id; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NOTIFY_ALL: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ObjectIdInvalidationMap& 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)P2PNotificationData::GetIdInvalidationMap() const { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return invalidation_map_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool P2PNotificationData::Equals(const P2PNotificationData& other) const { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (sender_id_ == other.sender_id_) && 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target_ == other.target_) && 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (invalidation_map_ == other.invalidation_map_); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string P2PNotificationData::ToString() const { 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(kSenderIdKey, sender_id_); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(kNotificationTypeKey, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2PNotificationTargetToString(target_)); 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dict->Set(kInvalidationsKey, invalidation_map_.ToValue().release()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONWriter::Write(dict.get(), &json); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return json; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool P2PNotificationData::ResetFromString(const std::string& str) { 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Value> data_value(base::JSONReader::Read(str)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* data_dict = NULL; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data_value.get() || !data_value->GetAsDictionary(&data_dict)) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Could not parse " << str << " as a dictionary"; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data_dict->GetString(kSenderIdKey, &sender_id_)) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Could not find string value for " << kSenderIdKey; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string target_str; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data_dict->GetString(kNotificationTypeKey, &target_str)) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Could not find string value for " 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << kNotificationTypeKey; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_ = P2PNotificationTargetFromString(target_str); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* invalidation_map_list = NULL; 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!data_dict->GetList(kInvalidationsKey, &invalidation_map_list) || 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) !invalidation_map_.ResetFromValue(*invalidation_map_list)) { 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LOG(WARNING) << "Could not parse " << kInvalidationsKey; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)P2PInvalidator::P2PInvalidator(scoped_ptr<notifier::PushClient> push_client, 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& invalidator_client_id, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2PNotificationTarget send_notification_target) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : push_client_(push_client.Pass()), 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalidator_client_id_(invalidator_client_id), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logged_in_(false), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifications_enabled_(false), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_notification_target_(send_notification_target) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(send_notification_target_ == NOTIFY_OTHERS || 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_notification_target_ == NOTIFY_ALL); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->AddObserver(this); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)P2PInvalidator::~P2PInvalidator() { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->RemoveObserver(this); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::RegisterHandler(InvalidationHandler* handler) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.RegisterHandler(handler); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::UpdateRegisteredIds(InvalidationHandler* handler, 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ObjectIdSet& ids) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet new_ids; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectIdSet& old_ids = registrar_.GetRegisteredIds(handler); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set_difference(ids.begin(), ids.end(), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_ids.begin(), old_ids.end(), 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::inserter(new_ids, new_ids.end()), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdLessThan()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.UpdateRegisteredIds(handler, ids); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2PNotificationData notification_data( 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalidator_client_id_, 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) send_notification_target_, 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ObjectIdInvalidationMap::InvalidateAll(ids)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendNotificationData(notification_data); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::UnregisterHandler(InvalidationHandler* handler) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.UnregisterHandler(handler); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InvalidatorState P2PInvalidator::GetInvalidatorState() const { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return registrar_.GetInvalidatorState(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::UpdateCredentials( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& email, const std::string& token) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier::Subscription subscription; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subscription.channel = kSyncP2PNotificationChannel; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There may be some subtle issues around case sensitivity of the 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from field, but it doesn't matter too much since this is only 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used in p2p mode (which is only used in testing). 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subscription.from = email; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->UpdateSubscriptions( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier::SubscriptionList(1, subscription)); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If already logged in, the new credentials will take effect on the 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // next reconnection. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->UpdateCredentials(email, token); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logged_in_ = true; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void P2PInvalidator::RequestDetailedStatus( 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Callback<void(const base::DictionaryValue&)> callback) const { 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(mferreria): Make the P2P Invalidator work. 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback.Run(*value); 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void P2PInvalidator::SendInvalidation(const ObjectIdSet& ids) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ObjectIdInvalidationMap invalidation_map = 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ObjectIdInvalidationMap::InvalidateAll(ids); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2PNotificationData notification_data( 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalidator_client_id_, send_notification_target_, invalidation_map); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendNotificationData(notification_data); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::OnNotificationsEnabled() { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool just_turned_on = (notifications_enabled_ == false); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifications_enabled_ = true; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.UpdateInvalidatorState(INVALIDATIONS_ENABLED); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (just_turned_on) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2PNotificationData notification_data( 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalidator_client_id_, 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTIFY_SELF, 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ObjectIdInvalidationMap::InvalidateAll( 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) registrar_.GetAllRegisteredIds())); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendNotificationData(notification_data); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::OnNotificationsDisabled( 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier::NotificationsDisabledReason reason) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.UpdateInvalidatorState(FromNotifierReason(reason)); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::OnIncomingNotification( 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const notifier::Notification& notification) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Received notification " << notification.ToString(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!logged_in_) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Not logged in yet -- not emitting notification"; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notifications_enabled_) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Notifications not on -- not emitting notification"; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (notification.channel != kSyncP2PNotificationChannel) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Notification from unexpected source " 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << notification.channel; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2PNotificationData notification_data; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!notification_data.ResetFromString(notification.data)) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Could not parse notification data from " 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << notification.data; 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) notification_data = P2PNotificationData( 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalidator_client_id_, 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTIFY_ALL, 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ObjectIdInvalidationMap::InvalidateAll( 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) registrar_.GetAllRegisteredIds())); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!notification_data.IsTargeted(invalidator_client_id_)) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Not a target of the notification -- " 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "not emitting notification"; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.DispatchInvalidationsToHandlers( 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notification_data.GetIdInvalidationMap()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::SendNotificationDataForTest( 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2PNotificationData& notification_data) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendNotificationData(notification_data); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void P2PInvalidator::SendNotificationData( 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P2PNotificationData& notification_data) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (notification_data.GetIdInvalidationMap().Empty()) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Not sending XMPP notification with empty state map: " 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << notification_data.ToString(); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notifier::Notification notification; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification.channel = kSyncP2PNotificationChannel; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification.data = notification_data.ToString(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Sending XMPP notification: " << notification.ToString(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->SendNotification(notification); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 301