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 3 // found in the LICENSE file. 4 // 5 // A class that watches the syncer and attempts to resolve any conflicts that 6 // occur. 7 8 #ifndef SYNC_ENGINE_CONFLICT_RESOLVER_H_ 9 #define SYNC_ENGINE_CONFLICT_RESOLVER_H_ 10 11 #include <set> 12 13 #include "base/basictypes.h" 14 #include "base/gtest_prod_util.h" 15 #include "sync/engine/syncer_types.h" 16 17 namespace syncer { 18 19 namespace syncable { 20 class Id; 21 class WriteTransaction; 22 } // namespace syncable 23 24 class Cryptographer; 25 struct UpdateCounters; 26 27 namespace sessions { 28 class StatusController; 29 } // namespace sessions 30 31 class ConflictResolver { 32 friend class SyncerTest; 33 FRIEND_TEST_ALL_PREFIXES(SyncerTest, 34 ConflictResolverMergeOverwritesLocalEntry); 35 public: 36 // Enumeration of different conflict resolutions. Used for histogramming. 37 enum SimpleConflictResolutions { 38 OVERWRITE_LOCAL, // Resolved by overwriting local changes. 39 OVERWRITE_SERVER, // Resolved by overwriting server changes. 40 UNDELETE, // Resolved by undeleting local item. 41 IGNORE_ENCRYPTION, // Resolved by ignoring an encryption-only server 42 // change. 43 NIGORI_MERGE, // Resolved by merging nigori nodes. 44 CHANGES_MATCH, // Resolved by ignoring both local and server 45 // changes because they matched. 46 CONFLICT_RESOLUTION_SIZE, 47 }; 48 49 ConflictResolver(); 50 ~ConflictResolver(); 51 // Called by the syncer at the end of a update/commit cycle. 52 // Returns true if the syncer should try to apply its updates again. 53 void ResolveConflicts(syncable::WriteTransaction* trans, 54 const Cryptographer* cryptographer, 55 const std::set<syncable::Id>& simple_conflict_ids, 56 sessions::StatusController* status, 57 UpdateCounters* counters); 58 59 private: 60 void ProcessSimpleConflict( 61 syncable::WriteTransaction* trans, 62 const syncable::Id& id, 63 const Cryptographer* cryptographer, 64 sessions::StatusController* status, 65 UpdateCounters* counters); 66 67 DISALLOW_COPY_AND_ASSIGN(ConflictResolver); 68 }; 69 70 } // namespace syncer 71 72 #endif // SYNC_ENGINE_CONFLICT_RESOLVER_H_ 73