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