OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 entry. | 3 // found in the LICENSE entry. |
4 | 4 |
5 #include "chrome/browser/sync/engine/syncer.h" | 5 #include "chrome/browser/sync/engine/syncer.h" |
6 | 6 |
7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "chrome/browser/chrome_thread.h" | 9 #include "chrome/browser/chrome_thread.h" |
10 #include "chrome/browser/sync/engine/apply_updates_command.h" | 10 #include "chrome/browser/sync/engine/apply_updates_command.h" |
11 #include "chrome/browser/sync/engine/build_and_process_conflict_sets_command.h" | 11 #include "chrome/browser/sync/engine/build_and_process_conflict_sets_command.h" |
12 #include "chrome/browser/sync/engine/build_commit_command.h" | 12 #include "chrome/browser/sync/engine/build_commit_command.h" |
13 #include "chrome/browser/sync/engine/conflict_resolver.h" | 13 #include "chrome/browser/sync/engine/conflict_resolver.h" |
14 #include "chrome/browser/sync/engine/download_updates_command.h" | 14 #include "chrome/browser/sync/engine/download_updates_command.h" |
15 #include "chrome/browser/sync/engine/get_commit_ids_command.h" | 15 #include "chrome/browser/sync/engine/get_commit_ids_command.h" |
16 #include "chrome/browser/sync/engine/net/server_connection_manager.h" | 16 #include "chrome/browser/sync/engine/net/server_connection_manager.h" |
17 #include "chrome/browser/sync/engine/post_commit_message_command.h" | 17 #include "chrome/browser/sync/engine/post_commit_message_command.h" |
18 #include "chrome/browser/sync/engine/process_commit_response_command.h" | 18 #include "chrome/browser/sync/engine/process_commit_response_command.h" |
19 #include "chrome/browser/sync/engine/process_updates_command.h" | 19 #include "chrome/browser/sync/engine/process_updates_command.h" |
20 #include "chrome/browser/sync/engine/resolve_conflicts_command.h" | 20 #include "chrome/browser/sync/engine/resolve_conflicts_command.h" |
21 #include "chrome/browser/sync/engine/syncer_end_command.h" | 21 #include "chrome/browser/sync/engine/syncer_end_command.h" |
22 #include "chrome/browser/sync/engine/syncer_types.h" | 22 #include "chrome/browser/sync/engine/syncer_types.h" |
23 #include "chrome/browser/sync/engine/syncer_util.h" | 23 #include "chrome/browser/sync/engine/syncer_util.h" |
24 #include "chrome/browser/sync/engine/syncproto.h" | 24 #include "chrome/browser/sync/engine/syncproto.h" |
25 #include "chrome/browser/sync/engine/verify_updates_command.h" | 25 #include "chrome/browser/sync/engine/verify_updates_command.h" |
26 #include "chrome/browser/sync/syncable/directory_manager.h" | 26 #include "chrome/browser/sync/syncable/directory_manager.h" |
27 #include "chrome/browser/sync/syncable/syncable-inl.h" | 27 #include "chrome/browser/sync/syncable/syncable-inl.h" |
28 #include "chrome/browser/sync/syncable/syncable.h" | 28 #include "chrome/browser/sync/syncable/syncable.h" |
| 29 #include "chrome/browser/sync/util/closure.h" |
29 | 30 |
30 using sync_pb::ClientCommand; | 31 using sync_pb::ClientCommand; |
31 using syncable::Blob; | 32 using syncable::Blob; |
32 using syncable::IS_UNAPPLIED_UPDATE; | 33 using syncable::IS_UNAPPLIED_UPDATE; |
33 using syncable::SERVER_BOOKMARK_FAVICON; | 34 using syncable::SERVER_BOOKMARK_FAVICON; |
34 using syncable::SERVER_BOOKMARK_URL; | 35 using syncable::SERVER_BOOKMARK_URL; |
35 using syncable::SERVER_CTIME; | 36 using syncable::SERVER_CTIME; |
36 using syncable::SERVER_IS_BOOKMARK_OBJECT; | 37 using syncable::SERVER_IS_BOOKMARK_OBJECT; |
37 using syncable::SERVER_IS_DEL; | 38 using syncable::SERVER_IS_DEL; |
38 using syncable::SERVER_IS_DIR; | 39 using syncable::SERVER_IS_DIR; |
39 using syncable::SERVER_MTIME; | 40 using syncable::SERVER_MTIME; |
40 using syncable::SERVER_NAME; | |
41 using syncable::SERVER_NON_UNIQUE_NAME; | 41 using syncable::SERVER_NON_UNIQUE_NAME; |
42 using syncable::SERVER_PARENT_ID; | 42 using syncable::SERVER_PARENT_ID; |
43 using syncable::SERVER_POSITION_IN_PARENT; | 43 using syncable::SERVER_POSITION_IN_PARENT; |
44 using syncable::SERVER_VERSION; | 44 using syncable::SERVER_VERSION; |
45 using syncable::SYNCER; | 45 using syncable::SYNCER; |
46 using syncable::ScopedDirLookup; | 46 using syncable::ScopedDirLookup; |
47 using syncable::WriteTransaction; | 47 using syncable::WriteTransaction; |
48 | 48 |
49 namespace browser_sync { | 49 namespace browser_sync { |
50 | 50 |
51 Syncer::Syncer( | 51 Syncer::Syncer( |
52 syncable::DirectoryManager* dirman, | 52 syncable::DirectoryManager* dirman, |
53 const PathString& account_name, | 53 const PathString& account_name, |
54 ServerConnectionManager* connection_manager, | 54 ServerConnectionManager* connection_manager, |
55 ModelSafeWorker* model_safe_worker) | 55 ModelSafeWorker* model_safe_worker) |
56 : account_name_(account_name), | 56 : account_name_(account_name), |
57 early_exit_requested_(false), | 57 early_exit_requested_(false), |
58 max_commit_batch_size_(kDefaultMaxCommitBatchSize), | 58 max_commit_batch_size_(kDefaultMaxCommitBatchSize), |
59 connection_manager_(connection_manager), | 59 connection_manager_(connection_manager), |
60 dirman_(dirman), | 60 dirman_(dirman), |
61 command_channel_(NULL), | 61 command_channel_(NULL), |
62 model_safe_worker_(model_safe_worker), | 62 model_safe_worker_(model_safe_worker), |
63 updates_source_(sync_pb::GetUpdatesCallerInfo::UNKNOWN), | 63 updates_source_(sync_pb::GetUpdatesCallerInfo::UNKNOWN), |
64 notifications_enabled_(false), | 64 notifications_enabled_(false), |
65 pre_conflict_resolution_function_(NULL) { | 65 pre_conflict_resolution_closure_(NULL) { |
66 SyncerEvent shutdown = { SyncerEvent::SHUTDOWN_USE_WITH_CARE }; | 66 SyncerEvent shutdown = { SyncerEvent::SHUTDOWN_USE_WITH_CARE }; |
67 syncer_event_channel_.reset(new SyncerEventChannel(shutdown)); | 67 syncer_event_channel_.reset(new SyncerEventChannel(shutdown)); |
68 shutdown_channel_.reset(new ShutdownChannel(this)); | 68 shutdown_channel_.reset(new ShutdownChannel(this)); |
69 | 69 |
70 extensions_monitor_ = new ExtensionsActivityMonitor(); | 70 extensions_monitor_ = new ExtensionsActivityMonitor(); |
71 | 71 |
72 ScopedDirLookup dir(dirman_, account_name_); | 72 ScopedDirLookup dir(dirman_, account_name_); |
73 // The directory must be good here. | 73 // The directory must be good here. |
74 CHECK(dir.good()); | 74 CHECK(dir.good()); |
75 } | 75 } |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 build_process_conflict_sets.Execute(session); | 238 build_process_conflict_sets.Execute(session); |
239 if (session->conflict_sets_built()) | 239 if (session->conflict_sets_built()) |
240 next_step = SYNCER_END; | 240 next_step = SYNCER_END; |
241 else | 241 else |
242 next_step = RESOLVE_CONFLICTS; | 242 next_step = RESOLVE_CONFLICTS; |
243 break; | 243 break; |
244 } | 244 } |
245 case RESOLVE_CONFLICTS: { | 245 case RESOLVE_CONFLICTS: { |
246 LOG(INFO) << "Resolving Conflicts"; | 246 LOG(INFO) << "Resolving Conflicts"; |
247 | 247 |
248 // Trigger the pre_conflict_resolution_function_, which is a testing | 248 // Trigger the pre_conflict_resolution_closure_, which is a testing |
249 // hook for the unit tests, if it is non-NULL. | 249 // hook for the unit tests, if it is non-NULL. |
250 if (pre_conflict_resolution_function_) { | 250 if (pre_conflict_resolution_closure_) { |
251 ScopedDirLookup dir(dirman_, account_name_); | 251 pre_conflict_resolution_closure_->Run(); |
252 if (!dir.good()) { | |
253 LOG(ERROR) << "Bad dir lookup in syncer loop"; | |
254 return; | |
255 } | |
256 pre_conflict_resolution_function_(dir); | |
257 } | 252 } |
258 | 253 |
259 ResolveConflictsCommand resolve_conflicts_command; | 254 ResolveConflictsCommand resolve_conflicts_command; |
260 resolve_conflicts_command.Execute(session); | 255 resolve_conflicts_command.Execute(session); |
261 if (session->HasConflictingUpdates()) | 256 if (session->HasConflictingUpdates()) |
262 next_step = APPLY_UPDATES_TO_RESOLVE_CONFLICTS; | 257 next_step = APPLY_UPDATES_TO_RESOLVE_CONFLICTS; |
263 else | 258 else |
264 next_step = SYNCER_END; | 259 next_step = SYNCER_END; |
265 break; | 260 break; |
266 } | 261 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 const ClientCommand command = session->update_response().client_command(); | 300 const ClientCommand command = session->update_response().client_command(); |
306 if (command_channel_) | 301 if (command_channel_) |
307 command_channel_->NotifyListeners(&command); | 302 command_channel_->NotifyListeners(&command); |
308 | 303 |
309 // The server limits the number of items a client can commit in one batch. | 304 // The server limits the number of items a client can commit in one batch. |
310 if (command.has_max_commit_batch_size()) | 305 if (command.has_max_commit_batch_size()) |
311 max_commit_batch_size_ = command.max_commit_batch_size(); | 306 max_commit_batch_size_ = command.max_commit_batch_size(); |
312 } | 307 } |
313 | 308 |
314 void CopyServerFields(syncable::Entry* src, syncable::MutableEntry* dest) { | 309 void CopyServerFields(syncable::Entry* src, syncable::MutableEntry* dest) { |
315 dest->Put(SERVER_NAME, src->Get(SERVER_NAME)); | |
316 dest->Put(SERVER_NON_UNIQUE_NAME, src->Get(SERVER_NON_UNIQUE_NAME)); | 310 dest->Put(SERVER_NON_UNIQUE_NAME, src->Get(SERVER_NON_UNIQUE_NAME)); |
317 dest->Put(SERVER_PARENT_ID, src->Get(SERVER_PARENT_ID)); | 311 dest->Put(SERVER_PARENT_ID, src->Get(SERVER_PARENT_ID)); |
318 dest->Put(SERVER_MTIME, src->Get(SERVER_MTIME)); | 312 dest->Put(SERVER_MTIME, src->Get(SERVER_MTIME)); |
319 dest->Put(SERVER_CTIME, src->Get(SERVER_CTIME)); | 313 dest->Put(SERVER_CTIME, src->Get(SERVER_CTIME)); |
320 dest->Put(SERVER_VERSION, src->Get(SERVER_VERSION)); | 314 dest->Put(SERVER_VERSION, src->Get(SERVER_VERSION)); |
321 dest->Put(SERVER_IS_DIR, src->Get(SERVER_IS_DIR)); | 315 dest->Put(SERVER_IS_DIR, src->Get(SERVER_IS_DIR)); |
322 dest->Put(SERVER_IS_DEL, src->Get(SERVER_IS_DEL)); | 316 dest->Put(SERVER_IS_DEL, src->Get(SERVER_IS_DEL)); |
323 dest->Put(SERVER_IS_BOOKMARK_OBJECT, src->Get(SERVER_IS_BOOKMARK_OBJECT)); | 317 dest->Put(SERVER_IS_BOOKMARK_OBJECT, src->Get(SERVER_IS_BOOKMARK_OBJECT)); |
324 dest->Put(IS_UNAPPLIED_UPDATE, src->Get(IS_UNAPPLIED_UPDATE)); | 318 dest->Put(IS_UNAPPLIED_UPDATE, src->Get(IS_UNAPPLIED_UPDATE)); |
325 dest->Put(SERVER_BOOKMARK_URL, src->Get(SERVER_BOOKMARK_URL)); | 319 dest->Put(SERVER_BOOKMARK_URL, src->Get(SERVER_BOOKMARK_URL)); |
326 dest->Put(SERVER_BOOKMARK_FAVICON, src->Get(SERVER_BOOKMARK_FAVICON)); | 320 dest->Put(SERVER_BOOKMARK_FAVICON, src->Get(SERVER_BOOKMARK_FAVICON)); |
327 dest->Put(SERVER_POSITION_IN_PARENT, src->Get(SERVER_POSITION_IN_PARENT)); | 321 dest->Put(SERVER_POSITION_IN_PARENT, src->Get(SERVER_POSITION_IN_PARENT)); |
328 } | 322 } |
329 | 323 |
330 void ClearServerData(syncable::MutableEntry* entry) { | 324 void ClearServerData(syncable::MutableEntry* entry) { |
331 entry->Put(SERVER_NAME, PSTR("")); | |
332 entry->Put(SERVER_NON_UNIQUE_NAME, PSTR("")); | 325 entry->Put(SERVER_NON_UNIQUE_NAME, PSTR("")); |
333 entry->Put(SERVER_PARENT_ID, syncable::kNullId); | 326 entry->Put(SERVER_PARENT_ID, syncable::kNullId); |
334 entry->Put(SERVER_MTIME, 0); | 327 entry->Put(SERVER_MTIME, 0); |
335 entry->Put(SERVER_CTIME, 0); | 328 entry->Put(SERVER_CTIME, 0); |
336 entry->Put(SERVER_VERSION, 0); | 329 entry->Put(SERVER_VERSION, 0); |
337 entry->Put(SERVER_IS_DIR, false); | 330 entry->Put(SERVER_IS_DIR, false); |
338 entry->Put(SERVER_IS_DEL, false); | 331 entry->Put(SERVER_IS_DEL, false); |
339 entry->Put(SERVER_IS_BOOKMARK_OBJECT, false); | 332 entry->Put(SERVER_IS_BOOKMARK_OBJECT, false); |
340 entry->Put(IS_UNAPPLIED_UPDATE, false); | 333 entry->Put(IS_UNAPPLIED_UPDATE, false); |
341 entry->Put(SERVER_BOOKMARK_URL, PSTR("")); | 334 entry->Put(SERVER_BOOKMARK_URL, PSTR("")); |
(...skipping 11 matching lines...) Expand all Loading... |
353 entry.id_string().c_str(), | 346 entry.id_string().c_str(), |
354 entry.parent_id_string().c_str(), | 347 entry.parent_id_string().c_str(), |
355 entry.version(), | 348 entry.version(), |
356 entry.mtime(), ServerTimeToClientTime(entry.mtime()), | 349 entry.mtime(), ServerTimeToClientTime(entry.mtime()), |
357 entry.ctime(), ServerTimeToClientTime(entry.ctime()), | 350 entry.ctime(), ServerTimeToClientTime(entry.ctime()), |
358 entry.name().c_str(), entry.sync_timestamp(), | 351 entry.name().c_str(), entry.sync_timestamp(), |
359 entry.deleted() ? "deleted, ":""); | 352 entry.deleted() ? "deleted, ":""); |
360 } | 353 } |
361 | 354 |
362 } // namespace browser_sync | 355 } // namespace browser_sync |
OLD | NEW |