15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/engine/conflict_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/mutable_entry.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::BASE_VERSION;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::IS_UNAPPLIED_UPDATE;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::IS_UNSYNCED;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::SERVER_VERSION;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncable::MutableEntry;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace conflict_util {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allow the server's changes to take precedence.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This will take effect during the next ApplyUpdates step.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IgnoreLocalChanges(MutableEntry* entry) {
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(entry->GetIsUnsynced());
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(entry->GetIsUnappliedUpdate());
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry->PutIsUnsynced(false);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overwrite the server with our own value.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We will commit our local data, overwriting the server, at the next
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// opportunity.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverwriteServerChanges(MutableEntry* entry) {
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(entry->GetIsUnsynced());
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(entry->GetIsUnappliedUpdate());
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry->PutBaseVersion(entry->GetServerVersion());
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry->PutIsUnappliedUpdate(false);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Having determined that everything matches, we ignore the non-conflict.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IgnoreConflict(MutableEntry* entry) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we didn't also unset IS_UNAPPLIED_UPDATE, then we would lose unsynced
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // positional data from adjacent entries when the server update gets applied
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the item is re-inserted into the PREV_ID/NEXT_ID linked list. This is
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // primarily an issue because we commit after applying updates, and is most
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // commonly seen when positional changes are made while a passphrase is
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // required (and hence there will be many encryption conflicts).
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(entry->GetIsUnsynced());
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(entry->GetIsUnappliedUpdate());
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry->PutBaseVersion(entry->GetServerVersion());
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry->PutIsUnappliedUpdate(false);
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  entry->PutIsUnsynced(false);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace conflict_util
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
55