1 // Copyright 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 // 5 // A simple wrapper around invalidation::InvalidationClient that 6 // handles all the startup/shutdown details and hookups. 7 8 #ifndef SYNC_NOTIFIER_SYNC_INVALIDATION_LISTENER_H_ 9 #define SYNC_NOTIFIER_SYNC_INVALIDATION_LISTENER_H_ 10 11 #include <string> 12 13 #include "base/basictypes.h" 14 #include "base/callback_forward.h" 15 #include "base/compiler_specific.h" 16 #include "base/memory/scoped_ptr.h" 17 #include "base/memory/weak_ptr.h" 18 #include "base/threading/non_thread_safe.h" 19 #include "google/cacheinvalidation/include/invalidation-listener.h" 20 #include "jingle/notifier/listener/push_client_observer.h" 21 #include "sync/base/sync_export.h" 22 #include "sync/internal_api/public/util/weak_handle.h" 23 #include "sync/notifier/ack_tracker.h" 24 #include "sync/notifier/invalidation_state_tracker.h" 25 #include "sync/notifier/invalidator_state.h" 26 #include "sync/notifier/object_id_invalidation_map.h" 27 #include "sync/notifier/state_writer.h" 28 #include "sync/notifier/sync_system_resources.h" 29 30 namespace base { 31 class TickClock; 32 } // namespace base 33 34 namespace buzz { 35 class XmppTaskParentInterface; 36 } // namespace buzz 37 38 namespace notifier { 39 class PushClient; 40 } // namespace notifier 41 42 namespace syncer { 43 44 class RegistrationManager; 45 46 // SyncInvalidationListener is not thread-safe and lives on the sync 47 // thread. 48 class SYNC_EXPORT_PRIVATE SyncInvalidationListener 49 : public NON_EXPORTED_BASE(invalidation::InvalidationListener), 50 public StateWriter, 51 public NON_EXPORTED_BASE(notifier::PushClientObserver), 52 public base::NonThreadSafe, 53 public AckTracker::Delegate { 54 public: 55 typedef base::Callback<invalidation::InvalidationClient*( 56 invalidation::SystemResources*, 57 int, 58 const invalidation::string&, 59 const invalidation::string&, 60 invalidation::InvalidationListener*)> CreateInvalidationClientCallback; 61 62 class SYNC_EXPORT_PRIVATE Delegate { 63 public: 64 virtual ~Delegate(); 65 66 virtual void OnInvalidate( 67 const ObjectIdInvalidationMap& invalidation_map) = 0; 68 69 virtual void OnInvalidatorStateChange(InvalidatorState state) = 0; 70 }; 71 72 explicit SyncInvalidationListener( 73 base::TickClock* tick_clock, 74 scoped_ptr<notifier::PushClient> push_client); 75 76 // Calls Stop(). 77 virtual ~SyncInvalidationListener(); 78 79 // Does not take ownership of |delegate| or |state_writer|. 80 // |invalidation_state_tracker| must be initialized. 81 void Start( 82 const CreateInvalidationClientCallback& 83 create_invalidation_client_callback, 84 const std::string& client_id, const std::string& client_info, 85 const std::string& invalidation_bootstrap_data, 86 const InvalidationStateMap& initial_invalidation_state_map, 87 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, 88 Delegate* delegate); 89 90 void UpdateCredentials(const std::string& email, const std::string& token); 91 92 // Update the set of object IDs that we're interested in getting 93 // notifications for. May be called at any time. 94 void UpdateRegisteredIds(const ObjectIdSet& ids); 95 // Acknowledge that an invalidation for |id| was handled. 96 void Acknowledge(const invalidation::ObjectId& id, 97 const AckHandle& ack_handle); 98 99 // invalidation::InvalidationListener implementation. 100 virtual void Ready( 101 invalidation::InvalidationClient* client) OVERRIDE; 102 virtual void Invalidate( 103 invalidation::InvalidationClient* client, 104 const invalidation::Invalidation& invalidation, 105 const invalidation::AckHandle& ack_handle) OVERRIDE; 106 virtual void InvalidateUnknownVersion( 107 invalidation::InvalidationClient* client, 108 const invalidation::ObjectId& object_id, 109 const invalidation::AckHandle& ack_handle) OVERRIDE; 110 virtual void InvalidateAll( 111 invalidation::InvalidationClient* client, 112 const invalidation::AckHandle& ack_handle) OVERRIDE; 113 virtual void InformRegistrationStatus( 114 invalidation::InvalidationClient* client, 115 const invalidation::ObjectId& object_id, 116 invalidation::InvalidationListener::RegistrationState reg_state) OVERRIDE; 117 virtual void InformRegistrationFailure( 118 invalidation::InvalidationClient* client, 119 const invalidation::ObjectId& object_id, 120 bool is_transient, 121 const std::string& error_message) OVERRIDE; 122 virtual void ReissueRegistrations( 123 invalidation::InvalidationClient* client, 124 const std::string& prefix, 125 int prefix_length) OVERRIDE; 126 virtual void InformError( 127 invalidation::InvalidationClient* client, 128 const invalidation::ErrorInfo& error_info) OVERRIDE; 129 130 // StateWriter implementation. 131 virtual void WriteState(const std::string& state) OVERRIDE; 132 133 // notifier::PushClientObserver implementation. 134 virtual void OnNotificationsEnabled() OVERRIDE; 135 virtual void OnNotificationsDisabled( 136 notifier::NotificationsDisabledReason reason) OVERRIDE; 137 virtual void OnIncomingNotification( 138 const notifier::Notification& notification) OVERRIDE; 139 140 void DoRegistrationUpdate(); 141 142 void StopForTest(); 143 InvalidationStateMap GetStateMapForTest() const; 144 AckTracker* GetAckTrackerForTest(); 145 146 private: 147 void Stop(); 148 149 InvalidatorState GetState() const; 150 151 void EmitStateChange(); 152 153 void PrepareInvalidation(const ObjectIdSet& ids, 154 int64 version, 155 const std::string& payload, 156 invalidation::InvalidationClient* client, 157 const invalidation::AckHandle& ack_handle); 158 void EmitInvalidation(const ObjectIdSet& ids, 159 int64 version, 160 const std::string& payload, 161 invalidation::InvalidationClient* client, 162 const invalidation::AckHandle& ack_handle, 163 const AckHandleMap& local_ack_handles); 164 165 // AckTracker::Delegate implementation. 166 virtual void OnTimeout(const ObjectIdSet& ids) OVERRIDE; 167 168 base::WeakPtrFactory<SyncInvalidationListener> weak_ptr_factory_; 169 AckTracker ack_tracker_; 170 171 // Owned by |sync_system_resources_|. 172 notifier::PushClient* const push_client_; 173 SyncSystemResources sync_system_resources_; 174 InvalidationStateMap invalidation_state_map_; 175 WeakHandle<InvalidationStateTracker> invalidation_state_tracker_; 176 Delegate* delegate_; 177 scoped_ptr<invalidation::InvalidationClient> invalidation_client_; 178 scoped_ptr<RegistrationManager> registration_manager_; 179 // Stored to pass to |registration_manager_| on start. 180 ObjectIdSet registered_ids_; 181 182 // The states of the ticl and the push client. 183 InvalidatorState ticl_state_; 184 InvalidatorState push_client_state_; 185 186 DISALLOW_COPY_AND_ASSIGN(SyncInvalidationListener); 187 }; 188 189 } // namespace syncer 190 191 #endif // SYNC_NOTIFIER_SYNC_INVALIDATION_LISTENER_H_ 192