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 <cstddef> | 5 #include <cstddef> |
6 #include <cstdio> | 6 #include <cstdio> |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
12 #include "base/debug/stack_trace.h" | 12 #include "base/debug/stack_trace.h" |
13 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
14 #include "base/json/json_writer.h" | 14 #include "base/json/json_writer.h" |
15 #include "base/logging.h" | 15 #include "base/logging.h" |
16 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
17 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
18 #include "base/memory/weak_ptr.h" | 18 #include "base/memory/weak_ptr.h" |
19 #include "base/message_loop.h" | 19 #include "base/message_loop.h" |
20 #include "base/rand_util.h" | |
20 #include "base/task_runner.h" | 21 #include "base/task_runner.h" |
21 #include "base/threading/thread.h" | 22 #include "base/threading/thread.h" |
22 #include "jingle/notifier/base/notification_method.h" | 23 #include "jingle/notifier/base/notification_method.h" |
23 #include "jingle/notifier/base/notifier_options.h" | 24 #include "jingle/notifier/base/notifier_options.h" |
24 #include "net/base/host_port_pair.h" | 25 #include "net/base/host_port_pair.h" |
25 #include "net/base/network_change_notifier.h" | 26 #include "net/base/network_change_notifier.h" |
26 #include "net/dns/host_resolver.h" | 27 #include "net/dns/host_resolver.h" |
27 #include "net/http/transport_security_state.h" | 28 #include "net/http/transport_security_state.h" |
28 #include "net/url_request/url_request_test_util.h" | 29 #include "net/url_request/url_request_test_util.h" |
29 #include "sync/internal_api/public/base/model_type.h" | 30 #include "sync/internal_api/public/base/model_type.h" |
30 #include "sync/internal_api/public/base_node.h" | 31 #include "sync/internal_api/public/base_node.h" |
31 #include "sync/internal_api/public/engine/passive_model_worker.h" | 32 #include "sync/internal_api/public/engine/passive_model_worker.h" |
32 #include "sync/internal_api/public/http_bridge.h" | 33 #include "sync/internal_api/public/http_bridge.h" |
33 #include "sync/internal_api/public/internal_components_factory_impl.h" | 34 #include "sync/internal_api/public/internal_components_factory_impl.h" |
34 #include "sync/internal_api/public/read_node.h" | 35 #include "sync/internal_api/public/read_node.h" |
35 #include "sync/internal_api/public/sync_manager.h" | 36 #include "sync/internal_api/public/sync_manager.h" |
36 #include "sync/internal_api/public/sync_manager_factory.h" | 37 #include "sync/internal_api/public/sync_manager_factory.h" |
37 #include "sync/internal_api/public/util/report_unrecoverable_error_function.h" | 38 #include "sync/internal_api/public/util/report_unrecoverable_error_function.h" |
38 #include "sync/internal_api/public/util/unrecoverable_error_handler.h" | 39 #include "sync/internal_api/public/util/unrecoverable_error_handler.h" |
39 #include "sync/internal_api/public/util/weak_handle.h" | 40 #include "sync/internal_api/public/util/weak_handle.h" |
40 #include "sync/js/js_event_details.h" | 41 #include "sync/js/js_event_details.h" |
41 #include "sync/js/js_event_handler.h" | 42 #include "sync/js/js_event_handler.h" |
42 #include "sync/notifier/invalidation_state_tracker.h" | 43 #include "sync/notifier/invalidation_state_tracker.h" |
43 #include "sync/notifier/invalidator.h" | 44 #include "sync/notifier/non_blocking_invalidator.h" |
44 #include "sync/notifier/invalidator_factory.h" | |
45 #include "sync/test/fake_encryptor.h" | 45 #include "sync/test/fake_encryptor.h" |
46 #include "sync/tools/null_invalidation_state_tracker.h" | 46 #include "sync/tools/null_invalidation_state_tracker.h" |
47 | 47 |
48 #if defined(OS_MACOSX) | 48 #if defined(OS_MACOSX) |
49 #include "base/mac/scoped_nsautorelease_pool.h" | 49 #include "base/mac/scoped_nsautorelease_pool.h" |
50 #endif | 50 #endif |
51 | 51 |
52 // This is a simple utility that initializes a sync client and | 52 // This is a simple utility that initializes a sync client and |
53 // prints out any events. | 53 // prints out any events. |
54 | 54 |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
208 notifier_options.try_ssltcp_first = | 208 notifier_options.try_ssltcp_first = |
209 command_line.HasSwitch(kXmppTrySslTcpFirstSwitch); | 209 command_line.HasSwitch(kXmppTrySslTcpFirstSwitch); |
210 LOG_IF(INFO, notifier_options.try_ssltcp_first) | 210 LOG_IF(INFO, notifier_options.try_ssltcp_first) |
211 << "Trying SSL/TCP port before XMPP port for notifications."; | 211 << "Trying SSL/TCP port before XMPP port for notifications."; |
212 | 212 |
213 notifier_options.allow_insecure_connection = | 213 notifier_options.allow_insecure_connection = |
214 command_line.HasSwitch(kXmppAllowInsecureConnectionSwitch); | 214 command_line.HasSwitch(kXmppAllowInsecureConnectionSwitch); |
215 LOG_IF(INFO, notifier_options.allow_insecure_connection) | 215 LOG_IF(INFO, notifier_options.allow_insecure_connection) |
216 << "Allowing insecure XMPP connections."; | 216 << "Allowing insecure XMPP connections."; |
217 | 217 |
218 if (command_line.HasSwitch(kNotificationMethodSwitch)) { | 218 return notifier_options; |
219 notifier_options.notification_method = | 219 } |
220 notifier::StringToNotificationMethod( | |
221 command_line.GetSwitchValueASCII(kNotificationMethodSwitch)); | |
222 } | |
223 | 220 |
224 return notifier_options; | 221 void StubNetworkTimeUpdateCallback(const base::Time&, |
222 const base::TimeDelta&, | |
223 const base::TimeDelta&) { | |
225 } | 224 } |
226 | 225 |
227 int SyncClientMain(int argc, char* argv[]) { | 226 int SyncClientMain(int argc, char* argv[]) { |
228 #if defined(OS_MACOSX) | 227 #if defined(OS_MACOSX) |
229 base::mac::ScopedNSAutoreleasePool pool; | 228 base::mac::ScopedNSAutoreleasePool pool; |
230 #endif | 229 #endif |
231 base::AtExitManager exit_manager; | 230 base::AtExitManager exit_manager; |
232 CommandLine::Init(argc, argv); | 231 CommandLine::Init(argc, argv); |
233 logging::InitLogging( | 232 logging::InitLogging( |
234 NULL, | 233 NULL, |
(...skipping 11 matching lines...) Expand all Loading... | |
246 // Parse command line. | 245 // Parse command line. |
247 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 246 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
248 SyncCredentials credentials; | 247 SyncCredentials credentials; |
249 credentials.email = command_line.GetSwitchValueASCII(kEmailSwitch); | 248 credentials.email = command_line.GetSwitchValueASCII(kEmailSwitch); |
250 credentials.sync_token = command_line.GetSwitchValueASCII(kTokenSwitch); | 249 credentials.sync_token = command_line.GetSwitchValueASCII(kTokenSwitch); |
251 // TODO(akalin): Write a wrapper script that gets a token for an | 250 // TODO(akalin): Write a wrapper script that gets a token for an |
252 // email and password and passes that in to this utility. | 251 // email and password and passes that in to this utility. |
253 if (credentials.email.empty() || credentials.sync_token.empty()) { | 252 if (credentials.email.empty() || credentials.sync_token.empty()) { |
254 std::printf("Usage: %s --%s=foo@bar.com --%s=token\n" | 253 std::printf("Usage: %s --%s=foo@bar.com --%s=token\n" |
255 "[--%s=host:port] [--%s] [--%s]\n" | 254 "[--%s=host:port] [--%s] [--%s]\n" |
256 "[--%s=(server|p2p)]\n\n" | |
257 "Run chrome and set a breakpoint on\n" | 255 "Run chrome and set a breakpoint on\n" |
258 "syncer::SyncManagerImpl::UpdateCredentials() " | 256 "syncer::SyncManagerImpl::UpdateCredentials() " |
259 "after logging into\n" | 257 "after logging into\n" |
260 "sync to get the token to pass into this utility.\n", | 258 "sync to get the token to pass into this utility.\n", |
261 argv[0], | 259 argv[0], |
262 kEmailSwitch, kTokenSwitch, kXmppHostPortSwitch, | 260 kEmailSwitch, kTokenSwitch, kXmppHostPortSwitch, |
263 kXmppTrySslTcpFirstSwitch, | 261 kXmppTrySslTcpFirstSwitch, |
264 kXmppAllowInsecureConnectionSwitch, | 262 kXmppAllowInsecureConnectionSwitch); |
265 kNotificationMethodSwitch); | |
266 return -1; | 263 return -1; |
267 } | 264 } |
268 | 265 |
269 // Set up objects that monitor the network. | 266 // Set up objects that monitor the network. |
270 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier( | 267 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier( |
271 net::NetworkChangeNotifier::Create()); | 268 net::NetworkChangeNotifier::Create()); |
272 | 269 |
273 // Set up sync notifier factory. | 270 // Set up sync notifier factory. |
274 const scoped_refptr<MyTestURLRequestContextGetter> context_getter = | 271 const scoped_refptr<MyTestURLRequestContextGetter> context_getter = |
275 new MyTestURLRequestContextGetter(io_thread.message_loop_proxy()); | 272 new MyTestURLRequestContextGetter(io_thread.message_loop_proxy()); |
276 const notifier::NotifierOptions& notifier_options = | 273 const notifier::NotifierOptions& notifier_options = |
277 ParseNotifierOptions(command_line, context_getter); | 274 ParseNotifierOptions(command_line, context_getter); |
278 const char kClientInfo[] = "sync_listen_notifications"; | 275 const char kClientInfo[] = "standalone_sync_client"; |
276 std::string invalidator_id = base::RandBytesAsString(8); | |
279 NullInvalidationStateTracker null_invalidation_state_tracker; | 277 NullInvalidationStateTracker null_invalidation_state_tracker; |
280 InvalidatorFactory invalidator_factory( | 278 Invalidator* invalidator = new NonBlockingInvalidator( |
akalin
2013/05/24 22:58:46
what owns the invalidator?
rlarocque
2013/05/29 00:37:55
In this patch, no one owns it. I'll change this t
akalin
2013/06/04 19:23:54
Yeah, there's no graceful shutdown. But it's good
| |
281 notifier_options, kClientInfo, | 279 notifier_options, |
282 null_invalidation_state_tracker.AsWeakPtr()); | 280 invalidator_id, |
281 null_invalidation_state_tracker.GetAllInvalidationStates(), | |
282 null_invalidation_state_tracker.GetBootstrapData(), | |
283 WeakHandle<InvalidationStateTracker>( | |
284 null_invalidation_state_tracker.AsWeakPtr()), | |
285 kClientInfo); | |
283 | 286 |
284 // Set up database directory for the syncer. | 287 // Set up database directory for the syncer. |
285 base::ScopedTempDir database_dir; | 288 base::ScopedTempDir database_dir; |
286 CHECK(database_dir.CreateUniqueTempDir()); | 289 CHECK(database_dir.CreateUniqueTempDir()); |
287 | 290 |
288 // Set up model type parameters. | 291 // Developers often add types to ModelTypeSet::All() before the server |
289 const ModelTypeSet model_types = ModelTypeSet::All(); | 292 // supports them. We need to be explicit about which types we want here. |
293 ModelTypeSet model_types; | |
294 model_types.Put(BOOKMARKS); | |
295 model_types.Put(PREFERENCES); | |
296 model_types.Put(PASSWORDS); | |
297 model_types.Put(AUTOFILL); | |
298 model_types.Put(THEMES); | |
299 model_types.Put(TYPED_URLS); | |
300 model_types.Put(EXTENSIONS); | |
301 model_types.Put(NIGORI); | |
302 model_types.Put(SEARCH_ENGINES); | |
303 model_types.Put(SESSIONS); | |
304 model_types.Put(APPS); | |
305 model_types.Put(AUTOFILL_PROFILE); | |
306 model_types.Put(APP_SETTINGS); | |
307 model_types.Put(EXTENSION_SETTINGS); | |
308 model_types.Put(APP_NOTIFICATIONS); | |
309 model_types.Put(HISTORY_DELETE_DIRECTIVES); | |
310 model_types.Put(SYNCED_NOTIFICATIONS); | |
311 model_types.Put(DEVICE_INFO); | |
312 model_types.Put(EXPERIMENTS); | |
313 model_types.Put(PRIORITY_PREFERENCES); | |
314 model_types.Put(DICTIONARY); | |
315 model_types.Put(FAVICON_IMAGES); | |
316 model_types.Put(FAVICON_TRACKING); | |
317 | |
290 ModelSafeRoutingInfo routing_info; | 318 ModelSafeRoutingInfo routing_info; |
291 for (ModelTypeSet::Iterator it = model_types.First(); | 319 for (ModelTypeSet::Iterator it = model_types.First(); |
292 it.Good(); it.Inc()) { | 320 it.Good(); it.Inc()) { |
293 routing_info[it.Get()] = GROUP_PASSIVE; | 321 routing_info[it.Get()] = GROUP_PASSIVE; |
294 } | 322 } |
295 scoped_refptr<PassiveModelWorker> passive_model_safe_worker = | 323 scoped_refptr<PassiveModelWorker> passive_model_safe_worker = |
296 new PassiveModelWorker(&sync_loop); | 324 new PassiveModelWorker(&sync_loop); |
297 std::vector<ModelSafeWorker*> workers; | 325 std::vector<ModelSafeWorker*> workers; |
298 workers.push_back(passive_model_safe_worker.get()); | 326 workers.push_back(passive_model_safe_worker.get()); |
299 | 327 |
300 // Set up sync manager. | 328 // Set up sync manager. |
301 SyncManagerFactory sync_manager_factory; | 329 SyncManagerFactory sync_manager_factory; |
302 scoped_ptr<SyncManager> sync_manager = | 330 scoped_ptr<SyncManager> sync_manager = |
303 sync_manager_factory.CreateSyncManager("sync_client manager"); | 331 sync_manager_factory.CreateSyncManager("sync_client manager"); |
304 LoggingJsEventHandler js_event_handler; | 332 LoggingJsEventHandler js_event_handler; |
305 const char kSyncServerAndPath[] = "clients4.google.com/chrome-sync/dev"; | 333 const char kSyncServerAndPath[] = "clients4.google.com/chrome-sync/dev"; |
306 int kSyncServerPort = 443; | 334 int kSyncServerPort = 443; |
307 bool kUseSsl = true; | 335 bool kUseSsl = true; |
308 // Used only by InitialProcessMetadata(), so it's okay to leave this as NULL. | 336 // Used only by InitialProcessMetadata(), so it's okay to leave this as NULL. |
309 const scoped_refptr<base::TaskRunner> blocking_task_runner = NULL; | 337 const scoped_refptr<base::TaskRunner> blocking_task_runner = NULL; |
310 const char kUserAgent[] = "sync_client"; | 338 const char kUserAgent[] = "sync_client"; |
311 // TODO(akalin): Replace this with just the context getter once | 339 // TODO(akalin): Replace this with just the context getter once |
312 // HttpPostProviderFactory is removed. | 340 // HttpPostProviderFactory is removed. |
313 scoped_ptr<HttpPostProviderFactory> post_factory( | 341 scoped_ptr<HttpPostProviderFactory> post_factory( |
314 new HttpBridgeFactory(context_getter, | 342 new HttpBridgeFactory(context_getter, |
315 kUserAgent, | 343 kUserAgent, |
316 NetworkTimeUpdateCallback())); | 344 base::Bind(&StubNetworkTimeUpdateCallback))); |
317 // Used only when committing bookmarks, so it's okay to leave this | 345 // Used only when committing bookmarks, so it's okay to leave this |
318 // as NULL. | 346 // as NULL. |
319 ExtensionsActivityMonitor* extensions_activity_monitor = NULL; | 347 ExtensionsActivityMonitor* extensions_activity_monitor = NULL; |
320 LoggingChangeDelegate change_delegate; | 348 LoggingChangeDelegate change_delegate; |
321 const char kRestoredKeyForBootstrapping[] = ""; | 349 const char kRestoredKeyForBootstrapping[] = ""; |
322 const char kRestoredKeystoreKeyForBootstrapping[] = ""; | 350 const char kRestoredKeystoreKeyForBootstrapping[] = ""; |
323 NullEncryptor null_encryptor; | 351 NullEncryptor null_encryptor; |
324 LoggingUnrecoverableErrorHandler unrecoverable_error_handler; | 352 LoggingUnrecoverableErrorHandler unrecoverable_error_handler; |
325 InternalComponentsFactoryImpl::Switches factory_switches = { | 353 InternalComponentsFactoryImpl::Switches factory_switches = { |
326 InternalComponentsFactory::ENCRYPTION_KEYSTORE, | 354 InternalComponentsFactory::ENCRYPTION_KEYSTORE, |
327 InternalComponentsFactory::BACKOFF_NORMAL | 355 InternalComponentsFactory::BACKOFF_NORMAL |
328 }; | 356 }; |
329 | 357 |
330 sync_manager->Init(database_dir.path(), | 358 sync_manager->Init(database_dir.path(), |
331 WeakHandle<JsEventHandler>( | 359 WeakHandle<JsEventHandler>( |
332 js_event_handler.AsWeakPtr()), | 360 js_event_handler.AsWeakPtr()), |
333 kSyncServerAndPath, | 361 kSyncServerAndPath, |
334 kSyncServerPort, | 362 kSyncServerPort, |
335 kUseSsl, | 363 kUseSsl, |
336 post_factory.Pass(), | 364 post_factory.Pass(), |
337 workers, | 365 workers, |
338 extensions_activity_monitor, | 366 extensions_activity_monitor, |
339 &change_delegate, | 367 &change_delegate, |
340 credentials, | 368 credentials, |
341 scoped_ptr<Invalidator>( | 369 invalidator_id, |
342 invalidator_factory.CreateInvalidator()), | |
343 invalidator_factory.GetInvalidatorClientId(), | |
344 kRestoredKeyForBootstrapping, | 370 kRestoredKeyForBootstrapping, |
345 kRestoredKeystoreKeyForBootstrapping, | 371 kRestoredKeystoreKeyForBootstrapping, |
346 scoped_ptr<InternalComponentsFactory>( | 372 scoped_ptr<InternalComponentsFactory>( |
347 new InternalComponentsFactoryImpl(factory_switches)), | 373 new InternalComponentsFactoryImpl(factory_switches)), |
348 &null_encryptor, | 374 &null_encryptor, |
349 &unrecoverable_error_handler, | 375 &unrecoverable_error_handler, |
350 &LogUnrecoverableErrorContext); | 376 &LogUnrecoverableErrorContext); |
351 // TODO(akalin): Avoid passing in model parameters multiple times by | 377 // TODO(akalin): Avoid passing in model parameters multiple times by |
352 // organizing handling of model types. | 378 // organizing handling of model types. |
353 sync_manager->UpdateEnabledTypes(model_types); | 379 invalidator->UpdateCredentials(credentials.email, credentials.sync_token); |
380 invalidator->RegisterHandler(sync_manager.get()); | |
381 invalidator->UpdateRegisteredIds( | |
382 sync_manager.get(), ModelTypeSetToObjectIdSet(model_types)); | |
354 sync_manager->StartSyncingNormally(routing_info); | 383 sync_manager->StartSyncingNormally(routing_info); |
355 | 384 |
356 sync_loop.Run(); | 385 sync_loop.Run(); |
357 | 386 |
358 io_thread.Stop(); | 387 io_thread.Stop(); |
359 return 0; | 388 return 0; |
360 } | 389 } |
361 | 390 |
362 } // namespace | 391 } // namespace |
363 } // namespace syncer | 392 } // namespace syncer |
364 | 393 |
365 int main(int argc, char* argv[]) { | 394 int main(int argc, char* argv[]) { |
366 return syncer::SyncClientMain(argc, argv); | 395 return syncer::SyncClientMain(argc, argv); |
367 } | 396 } |
OLD | NEW |