// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_INSTALLER_UTIL_MOVE_TREE_WORK_ITEM_H_
#define CHROME_INSTALLER_UTIL_MOVE_TREE_WORK_ITEM_H_

#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "base/gtest_prod_util.h"
#include "chrome/installer/util/work_item.h"

// A WorkItem subclass that recursively move a file system hierarchy from
// source path to destination path. The file system hierarchy could be a
// single file, or a directory.
//
// Under the cover MoveTreeWorkItem moves the destination path, if existing,
// to the temporary directory passed in, and then moves the source hierarchy
// to the destination location. During rollback the original destination
// hierarchy is moved back.
class MoveTreeWorkItem : public WorkItem {
 public:
  virtual ~MoveTreeWorkItem();

  virtual bool Do();

  virtual void Rollback();

 private:
  friend class WorkItem;
  FRIEND_TEST_ALL_PREFIXES(MoveTreeWorkItemTest,
                           MoveDirectoryDestExistsCheckForDuplicatesFull);
  FRIEND_TEST_ALL_PREFIXES(MoveTreeWorkItemTest,
                           MoveDirectoryDestExistsCheckForDuplicatesPartial);

  // |source_path| specifies file or directory that will be moved to location
  // specified by |dest_path|. To facilitate rollback, the caller needs to
  // supply a temporary directory, |temp_dir| to save the original files if
  // they exist under dest_path.
  // If |check_duplicates| is CHECK_DUPLICATES, then Do() will first check
  // whether the directory tree in source_path is entirely contained in
  // dest_path and all files in source_path are present and of the same length
  // in dest_path. If so, it will do nothing and return true, otherwise it will
  // attempt to move source_path to dest_path as stated above.
  MoveTreeWorkItem(const base::FilePath& source_path,
                   const base::FilePath& dest_path,
                   const base::FilePath& temp_dir,
                   MoveTreeOption duplicate_option);

  // Source path to move files from.
  base::FilePath source_path_;

  // Destination path to move files to.
  base::FilePath dest_path_;

  // Temporary directory to backup dest_path_ (if it already exists).
  base::FilePath temp_dir_;

  // The temporary directory into which the original dest_path_ has been moved.
  base::ScopedTempDir backup_path_;

  // Whether the source was moved to dest_path_
  bool moved_to_dest_path_;

  // Whether the original files have been moved to backup path under
  // temporary directory. If true, moving back is needed during rollback.
  bool moved_to_backup_;

  // Whether we moved the source files to the backup path instead just to
  // preserve the behaviour of a Move. This can only become true if
  // duplicate_option_ is CHECK_DUPLICATES.
  bool source_moved_to_backup_;

  // Whether to check for duplicates before moving.
  MoveTreeOption duplicate_option_;
};

#endif  // CHROME_INSTALLER_UTIL_MOVE_TREE_WORK_ITEM_H_
