Home | History | Annotate | Download | only in engine
      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 
     26 namespace sessions {
     27 class StatusController;
     28 }  // namespace sessions
     29 
     30 class ConflictResolver {
     31   friend class SyncerTest;
     32   FRIEND_TEST_ALL_PREFIXES(SyncerTest,
     33                            ConflictResolverMergeOverwritesLocalEntry);
     34  public:
     35   // Enumeration of different conflict resolutions. Used for histogramming.
     36   enum SimpleConflictResolutions {
     37     OVERWRITE_LOCAL,           // Resolved by overwriting local changes.
     38     OVERWRITE_SERVER,          // Resolved by overwriting server changes.
     39     UNDELETE,                  // Resolved by undeleting local item.
     40     IGNORE_ENCRYPTION,         // Resolved by ignoring an encryption-only server
     41                                // change.
     42     NIGORI_MERGE,              // Resolved by merging nigori nodes.
     43     CHANGES_MATCH,             // Resolved by ignoring both local and server
     44                                // changes because they matched.
     45     CONFLICT_RESOLUTION_SIZE,
     46   };
     47 
     48   ConflictResolver();
     49   ~ConflictResolver();
     50   // Called by the syncer at the end of a update/commit cycle.
     51   // Returns true if the syncer should try to apply its updates again.
     52   void ResolveConflicts(syncable::WriteTransaction* trans,
     53                         const Cryptographer* cryptographer,
     54                         const std::set<syncable::Id>& simple_conflict_ids,
     55                         sessions::StatusController* status);
     56 
     57  private:
     58   void ProcessSimpleConflict(
     59       syncable::WriteTransaction* trans,
     60       const syncable::Id& id,
     61       const Cryptographer* cryptographer,
     62       sessions::StatusController* status);
     63 
     64   DISALLOW_COPY_AND_ASSIGN(ConflictResolver);
     65 };
     66 
     67 }  // namespace syncer
     68 
     69 #endif  // SYNC_ENGINE_CONFLICT_RESOLVER_H_
     70