Home | History | Annotate | Download | only in engine
      1 // Copyright 2013 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 #ifndef SYNC_ENGINE_SYNC_DIRECTORY_COMMIT_CONTRIBUTION_H_
      6 #define SYNC_ENGINE_SYNC_DIRECTORY_COMMIT_CONTRIBUTION_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/gtest_prod_util.h"
     11 #include "sync/base/sync_export.h"
     12 #include "sync/internal_api/public/base/model_type.h"
     13 #include "sync/internal_api/public/util/syncer_error.h"
     14 #include "sync/protocol/sync.pb.h"
     15 #include "sync/sessions/status_controller.h"
     16 
     17 namespace syncer {
     18 
     19 namespace sessions {
     20 class StatusController;
     21 }  // namespace sessions
     22 
     23 namespace syncable {
     24 class Directory;
     25 }  // namespace syncable
     26 
     27 // This class represents a set of items belonging to a particular data type that
     28 // have been selected from the syncable Directory and prepared for commit.
     29 //
     30 // This class handles the bookkeeping related to the commit of these items,
     31 // including processing the commit response message and setting and unsetting
     32 // the SYNCING bits.
     33 class SYNC_EXPORT_PRIVATE SyncDirectoryCommitContribution {
     34  public:
     35   // This destructor will DCHECK if UnsetSyncingBits() has not been called yet.
     36   ~SyncDirectoryCommitContribution();
     37 
     38   // Build a CommitContribution from the IS_UNSYNCED items in |dir| with the
     39   // given |type|.  The contribution will include at most |max_items| entries.
     40   //
     41   // This function may return NULL if this type has no items ready for and
     42   // requiring commit.  This function may make model neutral changes to the
     43   // directory.
     44   static SyncDirectoryCommitContribution* Build(
     45       syncable::Directory* dir,
     46       ModelType type,
     47       size_t max_items);
     48 
     49   // Serialize this contribution's entries to the given commit request |msg|.
     50   //
     51   // This function is not const.  It will update some state in this contribution
     52   // that will be used when processing the associated commit response.  This
     53   // function should not be called more than once.
     54   void AddToCommitMessage(sync_pb::ClientToServerMessage* msg);
     55 
     56   // Updates this contribution's contents in accordance with the provided
     57   // |response|.
     58   //
     59   // This function may make model-neutral changes to the directory.  It is not
     60   // valid to call this function unless AddToCommitMessage() was called earlier.
     61   // This function should not be called more than once.
     62   SyncerError ProcessCommitResponse(
     63       const sync_pb::ClientToServerResponse& response,
     64       sessions::StatusController* status);
     65 
     66   // Cleans up any temproary state associated with the commit.  Must be called
     67   // before destruction.
     68   void CleanUp();
     69 
     70   // Returns the number of entries included in this contribution.
     71   size_t GetNumEntries() const;
     72 
     73  private:
     74   class SyncDirectoryCommitContributionTest;
     75   FRIEND_TEST_ALL_PREFIXES(SyncDirectoryCommitContributionTest, GatherByTypes);
     76   FRIEND_TEST_ALL_PREFIXES(SyncDirectoryCommitContributionTest,
     77                            GatherAndTruncate);
     78 
     79   SyncDirectoryCommitContribution(
     80       const std::vector<int64>& metahandles,
     81       const google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities,
     82       syncable::Directory* directory);
     83 
     84   void UnsetSyncingBits();
     85 
     86   syncable::Directory* dir_;
     87   const std::vector<int64> metahandles_;
     88   const google::protobuf::RepeatedPtrField<sync_pb::SyncEntity> entities_;
     89   size_t entries_start_index_;
     90 
     91   // This flag is tracks whether or not the directory entries associated with
     92   // this commit still have their SYNCING bits set.  These bits will be set when
     93   // the CommitContribution is created with Build() and unset when CleanUp() is
     94   // called.  This flag must be unset by the time our destructor is called.
     95   bool syncing_bits_set_;
     96 
     97   DISALLOW_COPY_AND_ASSIGN(SyncDirectoryCommitContribution);
     98 };
     99 
    100 }  // namespace syncer
    101 
    102 #endif  // SYNC_ENGINE_SYNC_DIRECTORY_COMMIT_CONTRIBUTION_H_
    103