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 #include "sync/notifier/object_id_invalidation_map.h" |
18 #include "sync/notifier/sync_system_resources.h" | |
18 | 19 |
19 namespace syncer { | 20 namespace syncer { |
20 | 21 |
22 struct NonBlockingInvalidator::InitializeOptions { | |
pavely
2013/12/20 00:04:16
Number of parameters to NonBlockingInvalidator::Co
| |
23 InitializeOptions( | |
24 NetworkChannelCreator network_channel_creator, | |
25 const std::string& invalidator_client_id, | |
26 const UnackedInvalidationsMap& saved_invalidations, | |
27 const std::string& invalidation_bootstrap_data, | |
28 const WeakHandle<InvalidationStateTracker>& | |
29 invalidation_state_tracker, | |
30 const std::string& client_info, | |
31 scoped_refptr<net::URLRequestContextGetter> request_context_getter) | |
32 : network_channel_creator(network_channel_creator), | |
33 invalidator_client_id(invalidator_client_id), | |
34 saved_invalidations(saved_invalidations), | |
35 invalidation_bootstrap_data(invalidation_bootstrap_data), | |
36 invalidation_state_tracker(invalidation_state_tracker), | |
37 client_info(client_info), | |
38 request_context_getter(request_context_getter) { | |
39 } | |
40 | |
41 NetworkChannelCreator network_channel_creator; | |
42 std::string invalidator_client_id; | |
43 UnackedInvalidationsMap saved_invalidations; | |
44 std::string invalidation_bootstrap_data; | |
45 WeakHandle<InvalidationStateTracker> invalidation_state_tracker; | |
46 std::string client_info; | |
47 scoped_refptr<net::URLRequestContextGetter> request_context_getter; | |
48 }; | |
49 | |
50 | |
21 class NonBlockingInvalidator::Core | 51 class NonBlockingInvalidator::Core |
22 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>, | 52 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>, |
23 // InvalidationHandler to observe the InvalidationNotifier we create. | 53 // InvalidationHandler to observe the InvalidationNotifier we create. |
24 public InvalidationHandler { | 54 public InvalidationHandler { |
25 public: | 55 public: |
26 // Called on parent thread. |delegate_observer| should be | 56 // Called on parent thread. |delegate_observer| should be |
27 // initialized. | 57 // initialized. |
28 explicit Core( | 58 explicit Core( |
29 const WeakHandle<InvalidationHandler>& delegate_observer); | 59 const WeakHandle<InvalidationHandler>& delegate_observer); |
30 | 60 |
31 // Helpers called on I/O thread. | 61 // Helpers called on I/O thread. |
32 void Initialize( | 62 void Initialize( |
33 const notifier::NotifierOptions& notifier_options, | 63 const NonBlockingInvalidator::InitializeOptions& initialize_options); |
34 const std::string& invalidator_client_id, | |
35 const UnackedInvalidationsMap& saved_invalidations, | |
36 const std::string& invalidation_bootstrap_data, | |
37 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, | |
38 const std::string& client_info); | |
39 void Teardown(); | 64 void Teardown(); |
40 void UpdateRegisteredIds(const ObjectIdSet& ids); | 65 void UpdateRegisteredIds(const ObjectIdSet& ids); |
41 void UpdateCredentials(const std::string& email, const std::string& token); | 66 void UpdateCredentials(const std::string& email, const std::string& token); |
42 | 67 |
43 // InvalidationHandler implementation (all called on I/O thread by | 68 // InvalidationHandler implementation (all called on I/O thread by |
44 // InvalidationNotifier). | 69 // InvalidationNotifier). |
45 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE; | 70 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE; |
46 virtual void OnIncomingInvalidation( | 71 virtual void OnIncomingInvalidation( |
47 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; | 72 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; |
48 | 73 |
(...skipping 14 matching lines...) Expand all Loading... | |
63 NonBlockingInvalidator::Core::Core( | 88 NonBlockingInvalidator::Core::Core( |
64 const WeakHandle<InvalidationHandler>& delegate_observer) | 89 const WeakHandle<InvalidationHandler>& delegate_observer) |
65 : delegate_observer_(delegate_observer) { | 90 : delegate_observer_(delegate_observer) { |
66 DCHECK(delegate_observer_.IsInitialized()); | 91 DCHECK(delegate_observer_.IsInitialized()); |
67 } | 92 } |
68 | 93 |
69 NonBlockingInvalidator::Core::~Core() { | 94 NonBlockingInvalidator::Core::~Core() { |
70 } | 95 } |
71 | 96 |
72 void NonBlockingInvalidator::Core::Initialize( | 97 void NonBlockingInvalidator::Core::Initialize( |
73 const notifier::NotifierOptions& notifier_options, | 98 const NonBlockingInvalidator::InitializeOptions& initialize_options) { |
74 const std::string& invalidator_client_id, | 99 DCHECK(initialize_options.request_context_getter.get()); |
75 const UnackedInvalidationsMap& saved_invalidations, | 100 network_task_runner_ = |
76 const std::string& invalidation_bootstrap_data, | 101 initialize_options.request_context_getter->GetNetworkTaskRunner(); |
77 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, | |
78 const std::string& client_info) { | |
79 DCHECK(notifier_options.request_context_getter.get()); | |
80 DCHECK_EQ(notifier::NOTIFICATION_SERVER, | |
81 notifier_options.notification_method); | |
82 network_task_runner_ = notifier_options.request_context_getter-> | |
83 GetNetworkTaskRunner(); | |
84 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 102 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
103 scoped_ptr<SyncNetworkChannel> network_channel = | |
104 initialize_options.network_channel_creator.Run(); | |
85 invalidation_notifier_.reset( | 105 invalidation_notifier_.reset( |
86 new InvalidationNotifier( | 106 new InvalidationNotifier( |
87 notifier::PushClient::CreateDefaultOnIOThread(notifier_options), | 107 network_channel.Pass(), |
88 invalidator_client_id, | 108 initialize_options.invalidator_client_id, |
89 saved_invalidations, | 109 initialize_options.saved_invalidations, |
90 invalidation_bootstrap_data, | 110 initialize_options.invalidation_bootstrap_data, |
91 invalidation_state_tracker, | 111 initialize_options.invalidation_state_tracker, |
92 client_info)); | 112 initialize_options.client_info)); |
93 invalidation_notifier_->RegisterHandler(this); | 113 invalidation_notifier_->RegisterHandler(this); |
94 } | 114 } |
95 | 115 |
96 void NonBlockingInvalidator::Core::Teardown() { | 116 void NonBlockingInvalidator::Core::Teardown() { |
97 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 117 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
98 invalidation_notifier_->UnregisterHandler(this); | 118 invalidation_notifier_->UnregisterHandler(this); |
99 invalidation_notifier_.reset(); | 119 invalidation_notifier_.reset(); |
100 network_task_runner_ = NULL; | 120 network_task_runner_ = NULL; |
101 } | 121 } |
102 | 122 |
(...skipping 17 matching lines...) Expand all Loading... | |
120 | 140 |
121 void NonBlockingInvalidator::Core::OnIncomingInvalidation( | 141 void NonBlockingInvalidator::Core::OnIncomingInvalidation( |
122 const ObjectIdInvalidationMap& invalidation_map) { | 142 const ObjectIdInvalidationMap& invalidation_map) { |
123 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 143 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
124 delegate_observer_.Call(FROM_HERE, | 144 delegate_observer_.Call(FROM_HERE, |
125 &InvalidationHandler::OnIncomingInvalidation, | 145 &InvalidationHandler::OnIncomingInvalidation, |
126 invalidation_map); | 146 invalidation_map); |
127 } | 147 } |
128 | 148 |
129 NonBlockingInvalidator::NonBlockingInvalidator( | 149 NonBlockingInvalidator::NonBlockingInvalidator( |
130 const notifier::NotifierOptions& notifier_options, | 150 NetworkChannelCreator network_channel_creator, |
131 const std::string& invalidator_client_id, | 151 const std::string& invalidator_client_id, |
132 const UnackedInvalidationsMap& saved_invalidations, | 152 const UnackedInvalidationsMap& saved_invalidations, |
133 const std::string& invalidation_bootstrap_data, | 153 const std::string& invalidation_bootstrap_data, |
134 const WeakHandle<InvalidationStateTracker>& | 154 const WeakHandle<InvalidationStateTracker>& |
135 invalidation_state_tracker, | 155 invalidation_state_tracker, |
136 const std::string& client_info) | 156 const std::string& client_info, |
157 const scoped_refptr<net::URLRequestContextGetter>& request_context_getter) | |
137 : parent_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 158 : parent_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
138 network_task_runner_( | 159 network_task_runner_(request_context_getter->GetNetworkTaskRunner()), |
139 notifier_options.request_context_getter->GetNetworkTaskRunner()), | |
140 weak_ptr_factory_(this) { | 160 weak_ptr_factory_(this) { |
141 core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); | 161 core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); |
142 | 162 |
163 InitializeOptions initialize_options( | |
164 network_channel_creator, | |
165 invalidator_client_id, | |
166 saved_invalidations, | |
167 invalidation_bootstrap_data, | |
168 invalidation_state_tracker, | |
169 client_info, | |
170 request_context_getter); | |
171 | |
143 if (!network_task_runner_->PostTask( | 172 if (!network_task_runner_->PostTask( |
144 FROM_HERE, | 173 FROM_HERE, |
145 base::Bind( | 174 base::Bind( |
146 &NonBlockingInvalidator::Core::Initialize, | 175 &NonBlockingInvalidator::Core::Initialize, |
147 core_.get(), | 176 core_.get(), |
148 notifier_options, | 177 initialize_options))) { |
149 invalidator_client_id, | |
150 saved_invalidations, | |
151 invalidation_bootstrap_data, | |
152 invalidation_state_tracker, | |
153 client_info))) { | |
154 NOTREACHED(); | 178 NOTREACHED(); |
155 } | 179 } |
156 } | 180 } |
157 | 181 |
158 NonBlockingInvalidator::~NonBlockingInvalidator() { | 182 NonBlockingInvalidator::~NonBlockingInvalidator() { |
159 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 183 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
160 if (!network_task_runner_->PostTask( | 184 if (!network_task_runner_->PostTask( |
161 FROM_HERE, | 185 FROM_HERE, |
162 base::Bind(&NonBlockingInvalidator::Core::Teardown, | 186 base::Bind(&NonBlockingInvalidator::Core::Teardown, |
163 core_.get()))) { | 187 core_.get()))) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
209 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 233 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
210 registrar_.UpdateInvalidatorState(state); | 234 registrar_.UpdateInvalidatorState(state); |
211 } | 235 } |
212 | 236 |
213 void NonBlockingInvalidator::OnIncomingInvalidation( | 237 void NonBlockingInvalidator::OnIncomingInvalidation( |
214 const ObjectIdInvalidationMap& invalidation_map) { | 238 const ObjectIdInvalidationMap& invalidation_map) { |
215 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 239 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
216 registrar_.DispatchInvalidationsToHandlers(invalidation_map); | 240 registrar_.DispatchInvalidationsToHandlers(invalidation_map); |
217 } | 241 } |
218 | 242 |
243 NetworkChannelCreator | |
244 NonBlockingInvalidator::MakePushClientChannelCreator( | |
245 const notifier::NotifierOptions& notifier_options) { | |
246 return base::Bind(SyncNetworkChannel::CreatePushClientChannel, | |
247 notifier_options); | |
248 } | |
249 | |
250 NetworkChannelCreator | |
251 NonBlockingInvalidator::MakeGCMNetworkChannelCreator() { | |
252 return base::Bind(SyncNetworkChannel::CreateGCMNetworkChannel); | |
253 } | |
254 | |
219 } // namespace syncer | 255 } // namespace syncer |
OLD | NEW |