Home | History | Annotate | Download | only in internal_api
      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 // Defines ChangeReorderBuffer, which can be used to sort a list of item
      6 // actions to achieve the ordering constraint required by the SyncObserver
      7 // interface of the SyncAPI.
      8 
      9 #ifndef SYNC_INTERNAL_API_CHANGE_REORDER_BUFFER_H_
     10 #define SYNC_INTERNAL_API_CHANGE_REORDER_BUFFER_H_
     11 
     12 #include <map>
     13 #include <vector>
     14 
     15 #include "base/compiler_specific.h"
     16 #include "base/memory/linked_ptr.h"
     17 #include "sync/internal_api/public/change_record.h"
     18 #include "sync/protocol/sync.pb.h"
     19 
     20 namespace syncer {
     21 
     22 class BaseTransaction;
     23 
     24 // ChangeReorderBuffer is a utility type which accepts an unordered set
     25 // of changes (via its Push methods), and yields an ImmutableChangeRecordList
     26 // (via the GetAllChangesInTreeOrder method) that are in the order that
     27 // the SyncObserver expects them to be. A buffer is initially empty.
     28 //
     29 // The ordering produced by ChangeReorderBuffer is as follows:
     30 //  (a) All Deleted items appear first.
     31 //  (b) For Updated and/or Added items, parents appear before their children.
     32 //
     33 // The sibling order is not necessarily preserved.
     34 class ChangeReorderBuffer {
     35  public:
     36   ChangeReorderBuffer();
     37   ~ChangeReorderBuffer();
     38 
     39   // Insert an item, identified by the metahandle |id|, into the reorder buffer.
     40   // This item will appear in the output list as an ACTION_ADD ChangeRecord.
     41   void PushAddedItem(int64 id);
     42 
     43   // Insert an item, identified by the metahandle |id|, into the reorder buffer.
     44   // This item will appear in the output list as an ACTION_DELETE ChangeRecord.
     45   void PushDeletedItem(int64 id);
     46 
     47   // Insert an item, identified by the metahandle |id|, into the reorder buffer.
     48   // This item will appear in the output list as an ACTION_UPDATE ChangeRecord.
     49   void PushUpdatedItem(int64 id);
     50 
     51   void SetExtraDataForId(int64 id, ExtraPasswordChangeRecordData* extra);
     52 
     53   void SetSpecificsForId(int64 id, const sync_pb::EntitySpecifics& specifics);
     54 
     55   // Reset the buffer, forgetting any pushed items, so that it can be used again
     56   // to reorder a new set of changes.
     57   void Clear();
     58 
     59   bool IsEmpty() const;
     60 
     61   // Output a reordered list of changes to |changes| using the items
     62   // that were pushed into the reorder buffer. |sync_trans| is used to
     63   // determine the ordering.  Returns true if successful, or false if
     64   // an error was encountered.
     65   bool GetAllChangesInTreeOrder(
     66       const BaseTransaction* sync_trans,
     67       ImmutableChangeRecordList* changes) WARN_UNUSED_RESULT;
     68 
     69  private:
     70   class Traversal;
     71   typedef std::map<int64, ChangeRecord::Action> OperationMap;
     72   typedef std::map<int64, sync_pb::EntitySpecifics> SpecificsMap;
     73   typedef std::map<int64, linked_ptr<ExtraPasswordChangeRecordData> >
     74       ExtraDataMap;
     75 
     76   // Stores the items that have been pushed into the buffer, and the type of
     77   // operation that was associated with them.
     78   OperationMap operations_;
     79 
     80   // Stores entity-specific ChangeRecord data per-ID.
     81   SpecificsMap specifics_;
     82 
     83   // Stores type-specific extra data per-ID.
     84   ExtraDataMap extra_data_;
     85 
     86   DISALLOW_COPY_AND_ASSIGN(ChangeReorderBuffer);
     87 };
     88 
     89 }  // namespace syncer
     90 
     91 #endif  // SYNC_INTERNAL_API_CHANGE_REORDER_BUFFER_H_
     92