Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/sync/engine/syncer_util.h" | 5 #include "chrome/browser/sync/engine/syncer_util.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 326 // Passwords use their own legacy encryption scheme. | 326 // Passwords use their own legacy encryption scheme. |
| 327 const sync_pb::PasswordSpecifics& password = | 327 const sync_pb::PasswordSpecifics& password = |
| 328 specifics.GetExtension(sync_pb::password); | 328 specifics.GetExtension(sync_pb::password); |
| 329 if (!cryptographer->CanDecrypt(password.encrypted())) { | 329 if (!cryptographer->CanDecrypt(password.encrypted())) { |
| 330 DVLOG(1) << "Received an undecryptable password update, returning " | 330 DVLOG(1) << "Received an undecryptable password update, returning " |
| 331 << "encryption_conflict."; | 331 << "encryption_conflict."; |
| 332 return CONFLICT_ENCRYPTION; | 332 return CONFLICT_ENCRYPTION; |
| 333 } | 333 } |
| 334 } | 334 } |
| 335 | 335 |
| 336 if (entry->Get(IS_UNSYNCED)) { | |
| 337 DVLOG(1) << "Skipping update, returning conflict for: " << id | |
| 338 << " ; it's unsynced."; | |
| 339 return CONFLICT; | |
| 340 } | |
| 341 if (!entry->Get(SERVER_IS_DEL)) { | 336 if (!entry->Get(SERVER_IS_DEL)) { |
| 342 syncable::Id new_parent = entry->Get(SERVER_PARENT_ID); | 337 syncable::Id new_parent = entry->Get(SERVER_PARENT_ID); |
| 343 Entry parent(trans, GET_BY_ID, new_parent); | 338 Entry parent(trans, GET_BY_ID, new_parent); |
| 344 // A note on non-directory parents: | 339 // A note on non-directory parents: |
| 345 // We catch most unfixable tree invariant errors at update receipt time, | 340 // We catch most unfixable tree invariant errors at update receipt time, |
| 346 // however we deal with this case here because we may receive the child | 341 // however we deal with this case here because we may receive the child |
| 347 // first then the illegal parent. Instead of dealing with it twice in | 342 // first then the illegal parent. Instead of dealing with it twice in |
| 348 // different ways we deal with it once here to reduce the amount of code and | 343 // different ways we deal with it once here to reduce the amount of code and |
| 349 // potential errors. | 344 // potential errors. |
| 350 if (!parent.good() || parent.Get(IS_DEL) || !parent.Get(IS_DIR)) { | 345 if (!parent.good() || parent.Get(IS_DEL) || !parent.Get(IS_DIR)) { |
| 351 return CONFLICT; | 346 return HIERARCHY_CONFLICT; |
|
rlarocque
2012/01/31 19:12:17
There is a subtle side-effect to this change, whic
Nicolas Zea
2012/02/01 19:16:19
So I'm clear, the only side effect here is that we
rlarocque
2012/02/02 00:32:56
Yes, that is correct.
| |
| 352 } | 347 } |
| 353 if (entry->Get(PARENT_ID) != new_parent) { | 348 if (entry->Get(PARENT_ID) != new_parent) { |
| 354 if (!entry->Get(IS_DEL) && !IsLegalNewParent(trans, id, new_parent)) { | 349 if (!entry->Get(IS_DEL) && !IsLegalNewParent(trans, id, new_parent)) { |
| 355 DVLOG(1) << "Not updating item " << id | 350 DVLOG(1) << "Not updating item " << id |
| 356 << ", illegal new parent (would cause loop)."; | 351 << ", illegal new parent (would cause loop)."; |
| 357 return CONFLICT; | 352 return HIERARCHY_CONFLICT; |
| 358 } | 353 } |
| 359 } | 354 } |
| 360 } else if (entry->Get(IS_DIR)) { | 355 } else if (entry->Get(IS_DIR)) { |
| 361 Directory::ChildHandles handles; | 356 Directory::ChildHandles handles; |
| 362 trans->directory()->GetChildHandlesById(trans, id, &handles); | 357 trans->directory()->GetChildHandlesById(trans, id, &handles); |
| 363 if (!handles.empty()) { | 358 if (!handles.empty()) { |
| 364 // If we have still-existing children, then we need to deal with | 359 // If we have still-existing children, then we need to deal with |
| 365 // them before we can process this change. | 360 // them before we can process this change. |
| 366 DVLOG(1) << "Not deleting directory; it's not empty " << *entry; | 361 DVLOG(1) << "Not deleting directory; it's not empty " << *entry; |
| 367 return CONFLICT; | 362 return HIERARCHY_CONFLICT; |
| 368 } | 363 } |
| 369 } | 364 } |
| 370 | 365 |
| 366 if (entry->Get(IS_UNSYNCED)) { | |
|
rlarocque
2012/01/31 19:12:17
This was moved down here because it's important th
| |
| 367 DVLOG(1) << "Skipping update, returning conflict for: " << id | |
| 368 << " ; it's unsynced."; | |
| 369 return CONFLICT; | |
| 370 } | |
| 371 | |
| 371 if (specifics.has_encrypted()) { | 372 if (specifics.has_encrypted()) { |
| 372 DVLOG(2) << "Received a decryptable " | 373 DVLOG(2) << "Received a decryptable " |
| 373 << syncable::ModelTypeToString(entry->GetServerModelType()) | 374 << syncable::ModelTypeToString(entry->GetServerModelType()) |
| 374 << " update, applying normally."; | 375 << " update, applying normally."; |
| 375 } else { | 376 } else { |
| 376 DVLOG(2) << "Received an unencrypted " | 377 DVLOG(2) << "Received an unencrypted " |
| 377 << syncable::ModelTypeToString(entry->GetServerModelType()) | 378 << syncable::ModelTypeToString(entry->GetServerModelType()) |
| 378 << " update, applying normally."; | 379 << " update, applying normally."; |
| 379 } | 380 } |
| 380 | 381 |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 771 if (update.version() < target->Get(SERVER_VERSION)) { | 772 if (update.version() < target->Get(SERVER_VERSION)) { |
| 772 LOG(WARNING) << "Update older than current server version for " | 773 LOG(WARNING) << "Update older than current server version for " |
| 773 << *target << " Update:" | 774 << *target << " Update:" |
| 774 << SyncerProtoUtil::SyncEntityDebugString(update); | 775 << SyncerProtoUtil::SyncEntityDebugString(update); |
| 775 return VERIFY_SUCCESS; // Expected in new sync protocol. | 776 return VERIFY_SUCCESS; // Expected in new sync protocol. |
| 776 } | 777 } |
| 777 return VERIFY_UNDECIDED; | 778 return VERIFY_UNDECIDED; |
| 778 } | 779 } |
| 779 | 780 |
| 780 } // namespace browser_sync | 781 } // namespace browser_sync |
| OLD | NEW |