• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 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 #include "base/file_util.h"
6 #include "base/logging.h"
7 #include "chrome/installer/util/create_dir_work_item.h"
8 #include "chrome/installer/util/logging_installer.h"
9 
~CreateDirWorkItem()10 CreateDirWorkItem::~CreateDirWorkItem() {
11 }
12 
CreateDirWorkItem(const base::FilePath & path)13 CreateDirWorkItem::CreateDirWorkItem(const base::FilePath& path)
14     : path_(path),
15       rollback_needed_(false) {
16 }
17 
GetTopDirToCreate()18 void CreateDirWorkItem::GetTopDirToCreate() {
19   if (base::PathExists(path_)) {
20     top_path_ = base::FilePath();
21     return;
22   }
23 
24   base::FilePath parent_dir(path_);
25   do {
26     top_path_ = parent_dir;
27     parent_dir = parent_dir.DirName();
28   } while ((parent_dir != top_path_) && !base::PathExists(parent_dir));
29   return;
30 }
31 
Do()32 bool CreateDirWorkItem::Do() {
33   VLOG(1) << "creating directory " << path_.value();
34   GetTopDirToCreate();
35   if (top_path_.empty())
36     return true;
37 
38   VLOG(1) << "top directory that needs to be created: " << top_path_.value();
39   bool result = base::CreateDirectory(path_);
40   VLOG(1) << "directory creation result: " << result;
41 
42   rollback_needed_ = true;
43 
44   return result;
45 }
46 
Rollback()47 void CreateDirWorkItem::Rollback() {
48   if (!rollback_needed_)
49     return;
50 
51   // Delete all the directories we created to rollback.
52   // Note we can not recusively delete top_path_ since we don't want to
53   // delete non-empty directory. (We may have created a shared directory).
54   // Instead we walk through path_ to top_path_ and delete directories
55   // along the way.
56   base::FilePath path_to_delete(path_);
57 
58   while (1) {
59     if (base::PathExists(path_to_delete)) {
60       if (!RemoveDirectory(path_to_delete.value().c_str()))
61         break;
62     }
63     if (path_to_delete == top_path_)
64       break;
65     path_to_delete = path_to_delete.DirName();
66   }
67 
68   return;
69 }
70