1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SYNC_ENGINE_MODEL_CHANGING_SYNCER_COMMAND_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SYNC_ENGINE_MODEL_CHANGING_SYNCER_COMMAND_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/syncer_command.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync { 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace sessions { 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SyncSession; 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An abstract SyncerCommand which dispatches its Execute step to the 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// model-safe worker thread. Classes derived from ModelChangingSyncerCommand 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// instead of SyncerCommand must implement ModelChangingExecuteImpl instead of 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExecuteImpl, but otherwise, the contract is the same. 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A command should derive from ModelChangingSyncerCommand instead of 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SyncerCommand whenever the operation might change any client-visible 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// fields on any syncable::Entry. If the operation involves creating a 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WriteTransaction, this is a sign that ModelChangingSyncerCommand is likely 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// necessary. 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ModelChangingSyncerCommand : public SyncerCommand { 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ModelChangingSyncerCommand() : work_session_(NULL) { } 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~ModelChangingSyncerCommand() { } 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // SyncerCommand implementation. Sets work_session to session. 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void ExecuteImpl(sessions::SyncSession* session); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // wrapper so implementations don't worry about storing work_session 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartChangingModel() { 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ModelChangingExecuteImpl(work_session_); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sometimes, a command has work to do that needs to touch global state 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // belonging to multiple ModelSafeGroups, but in a way that is known to be 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // safe. This will be called once, prior to ModelChangingExecuteImpl, 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // *without* a ModelSafeGroup restriction in place on the SyncSession. 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true on success, false on failure. 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(tim): Remove this (bug 36594). 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool ModelNeutralExecuteImpl(sessions::SyncSession* session); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Abstract method to be implemented by subclasses to handle logic that 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // operates on the model. This is invoked with a SyncSession ModelSafeGroup 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // restriction in place so that bits of state belonging to data types 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // running on an unsafe thread are siloed away. 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void ModelChangingExecuteImpl(sessions::SyncSession* session) = 0; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ExecuteImpl is expected to be run by SyncerCommand to set work_session. 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // StartChangingModel is called to start this command running. 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Implementations will implement ModelChangingExecuteImpl and not 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // worry about storing the session or setting it. They are given work_session. 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sessions::SyncSession* work_session_; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(ModelChangingSyncerCommand); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace browser_sync 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_SYNC_ENGINE_MODEL_CHANGING_SYNCER_COMMAND_H_ 66