// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "sync/engine/conflict_util.h"

#include "sync/syncable/mutable_entry.h"

namespace syncer {

using syncable::BASE_VERSION;
using syncable::IS_UNAPPLIED_UPDATE;
using syncable::IS_UNSYNCED;
using syncable::SERVER_VERSION;

using syncable::MutableEntry;

namespace conflict_util {

// Allow the server's changes to take precedence.
// This will take effect during the next ApplyUpdates step.
void IgnoreLocalChanges(MutableEntry* entry) {
  DCHECK(entry->GetIsUnsynced());
  DCHECK(entry->GetIsUnappliedUpdate());
  entry->PutIsUnsynced(false);
}

// Overwrite the server with our own value.
// We will commit our local data, overwriting the server, at the next
// opportunity.
void OverwriteServerChanges(MutableEntry* entry) {
  DCHECK(entry->GetIsUnsynced());
  DCHECK(entry->GetIsUnappliedUpdate());
  entry->PutBaseVersion(entry->GetServerVersion());
  entry->PutIsUnappliedUpdate(false);
}

// Having determined that everything matches, we ignore the non-conflict.
void IgnoreConflict(MutableEntry* entry) {
  // If we didn't also unset IS_UNAPPLIED_UPDATE, then we would lose unsynced
  // positional data from adjacent entries when the server update gets applied
  // and the item is re-inserted into the PREV_ID/NEXT_ID linked list. This is
  // primarily an issue because we commit after applying updates, and is most
  // commonly seen when positional changes are made while a passphrase is
  // required (and hence there will be many encryption conflicts).
  DCHECK(entry->GetIsUnsynced());
  DCHECK(entry->GetIsUnappliedUpdate());
  entry->PutBaseVersion(entry->GetServerVersion());
  entry->PutIsUnappliedUpdate(false);
  entry->PutIsUnsynced(false);
}

}  // namespace conflict_util
}  // namespace syncer
