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