xref: /aosp_15_r20/external/cronet/base/files/scoped_temp_dir.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/files/scoped_temp_dir.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker namespace base {
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker namespace {
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker constexpr FilePath::CharType kScopedDirPrefix[] =
15*6777b538SAndroid Build Coastguard Worker     FILE_PATH_LITERAL("scoped_dir");
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker }  // namespace
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker ScopedTempDir::ScopedTempDir() = default;
20*6777b538SAndroid Build Coastguard Worker 
ScopedTempDir(ScopedTempDir && other)21*6777b538SAndroid Build Coastguard Worker ScopedTempDir::ScopedTempDir(ScopedTempDir&& other) noexcept
22*6777b538SAndroid Build Coastguard Worker     : path_(other.Take()) {}
23*6777b538SAndroid Build Coastguard Worker 
operator =(ScopedTempDir && other)24*6777b538SAndroid Build Coastguard Worker ScopedTempDir& ScopedTempDir::operator=(ScopedTempDir&& other) {
25*6777b538SAndroid Build Coastguard Worker   if (!path_.empty() && !Delete())
26*6777b538SAndroid Build Coastguard Worker     DLOG(WARNING) << "Could not delete temp dir in operator=().";
27*6777b538SAndroid Build Coastguard Worker   path_ = other.Take();
28*6777b538SAndroid Build Coastguard Worker   return *this;
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker 
~ScopedTempDir()31*6777b538SAndroid Build Coastguard Worker ScopedTempDir::~ScopedTempDir() {
32*6777b538SAndroid Build Coastguard Worker   if (!path_.empty() && !Delete())
33*6777b538SAndroid Build Coastguard Worker     DLOG(WARNING) << "Could not delete temp dir in dtor.";
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker 
CreateUniqueTempDir()36*6777b538SAndroid Build Coastguard Worker bool ScopedTempDir::CreateUniqueTempDir() {
37*6777b538SAndroid Build Coastguard Worker   if (!path_.empty())
38*6777b538SAndroid Build Coastguard Worker     return false;
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   // This "scoped_dir" prefix is only used on Windows and serves as a template
41*6777b538SAndroid Build Coastguard Worker   // for the unique name.
42*6777b538SAndroid Build Coastguard Worker   if (!CreateNewTempDirectory(kScopedDirPrefix, &path_))
43*6777b538SAndroid Build Coastguard Worker     return false;
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   return true;
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker 
CreateUniqueTempDirUnderPath(const FilePath & base_path)48*6777b538SAndroid Build Coastguard Worker bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) {
49*6777b538SAndroid Build Coastguard Worker   if (!path_.empty())
50*6777b538SAndroid Build Coastguard Worker     return false;
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker   // If |base_path| does not exist, create it.
53*6777b538SAndroid Build Coastguard Worker   if (!CreateDirectory(base_path))
54*6777b538SAndroid Build Coastguard Worker     return false;
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   // Create a new, uniquely named directory under |base_path|.
57*6777b538SAndroid Build Coastguard Worker   if (!CreateTemporaryDirInDir(base_path, kScopedDirPrefix, &path_))
58*6777b538SAndroid Build Coastguard Worker     return false;
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   return true;
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker 
Set(const FilePath & path)63*6777b538SAndroid Build Coastguard Worker bool ScopedTempDir::Set(const FilePath& path) {
64*6777b538SAndroid Build Coastguard Worker   if (!path_.empty())
65*6777b538SAndroid Build Coastguard Worker     return false;
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   if (!DirectoryExists(path) && !CreateDirectory(path))
68*6777b538SAndroid Build Coastguard Worker     return false;
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   path_ = path;
71*6777b538SAndroid Build Coastguard Worker   return true;
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker 
Delete()74*6777b538SAndroid Build Coastguard Worker bool ScopedTempDir::Delete() {
75*6777b538SAndroid Build Coastguard Worker   if (path_.empty())
76*6777b538SAndroid Build Coastguard Worker     return false;
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   bool ret = DeletePathRecursively(path_);
79*6777b538SAndroid Build Coastguard Worker   if (ret) {
80*6777b538SAndroid Build Coastguard Worker     // We only clear the path if deleted the directory.
81*6777b538SAndroid Build Coastguard Worker     path_.clear();
82*6777b538SAndroid Build Coastguard Worker   }
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   return ret;
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker 
Take()87*6777b538SAndroid Build Coastguard Worker FilePath ScopedTempDir::Take() {
88*6777b538SAndroid Build Coastguard Worker   return std::exchange(path_, FilePath());
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker 
GetPath() const91*6777b538SAndroid Build Coastguard Worker const FilePath& ScopedTempDir::GetPath() const {
92*6777b538SAndroid Build Coastguard Worker   DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?";
93*6777b538SAndroid Build Coastguard Worker   return path_;
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker 
IsValid() const96*6777b538SAndroid Build Coastguard Worker bool ScopedTempDir::IsValid() const {
97*6777b538SAndroid Build Coastguard Worker   return !path_.empty() && DirectoryExists(path_);
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker // static
GetTempDirPrefix()101*6777b538SAndroid Build Coastguard Worker const FilePath::CharType* ScopedTempDir::GetTempDirPrefix() {
102*6777b538SAndroid Build Coastguard Worker   return kScopedDirPrefix;
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker }  // namespace base
106