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)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple wrapper around invalidation::InvalidationClient that 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handles all the startup/shutdown details and hookups. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef COMPONENTS_INVALIDATION_SYNC_INVALIDATION_LISTENER_H_ 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define COMPONENTS_INVALIDATION_SYNC_INVALIDATION_LISTENER_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/ack_handler.h" 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/invalidation_export.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_state_tracker.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/invalidator_state.h" 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/state_writer.h" 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/invalidation/sync_system_resources.h" 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/unacked_invalidation_set.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/include/invalidation-listener.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace buzz { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XmppTaskParentInterface; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace buzz 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace notifier { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PushClient; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace notifier 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ObjectIdInvalidationMap; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RegistrationManager; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SyncInvalidationListener is not thread-safe and lives on the sync 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread. 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class INVALIDATION_EXPORT_PRIVATE SyncInvalidationListener 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public NON_EXPORTED_BASE(invalidation::InvalidationListener), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public StateWriter, 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public SyncNetworkChannel::Observer, 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public AckHandler, 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public base::NonThreadSafe { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<invalidation::InvalidationClient*( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::SystemResources*, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::string&, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::string&, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationListener*)> CreateInvalidationClientCallback; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class INVALIDATION_EXPORT_PRIVATE Delegate { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Delegate(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnInvalidate( 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ObjectIdInvalidationMap& invalidations) = 0; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnInvalidatorStateChange(InvalidatorState state) = 0; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SyncInvalidationListener( 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SyncNetworkChannel> network_channel); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls Stop(). 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SyncInvalidationListener(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does not take ownership of |delegate| or |state_writer|. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |invalidation_state_tracker| must be initialized. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Start( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CreateInvalidationClientCallback& 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_invalidation_client_callback, 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const std::string& client_id, 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const std::string& client_info, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& invalidation_bootstrap_data, 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const UnackedInvalidationsMap& initial_object_states, 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const base::WeakPtr<InvalidationStateTracker>& invalidation_state_tracker, 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) invalidation_state_tracker_task_runner, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateCredentials(const std::string& email, const std::string& token); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the set of object IDs that we're interested in getting 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications for. May be called at any time. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateRegisteredIds(const ObjectIdSet& ids); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalidation::InvalidationListener implementation. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Ready( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* client) OVERRIDE; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Invalidate( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* client, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::Invalidation& invalidation, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::AckHandle& ack_handle) OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InvalidateUnknownVersion( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* client, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::ObjectId& object_id, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::AckHandle& ack_handle) OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InvalidateAll( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* client, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::AckHandle& ack_handle) OVERRIDE; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InformRegistrationStatus( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* client, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::ObjectId& object_id, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationListener::RegistrationState reg_state) OVERRIDE; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InformRegistrationFailure( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* client, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::ObjectId& object_id, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_transient, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& error_message) OVERRIDE; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReissueRegistrations( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* client, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& prefix, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prefix_length) OVERRIDE; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InformError( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* client, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const invalidation::ErrorInfo& error_info) OVERRIDE; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // AckHandler implementation. 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Acknowledge( 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const invalidation::ObjectId& id, 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::AckHandle& handle) OVERRIDE; 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Drop( 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const invalidation::ObjectId& id, 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::AckHandle& handle) OVERRIDE; 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StateWriter implementation. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WriteState(const std::string& state) OVERRIDE; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // SyncNetworkChannel::Observer implementation. 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnNetworkChannelStateChanged( 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InvalidatorState invalidator_state) OVERRIDE; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoRegistrationUpdate(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void RequestDetailedStatus( 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Callback<void(const base::DictionaryValue&)> callback) const; 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StopForTest(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Stop(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorState GetState() const; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EmitStateChange(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Sends invalidations to their appropriate destination. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If there are no observers registered for them, they will be saved for 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // later. 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If there are observers registered, they will be saved (to make sure we 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // don't drop them until they've been acted on) and emitted to the observers. 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void DispatchInvalidations(const ObjectIdInvalidationMap& invalidations); 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Saves invalidations. 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This call isn't synchronous so we can't guarantee these invalidations will 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // be safely on disk by the end of the call, but it should ensure that the 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // data makes it to disk eventually. 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SaveInvalidations(const ObjectIdInvalidationMap& to_save); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Emits previously saved invalidations to their registered observers. 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void EmitSavedInvalidations(const ObjectIdInvalidationMap& to_emit); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Generate a Dictionary with all the debugging information. 17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<base::DictionaryValue> CollectDebugData() const; 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::WeakPtr<AckHandler> AsWeakPtr(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SyncNetworkChannel> sync_network_channel_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncSystemResources sync_system_resources_; 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UnackedInvalidationsMap unacked_invalidations_map_; 1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::WeakPtr<InvalidationStateTracker> invalidation_state_tracker_; 1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> 1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) invalidation_state_tracker_task_runner_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<invalidation::InvalidationClient> invalidation_client_; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<RegistrationManager> registration_manager_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stored to pass to |registration_manager_| on start. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet registered_ids_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The states of the ticl and the push client. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorState ticl_state_; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidatorState push_client_state_; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::WeakPtrFactory<SyncInvalidationListener> weak_ptr_factory_; 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SyncInvalidationListener); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // COMPONENTS_INVALIDATION_SYNC_INVALIDATION_LISTENER_H_ 201