| OLD | NEW | 
|   1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |   1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 
|   2 // Use of this source code is governed by a BSD-style license that can be |   2 // Use of this source code is governed by a BSD-style license that can be | 
|   3 // found in the LICENSE file. |   3 // found in the LICENSE file. | 
|   4  |   4  | 
|   5 #include "base/file_util.h" |   5 #include "base/file_util.h" | 
|   6 #include "base/logging.h" |   6 #include "base/logging.h" | 
|   7 #include "chrome/installer/util/delete_tree_work_item.h" |   7 #include "chrome/installer/util/delete_tree_work_item.h" | 
|   8  |   8  | 
|   9 DeleteTreeWorkItem::~DeleteTreeWorkItem() { |   9 DeleteTreeWorkItem::~DeleteTreeWorkItem() { | 
|  10   FilePath tmp_dir = backup_path_.DirName(); |  10   std::wstring tmp_dir = file_util::GetDirectoryFromPath(backup_path_); | 
|  11   if (file_util::PathExists(tmp_dir)) { |  11   if (file_util::PathExists(tmp_dir)) { | 
|  12     file_util::Delete(tmp_dir, true); |  12     file_util::Delete(tmp_dir, true); | 
|  13   } |  13   } | 
|  14   tmp_dir = key_backup_path_.DirName(); |  14   tmp_dir = file_util::GetDirectoryFromPath(key_backup_path_); | 
|  15   if (file_util::PathExists(tmp_dir)) { |  15   if (file_util::PathExists(tmp_dir)) { | 
|  16     file_util::Delete(tmp_dir, true); |  16     file_util::Delete(tmp_dir, true); | 
|  17   } |  17   } | 
|  18 } |  18 } | 
|  19  |  19  | 
|  20 DeleteTreeWorkItem::DeleteTreeWorkItem(const std::wstring& root_path, |  20 DeleteTreeWorkItem::DeleteTreeWorkItem(const std::wstring& root_path, | 
|  21                                        const std::wstring& key_path) |  21                                        const std::wstring& key_path) | 
|  22     : root_path_(root_path), |  22     : root_path_(root_path), | 
|  23       key_path_(key_path) { |  23       key_path_(key_path) { | 
|  24 } |  24 } | 
|  25  |  25  | 
|  26 // We first try to move key_path_ to backup_path. If it succeeds, we go ahead |  26 // We first try to move key_path_ to backup_path. If it succeeds, we go ahead | 
|  27 // and move the rest. |  27 // and move the rest. | 
|  28 bool DeleteTreeWorkItem::Do() { |  28 bool DeleteTreeWorkItem::Do() { | 
|  29   if (!key_path_.empty() && file_util::PathExists(key_path_)) { |  29   if (!key_path_.empty() && file_util::PathExists(key_path_)) { | 
|  30     if (!GetBackupPath(key_path_, &key_backup_path_) || |  30     if (!GetBackupPath(key_path_, &key_backup_path_) || | 
|  31         !file_util::CopyDirectory(key_path_, key_backup_path_, true) || |  31         !file_util::CopyDirectory(key_path_, key_backup_path_, true) || | 
|  32         !file_util::Delete(key_path_, true)) { |  32         !file_util::Delete(key_path_, true)) { | 
|  33       LOG(ERROR) << "can not delete " << key_path_.value() |  33       LOG(ERROR) << "can not delete " << key_path_ | 
|  34                  << " OR copy it to backup path " << key_backup_path_.value(); |  34                  << " OR copy it to backup path " << key_backup_path_; | 
|  35       return false; |  35       return false; | 
|  36     } |  36     } | 
|  37   } |  37   } | 
|  38  |  38  | 
|  39   if (!root_path_.empty() && file_util::PathExists(root_path_)) { |  39   if (!root_path_.empty() && file_util::PathExists(root_path_)) { | 
|  40     if (!GetBackupPath(root_path_, &backup_path_) || |  40     if (!GetBackupPath(root_path_, &backup_path_) || | 
|  41         !file_util::CopyDirectory(root_path_, backup_path_, true) || |  41         !file_util::CopyDirectory(root_path_, backup_path_, true) || | 
|  42         !file_util::Delete(root_path_, true)) { |  42         !file_util::Delete(root_path_, true)) { | 
|  43       LOG(ERROR) << "can not delete " << root_path_.value() |  43       LOG(ERROR) << "can not delete " << root_path_ | 
|  44                  << " OR copy it to backup path " << backup_path_.value(); |  44                  << " OR copy it to backup path " << backup_path_; | 
|  45       return false; |  45       return false; | 
|  46     } |  46     } | 
|  47   } |  47   } | 
|  48   return true; |  48   return true; | 
|  49 } |  49 } | 
|  50  |  50  | 
|  51 // If there are files in backup paths move them back. |  51 // If there are files in backup paths move them back. | 
|  52 void DeleteTreeWorkItem::Rollback() { |  52 void DeleteTreeWorkItem::Rollback() { | 
|  53   if (!backup_path_.empty() && file_util::PathExists(backup_path_)) { |  53   if (!backup_path_.empty() && file_util::PathExists(backup_path_)) { | 
|  54     file_util::Move(backup_path_, root_path_); |  54     file_util::Move(backup_path_, root_path_); | 
|  55   } |  55   } | 
|  56   if (!key_backup_path_.empty() && file_util::PathExists(key_backup_path_)) { |  56   if (!key_backup_path_.empty() && file_util::PathExists(key_backup_path_)) { | 
|  57     file_util::Move(key_backup_path_, key_path_); |  57     file_util::Move(key_backup_path_, key_path_); | 
|  58   } |  58   } | 
|  59 } |  59 } | 
|  60  |  60  | 
|  61 bool DeleteTreeWorkItem::GetBackupPath(const FilePath& for_path, |  61 bool DeleteTreeWorkItem::GetBackupPath(const std::wstring& for_path, | 
|  62                                        FilePath* backup_path) { |  62                                        std::wstring* backup_path) { | 
|  63   if (!file_util::CreateNewTempDirectory(L"", backup_path)) { |  63   if (!file_util::CreateNewTempDirectory(L"", backup_path)) { | 
|  64     // We assume that CreateNewTempDirectory() is doing its job well. |  64     // We assume that CreateNewTempDirectory() is doing its job well. | 
|  65     LOG(ERROR) << "Couldn't get backup path for delete."; |  65     LOG(ERROR) << "Couldn't get backup path for delete."; | 
|  66     return false; |  66     return false; | 
|  67   } |  67   } | 
 |  68   std::wstring file_name = file_util::GetFilenameFromPath(for_path); | 
 |  69   file_util::AppendToPath(backup_path, file_name); | 
|  68  |  70  | 
|  69   *backup_path = backup_path->Append(for_path.BaseName()); |  | 
|  70   return true; |  71   return true; | 
|  71 } |  72 } | 
| OLD | NEW |