OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "sync/notifier/non_blocking_invalidator.h" | 5 #include "sync/notifier/non_blocking_invalidator.h" |
6 | 6 |
7 #include <cstddef> | 7 #include <cstddef> |
8 | 8 |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
13 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
14 #include "base/threading/thread.h" | 14 #include "base/threading/thread.h" |
15 #include "jingle/notifier/listener/push_client.h" | 15 #include "jingle/notifier/listener/push_client.h" |
16 #include "sync/notifier/invalidation_notifier.h" | 16 #include "sync/notifier/invalidation_notifier.h" |
| 17 #include "sync/notifier/object_id_invalidation_map.h" |
17 | 18 |
18 namespace syncer { | 19 namespace syncer { |
19 | 20 |
20 class NonBlockingInvalidator::Core | 21 class NonBlockingInvalidator::Core |
21 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>, | 22 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>, |
22 // InvalidationHandler to observe the InvalidationNotifier we create. | 23 // InvalidationHandler to observe the InvalidationNotifier we create. |
23 public InvalidationHandler { | 24 public InvalidationHandler { |
24 public: | 25 public: |
25 // Called on parent thread. |delegate_observer| should be | 26 // Called on parent thread. |delegate_observer| should be |
26 // initialized. | 27 // initialized. |
27 explicit Core( | 28 explicit Core( |
28 const WeakHandle<InvalidationHandler>& delegate_observer); | 29 const WeakHandle<InvalidationHandler>& delegate_observer); |
29 | 30 |
30 // Helpers called on I/O thread. | 31 // Helpers called on I/O thread. |
31 void Initialize( | 32 void Initialize( |
32 const notifier::NotifierOptions& notifier_options, | 33 const notifier::NotifierOptions& notifier_options, |
33 const std::string& invalidator_client_id, | 34 const std::string& invalidator_client_id, |
34 const InvalidationStateMap& initial_invalidation_state_map, | 35 const UnackedInvalidationsMap& saved_invalidations, |
35 const std::string& invalidation_bootstrap_data, | 36 const std::string& invalidation_bootstrap_data, |
36 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, | 37 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, |
37 const std::string& client_info); | 38 const std::string& client_info); |
38 void Teardown(); | 39 void Teardown(); |
39 void UpdateRegisteredIds(const ObjectIdSet& ids); | 40 void UpdateRegisteredIds(const ObjectIdSet& ids); |
40 void Acknowledge(const invalidation::ObjectId& id, | |
41 const AckHandle& ack_handle); | |
42 void UpdateCredentials(const std::string& email, const std::string& token); | 41 void UpdateCredentials(const std::string& email, const std::string& token); |
43 | 42 |
44 // InvalidationHandler implementation (all called on I/O thread by | 43 // InvalidationHandler implementation (all called on I/O thread by |
45 // InvalidationNotifier). | 44 // InvalidationNotifier). |
46 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE; | 45 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE; |
47 virtual void OnIncomingInvalidation( | 46 virtual void OnIncomingInvalidation( |
48 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; | 47 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; |
49 | 48 |
50 private: | 49 private: |
51 friend class | 50 friend class |
(...skipping 14 matching lines...) Expand all Loading... |
66 : delegate_observer_(delegate_observer) { | 65 : delegate_observer_(delegate_observer) { |
67 DCHECK(delegate_observer_.IsInitialized()); | 66 DCHECK(delegate_observer_.IsInitialized()); |
68 } | 67 } |
69 | 68 |
70 NonBlockingInvalidator::Core::~Core() { | 69 NonBlockingInvalidator::Core::~Core() { |
71 } | 70 } |
72 | 71 |
73 void NonBlockingInvalidator::Core::Initialize( | 72 void NonBlockingInvalidator::Core::Initialize( |
74 const notifier::NotifierOptions& notifier_options, | 73 const notifier::NotifierOptions& notifier_options, |
75 const std::string& invalidator_client_id, | 74 const std::string& invalidator_client_id, |
76 const InvalidationStateMap& initial_invalidation_state_map, | 75 const UnackedInvalidationsMap& saved_invalidations, |
77 const std::string& invalidation_bootstrap_data, | 76 const std::string& invalidation_bootstrap_data, |
78 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, | 77 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, |
79 const std::string& client_info) { | 78 const std::string& client_info) { |
80 DCHECK(notifier_options.request_context_getter.get()); | 79 DCHECK(notifier_options.request_context_getter.get()); |
81 DCHECK_EQ(notifier::NOTIFICATION_SERVER, | 80 DCHECK_EQ(notifier::NOTIFICATION_SERVER, |
82 notifier_options.notification_method); | 81 notifier_options.notification_method); |
83 network_task_runner_ = notifier_options.request_context_getter-> | 82 network_task_runner_ = notifier_options.request_context_getter-> |
84 GetNetworkTaskRunner(); | 83 GetNetworkTaskRunner(); |
85 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 84 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
86 invalidation_notifier_.reset( | 85 invalidation_notifier_.reset( |
87 new InvalidationNotifier( | 86 new InvalidationNotifier( |
88 notifier::PushClient::CreateDefaultOnIOThread(notifier_options), | 87 notifier::PushClient::CreateDefaultOnIOThread(notifier_options), |
89 invalidator_client_id, | 88 invalidator_client_id, |
90 initial_invalidation_state_map, | 89 saved_invalidations, |
91 invalidation_bootstrap_data, | 90 invalidation_bootstrap_data, |
92 invalidation_state_tracker, | 91 invalidation_state_tracker, |
93 client_info)); | 92 client_info)); |
94 invalidation_notifier_->RegisterHandler(this); | 93 invalidation_notifier_->RegisterHandler(this); |
95 } | 94 } |
96 | 95 |
97 void NonBlockingInvalidator::Core::Teardown() { | 96 void NonBlockingInvalidator::Core::Teardown() { |
98 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 97 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
99 invalidation_notifier_->UnregisterHandler(this); | 98 invalidation_notifier_->UnregisterHandler(this); |
100 invalidation_notifier_.reset(); | 99 invalidation_notifier_.reset(); |
101 network_task_runner_ = NULL; | 100 network_task_runner_ = NULL; |
102 } | 101 } |
103 | 102 |
104 void NonBlockingInvalidator::Core::UpdateRegisteredIds(const ObjectIdSet& ids) { | 103 void NonBlockingInvalidator::Core::UpdateRegisteredIds(const ObjectIdSet& ids) { |
105 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 104 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
106 invalidation_notifier_->UpdateRegisteredIds(this, ids); | 105 invalidation_notifier_->UpdateRegisteredIds(this, ids); |
107 } | 106 } |
108 | 107 |
109 void NonBlockingInvalidator::Core::Acknowledge(const invalidation::ObjectId& id, | |
110 const AckHandle& ack_handle) { | |
111 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
112 invalidation_notifier_->Acknowledge(id, ack_handle); | |
113 } | |
114 | |
115 void NonBlockingInvalidator::Core::UpdateCredentials(const std::string& email, | 108 void NonBlockingInvalidator::Core::UpdateCredentials(const std::string& email, |
116 const std::string& token) { | 109 const std::string& token) { |
117 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 110 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
118 invalidation_notifier_->UpdateCredentials(email, token); | 111 invalidation_notifier_->UpdateCredentials(email, token); |
119 } | 112 } |
120 | 113 |
121 void NonBlockingInvalidator::Core::OnInvalidatorStateChange( | 114 void NonBlockingInvalidator::Core::OnInvalidatorStateChange( |
122 InvalidatorState reason) { | 115 InvalidatorState reason) { |
123 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 116 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
124 delegate_observer_.Call( | 117 delegate_observer_.Call( |
125 FROM_HERE, &InvalidationHandler::OnInvalidatorStateChange, reason); | 118 FROM_HERE, &InvalidationHandler::OnInvalidatorStateChange, reason); |
126 } | 119 } |
127 | 120 |
128 void NonBlockingInvalidator::Core::OnIncomingInvalidation( | 121 void NonBlockingInvalidator::Core::OnIncomingInvalidation( |
129 const ObjectIdInvalidationMap& invalidation_map) { | 122 const ObjectIdInvalidationMap& invalidation_map) { |
130 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 123 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
131 delegate_observer_.Call(FROM_HERE, | 124 delegate_observer_.Call(FROM_HERE, |
132 &InvalidationHandler::OnIncomingInvalidation, | 125 &InvalidationHandler::OnIncomingInvalidation, |
133 invalidation_map); | 126 invalidation_map); |
134 } | 127 } |
135 | 128 |
136 NonBlockingInvalidator::NonBlockingInvalidator( | 129 NonBlockingInvalidator::NonBlockingInvalidator( |
137 const notifier::NotifierOptions& notifier_options, | 130 const notifier::NotifierOptions& notifier_options, |
138 const std::string& invalidator_client_id, | 131 const std::string& invalidator_client_id, |
139 const InvalidationStateMap& initial_invalidation_state_map, | 132 const UnackedInvalidationsMap& saved_invalidations, |
140 const std::string& invalidation_bootstrap_data, | 133 const std::string& invalidation_bootstrap_data, |
141 const WeakHandle<InvalidationStateTracker>& | 134 const WeakHandle<InvalidationStateTracker>& |
142 invalidation_state_tracker, | 135 invalidation_state_tracker, |
143 const std::string& client_info) | 136 const std::string& client_info) |
144 : parent_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 137 : parent_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
145 network_task_runner_( | 138 network_task_runner_( |
146 notifier_options.request_context_getter->GetNetworkTaskRunner()), | 139 notifier_options.request_context_getter->GetNetworkTaskRunner()), |
147 weak_ptr_factory_(this) { | 140 weak_ptr_factory_(this) { |
148 core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); | 141 core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); |
149 | 142 |
150 if (!network_task_runner_->PostTask( | 143 if (!network_task_runner_->PostTask( |
151 FROM_HERE, | 144 FROM_HERE, |
152 base::Bind( | 145 base::Bind( |
153 &NonBlockingInvalidator::Core::Initialize, | 146 &NonBlockingInvalidator::Core::Initialize, |
154 core_.get(), | 147 core_.get(), |
155 notifier_options, | 148 notifier_options, |
156 invalidator_client_id, | 149 invalidator_client_id, |
157 initial_invalidation_state_map, | 150 saved_invalidations, |
158 invalidation_bootstrap_data, | 151 invalidation_bootstrap_data, |
159 invalidation_state_tracker, | 152 invalidation_state_tracker, |
160 client_info))) { | 153 client_info))) { |
161 NOTREACHED(); | 154 NOTREACHED(); |
162 } | 155 } |
163 } | 156 } |
164 | 157 |
165 NonBlockingInvalidator::~NonBlockingInvalidator() { | 158 NonBlockingInvalidator::~NonBlockingInvalidator() { |
166 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 159 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
167 if (!network_task_runner_->PostTask( | 160 if (!network_task_runner_->PostTask( |
(...skipping 21 matching lines...) Expand all Loading... |
189 registrar_.GetAllRegisteredIds()))) { | 182 registrar_.GetAllRegisteredIds()))) { |
190 NOTREACHED(); | 183 NOTREACHED(); |
191 } | 184 } |
192 } | 185 } |
193 | 186 |
194 void NonBlockingInvalidator::UnregisterHandler(InvalidationHandler* handler) { | 187 void NonBlockingInvalidator::UnregisterHandler(InvalidationHandler* handler) { |
195 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 188 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
196 registrar_.UnregisterHandler(handler); | 189 registrar_.UnregisterHandler(handler); |
197 } | 190 } |
198 | 191 |
199 void NonBlockingInvalidator::Acknowledge(const invalidation::ObjectId& id, | |
200 const AckHandle& ack_handle) { | |
201 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | |
202 if (!network_task_runner_->PostTask( | |
203 FROM_HERE, | |
204 base::Bind( | |
205 &NonBlockingInvalidator::Core::Acknowledge, | |
206 core_.get(), | |
207 id, | |
208 ack_handle))) { | |
209 NOTREACHED(); | |
210 } | |
211 } | |
212 | |
213 InvalidatorState NonBlockingInvalidator::GetInvalidatorState() const { | 192 InvalidatorState NonBlockingInvalidator::GetInvalidatorState() const { |
214 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 193 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
215 return registrar_.GetInvalidatorState(); | 194 return registrar_.GetInvalidatorState(); |
216 } | 195 } |
217 | 196 |
218 void NonBlockingInvalidator::UpdateCredentials(const std::string& email, | 197 void NonBlockingInvalidator::UpdateCredentials(const std::string& email, |
219 const std::string& token) { | 198 const std::string& token) { |
220 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 199 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
221 if (!network_task_runner_->PostTask( | 200 if (!network_task_runner_->PostTask( |
222 FROM_HERE, | 201 FROM_HERE, |
223 base::Bind(&NonBlockingInvalidator::Core::UpdateCredentials, | 202 base::Bind(&NonBlockingInvalidator::Core::UpdateCredentials, |
224 core_.get(), email, token))) { | 203 core_.get(), email, token))) { |
225 NOTREACHED(); | 204 NOTREACHED(); |
226 } | 205 } |
227 } | 206 } |
228 | 207 |
229 void NonBlockingInvalidator::OnInvalidatorStateChange(InvalidatorState state) { | 208 void NonBlockingInvalidator::OnInvalidatorStateChange(InvalidatorState state) { |
230 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 209 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
231 registrar_.UpdateInvalidatorState(state); | 210 registrar_.UpdateInvalidatorState(state); |
232 } | 211 } |
233 | 212 |
234 void NonBlockingInvalidator::OnIncomingInvalidation( | 213 void NonBlockingInvalidator::OnIncomingInvalidation( |
235 const ObjectIdInvalidationMap& invalidation_map) { | 214 const ObjectIdInvalidationMap& invalidation_map) { |
236 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 215 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
237 registrar_.DispatchInvalidationsToHandlers(invalidation_map); | 216 registrar_.DispatchInvalidationsToHandlers(invalidation_map); |
238 } | 217 } |
239 | 218 |
240 } // namespace syncer | 219 } // namespace syncer |
OLD | NEW |