1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be
3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file.
4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/files/scoped_temp_dir.h"
6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/files/file_util.h"
8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/logging.h"
9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratScopedTempDir::ScopedTempDir() {
13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratScopedTempDir::~ScopedTempDir() {
16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!path_.empty() && !Delete())
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    DLOG(WARNING) << "Could not delete temp dir in dtor.";
18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::CreateUniqueTempDir() {
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!path_.empty())
22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // This "scoped_dir" prefix is only used on Windows and serves as a template
25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // for the unique name.
26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!base::CreateNewTempDirectory(FILE_PATH_LITERAL("scoped_dir"), &path_))
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return true;
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) {
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!path_.empty())
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // If |base_path| does not exist, create it.
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!base::CreateDirectory(base_path))
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Create a new, uniquely named directory under |base_path|.
41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!base::CreateTemporaryDirInDir(base_path,
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                     FILE_PATH_LITERAL("scoped_dir_"),
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                     &path_))
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return true;
47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::Set(const FilePath& path) {
50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!path_.empty())
51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!DirectoryExists(path) && !base::CreateDirectory(path))
54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  path_ = path;
57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return true;
58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::Delete() {
61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (path_.empty())
62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return false;
63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool ret = base::DeleteFile(path_, true);
65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (ret) {
66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // We only clear the path if deleted the directory.
67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    path_.clear();
68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return ret;
71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratFilePath ScopedTempDir::Take() {
74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  FilePath ret = path_;
75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  path_ = FilePath();
76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return ret;
77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
793a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelliconst FilePath& ScopedTempDir::GetPath() const {
803a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli  DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?";
813a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli  return path_;
823a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli}
833a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli
84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ScopedTempDir::IsValid() const {
85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return !path_.empty() && DirectoryExists(path_);
86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
89