15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_ENGINE_COMMIT_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_ENGINE_COMMIT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <map>
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/stl_util.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "sync/base/sync_export.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/engine/commit_contribution.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "sync/internal_api/public/base/model_type.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "sync/internal_api/public/engine/model_safe_worker.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/syncer_error.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "sync/protocol/sync.pb.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "sync/util/extensions_activity.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sessions {
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class StatusController;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncSession;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CommitProcessor;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Syncer;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This class wraps the actions related to building and executing a single
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// commit operation.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This class' most important responsibility is to manage the ContributionsMap.
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This class serves as a container for those objects.  Although it would have
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// been acceptable to let this class be a dumb container object, it turns out
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// that there was no other convenient place to put the Init() and
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// PostAndProcessCommitResponse() functions.  So they ended up here.
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class SYNC_EXPORT_PRIVATE Commit {
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Commit(
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::map<ModelType, CommitContribution*>&
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          contributions,
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const sync_pb::ClientToServerMessage& message,
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExtensionsActivity::Records extensions_activity_buffer);
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This destructor will DCHECK if CleanUp() has not been called.
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~Commit();
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static Commit* Init(
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ModelTypeSet requested_types,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ModelTypeSet enabled_types,
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      size_t max_entries,
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const std::string& account_name,
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const std::string& cache_guid,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CommitProcessor* commit_processor,
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExtensionsActivity* extensions_activity);
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SyncerError PostAndProcessResponse(
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      sessions::SyncSession* session,
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      sessions::StatusController* status,
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ExtensionsActivity* extensions_activity);
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Cleans up state associated with this commit.  Must be called before the
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // destructor.
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CleanUp();
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef std::map<ModelType, CommitContribution*> ContributionMap;
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ContributionMap contributions_;
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  STLValueDeleter<ContributionMap> deleter_;
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_pb::ClientToServerMessage message_;
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_pb::ClientToServerResponse response_;
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ExtensionsActivity::Records extensions_activity_buffer_;
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Debug only flag used to indicate if it's safe to destruct the object.
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool cleaned_up_;
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SYNC_ENGINE_COMMIT_H_
83