146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef SYNC_ENGINE_NON_BLOCKING_TYPE_COMMIT_CONTRIBUTION_H_
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define SYNC_ENGINE_NON_BLOCKING_TYPE_COMMIT_CONTRIBUTION_H_
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <vector>
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/basictypes.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "sync/engine/commit_contribution.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "sync/protocol/sync.pb.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace syncer {
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ModelTypeSyncWorkerImpl;
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// A non-blocking sync type's contribution to an outgoing commit message.
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Helps build a commit message and process its response.  It collaborates
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// closely with the ModelTypeSyncWorkerImpl.
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class NonBlockingTypeCommitContribution : public CommitContribution {
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NonBlockingTypeCommitContribution(
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const sync_pb::DataTypeContext& context,
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities,
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::vector<int64>& sequence_numbers,
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ModelTypeSyncWorkerImpl* worker);
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~NonBlockingTypeCommitContribution();
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Implementation of CommitContribution
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void AddToCommitMessage(sync_pb::ClientToServerMessage* msg) OVERRIDE;
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual SyncerError ProcessCommitResponse(
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const sync_pb::ClientToServerResponse& response,
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      sessions::StatusController* status) OVERRIDE;
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void CleanUp() OVERRIDE;
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual size_t GetNumEntries() const OVERRIDE;
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // A non-owned pointer back to the object that created this contribution.
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ModelTypeSyncWorkerImpl* const worker_;
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The type-global context information.
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const sync_pb::DataTypeContext context_;
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The set of entities to be committed, serialized as SyncEntities.
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const google::protobuf::RepeatedPtrField<sync_pb::SyncEntity> entities_;
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The sequence numbers associated with the pending commits.  These match up
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // with the entities_ vector.
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const std::vector<int64> sequence_numbers_;
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The index in the commit message where this contribution's entities are
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // added.  Used to correlate per-item requests with per-item responses.
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t entries_start_index_;
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // A flag used to ensure this object's contract is respected.  Helps to check
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // that CleanUp() is called before the object is destructed.
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool cleaned_up_;
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NonBlockingTypeCommitContribution);
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace syncer
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // SYNC_ENGINE_NON_BLOCKING_TYPE_COMMIT_CONTRIBUTION_H_
67