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/invalidation_notifier.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/include/invalidation-client-factory.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/push_client.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/notifier/invalidation_handler.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/jid.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/xmppclientsettings.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InvalidationNotifier::InvalidationNotifier( 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SyncNetworkChannel> network_channel, 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& invalidator_client_id, 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const UnackedInvalidationsMap& saved_invalidations, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& invalidation_bootstrap_data, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& client_info) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : state_(STOPPED), 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) saved_invalidations_(saved_invalidations), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation_state_tracker_(invalidation_state_tracker), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_info_(client_info), 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalidator_client_id_(invalidator_client_id), 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation_bootstrap_data_(invalidation_bootstrap_data), 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) invalidation_listener_(network_channel.Pass()) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InvalidationNotifier::~InvalidationNotifier() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InvalidationNotifier::RegisterHandler(InvalidationHandler* handler) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.RegisterHandler(handler); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InvalidationNotifier::UpdateRegisteredIds(InvalidationHandler* handler, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectIdSet& ids) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.UpdateRegisteredIds(handler, ids); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation_listener_.UpdateRegisteredIds(registrar_.GetAllRegisteredIds()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InvalidationNotifier::UnregisterHandler(InvalidationHandler* handler) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.UnregisterHandler(handler); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InvalidatorState InvalidationNotifier::GetInvalidatorState() const { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return registrar_.GetInvalidatorState(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InvalidationNotifier::UpdateCredentials( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& email, const std::string& token) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state_ == STOPPED) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation_listener_.Start( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&invalidation::CreateInvalidationClient), 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invalidator_client_id_, client_info_, invalidation_bootstrap_data_, 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) saved_invalidations_, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation_state_tracker_, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_ = STARTED; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation_listener_.UpdateCredentials(email, token); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void InvalidationNotifier::RequestDetailedStatus( 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Callback<void(const base::DictionaryValue&)> callback) const { 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(CalledOnValidThread()); 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) invalidation_listener_.RequestDetailedStatus(callback); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InvalidationNotifier::OnInvalidate( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectIdInvalidationMap& invalidation_map) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.DispatchInvalidationsToHandlers(invalidation_map); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InvalidationNotifier::OnInvalidatorStateChange(InvalidatorState state) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.UpdateInvalidatorState(state); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 94