- add sources.
[platform/framework/web/crosswalk.git] / src / sync / notifier / invalidation_notifier.h
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_