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 // An implementation of Invalidator that wraps an invalidation 6 // client. Handles the details of connecting to XMPP and hooking it 7 // up to the invalidation client. 8 // 9 // You probably don't want to use this directly; use 10 // NonBlockingInvalidator. 11 12 #ifndef SYNC_NOTIFIER_INVALIDATION_NOTIFIER_H_ 13 #define SYNC_NOTIFIER_INVALIDATION_NOTIFIER_H_ 14 15 #include <string> 16 17 #include "base/basictypes.h" 18 #include "base/compiler_specific.h" 19 #include "base/memory/scoped_ptr.h" 20 #include "base/threading/non_thread_safe.h" 21 #include "base/time/default_tick_clock.h" 22 #include "sync/base/sync_export.h" 23 #include "sync/internal_api/public/base/model_type.h" 24 #include "sync/internal_api/public/util/weak_handle.h" 25 #include "sync/notifier/invalidation_state_tracker.h" 26 #include "sync/notifier/invalidator.h" 27 #include "sync/notifier/invalidator_registrar.h" 28 #include "sync/notifier/sync_invalidation_listener.h" 29 30 namespace notifier { 31 class PushClient; 32 } // namespace notifier 33 34 namespace syncer { 35 36 // This class must live on the IO thread. 37 // TODO(dcheng): Think of a name better than InvalidationInvalidator. 38 class SYNC_EXPORT_PRIVATE InvalidationNotifier 39 : public Invalidator, 40 public SyncInvalidationListener::Delegate, 41 public base::NonThreadSafe { 42 public: 43 // |invalidation_state_tracker| must be initialized. 44 InvalidationNotifier( 45 scoped_ptr<notifier::PushClient> push_client, 46 const std::string& invalidator_client_id, 47 const InvalidationStateMap& initial_invalidation_state_map, 48 const std::string& invalidation_bootstrap_data, 49 const WeakHandle<InvalidationStateTracker>& 50 invalidation_state_tracker, 51 const std::string& client_info); 52 53 virtual ~InvalidationNotifier(); 54 55 // Invalidator implementation. 56 virtual void RegisterHandler(InvalidationHandler* handler) OVERRIDE; 57 virtual void UpdateRegisteredIds(InvalidationHandler* handler, 58 const ObjectIdSet& ids) OVERRIDE; 59 virtual void UnregisterHandler(InvalidationHandler* handler) OVERRIDE; 60 virtual void Acknowledge(const invalidation::ObjectId& id, 61 const AckHandle& ack_handle) OVERRIDE; 62 virtual InvalidatorState GetInvalidatorState() const OVERRIDE; 63 virtual void UpdateCredentials( 64 const std::string& email, const std::string& token) OVERRIDE; 65 66 // SyncInvalidationListener::Delegate implementation. 67 virtual void OnInvalidate( 68 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 69 virtual void OnInvalidatorStateChange(InvalidatorState state) OVERRIDE; 70 71 private: 72 // We start off in the STOPPED state. When we get our initial 73 // credentials, we connect and move to the CONNECTING state. When 74 // we're connected we start the invalidation client and move to the 75 // STARTED state. We never go back to a previous state. 76 enum State { 77 STOPPED, 78 CONNECTING, 79 STARTED 80 }; 81 State state_; 82 83 InvalidatorRegistrar registrar_; 84 85 // Passed to |invalidation_listener_|. 86 const InvalidationStateMap initial_invalidation_state_map_; 87 88 // Passed to |invalidation_listener_|. 89 const WeakHandle<InvalidationStateTracker> 90 invalidation_state_tracker_; 91 92 // Passed to |invalidation_listener_|. 93 const std::string client_info_; 94 95 // The client ID to pass to |invalidation_listener_|. 96 const std::string invalidator_client_id_; 97 98 // The initial bootstrap data to pass to |invalidation_listener_|. 99 const std::string invalidation_bootstrap_data_; 100 101 // TODO(akalin): Clean up this reference to DefaultTickClock. Ideally, we 102 // should simply be using TaskRunner's tick clock. See http://crbug.com/179211 103 base::DefaultTickClock tick_clock_; 104 105 // The invalidation listener. 106 SyncInvalidationListener invalidation_listener_; 107 108 DISALLOW_COPY_AND_ASSIGN(InvalidationNotifier); 109 }; 110 111 } // namespace syncer 112 113 #endif // SYNC_NOTIFIER_INVALIDATION_NOTIFIER_H_ 114