1 // Copyright (c) 2011 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 CHROME_INSTALLER_UTIL_MOVE_TREE_WORK_ITEM_H_ 6 #define CHROME_INSTALLER_UTIL_MOVE_TREE_WORK_ITEM_H_ 7 8 #include "base/files/file_path.h" 9 #include "base/files/scoped_temp_dir.h" 10 #include "base/gtest_prod_util.h" 11 #include "chrome/installer/util/work_item.h" 12 13 // A WorkItem subclass that recursively move a file system hierarchy from 14 // source path to destination path. The file system hierarchy could be a 15 // single file, or a directory. 16 // 17 // Under the cover MoveTreeWorkItem moves the destination path, if existing, 18 // to the temporary directory passed in, and then moves the source hierarchy 19 // to the destination location. During rollback the original destination 20 // hierarchy is moved back. 21 class MoveTreeWorkItem : public WorkItem { 22 public: 23 virtual ~MoveTreeWorkItem(); 24 25 virtual bool Do(); 26 27 virtual void Rollback(); 28 29 private: 30 friend class WorkItem; 31 FRIEND_TEST_ALL_PREFIXES(MoveTreeWorkItemTest, 32 MoveDirectoryDestExistsCheckForDuplicatesFull); 33 FRIEND_TEST_ALL_PREFIXES(MoveTreeWorkItemTest, 34 MoveDirectoryDestExistsCheckForDuplicatesPartial); 35 36 // |source_path| specifies file or directory that will be moved to location 37 // specified by |dest_path|. To facilitate rollback, the caller needs to 38 // supply a temporary directory, |temp_dir| to save the original files if 39 // they exist under dest_path. 40 // If |check_duplicates| is CHECK_DUPLICATES, then Do() will first check 41 // whether the directory tree in source_path is entirely contained in 42 // dest_path and all files in source_path are present and of the same length 43 // in dest_path. If so, it will do nothing and return true, otherwise it will 44 // attempt to move source_path to dest_path as stated above. 45 MoveTreeWorkItem(const base::FilePath& source_path, 46 const base::FilePath& dest_path, 47 const base::FilePath& temp_dir, 48 MoveTreeOption duplicate_option); 49 50 // Source path to move files from. 51 base::FilePath source_path_; 52 53 // Destination path to move files to. 54 base::FilePath dest_path_; 55 56 // Temporary directory to backup dest_path_ (if it already exists). 57 base::FilePath temp_dir_; 58 59 // The temporary directory into which the original dest_path_ has been moved. 60 base::ScopedTempDir backup_path_; 61 62 // Whether the source was moved to dest_path_ 63 bool moved_to_dest_path_; 64 65 // Whether the original files have been moved to backup path under 66 // temporary directory. If true, moving back is needed during rollback. 67 bool moved_to_backup_; 68 69 // Whether we moved the source files to the backup path instead just to 70 // preserve the behaviour of a Move. This can only become true if 71 // duplicate_option_ is CHECK_DUPLICATES. 72 bool source_moved_to_backup_; 73 74 // Whether to check for duplicates before moving. 75 MoveTreeOption duplicate_option_; 76 }; 77 78 #endif // CHROME_INSTALLER_UTIL_MOVE_TREE_WORK_ITEM_H_ 79