16d528ed9Sopenharmony_ci// Copyright (c) 2011 The Chromium Authors. All rights reserved.
26d528ed9Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
36d528ed9Sopenharmony_ci// found in the LICENSE file.
46d528ed9Sopenharmony_ci
56d528ed9Sopenharmony_ci#include "base/files/scoped_temp_dir.h"
66d528ed9Sopenharmony_ci
76d528ed9Sopenharmony_ci#include "base/files/file_util.h"
86d528ed9Sopenharmony_ci#include "base/logging.h"
96d528ed9Sopenharmony_ci
106d528ed9Sopenharmony_cinamespace base {
116d528ed9Sopenharmony_ci
126d528ed9Sopenharmony_cinamespace {
136d528ed9Sopenharmony_ci
146d528ed9Sopenharmony_ciconstexpr FilePath::CharType kScopedDirPrefix[] =
156d528ed9Sopenharmony_ci    FILE_PATH_LITERAL("scoped_dir");
166d528ed9Sopenharmony_ci
176d528ed9Sopenharmony_ci}  // namespace
186d528ed9Sopenharmony_ci
196d528ed9Sopenharmony_ciScopedTempDir::ScopedTempDir() = default;
206d528ed9Sopenharmony_ci
216d528ed9Sopenharmony_ciScopedTempDir::~ScopedTempDir() {
226d528ed9Sopenharmony_ci  if (!path_.empty() && !Delete())
236d528ed9Sopenharmony_ci    DLOG(WARNING) << "Could not delete temp dir in dtor.";
246d528ed9Sopenharmony_ci}
256d528ed9Sopenharmony_ci
266d528ed9Sopenharmony_cibool ScopedTempDir::CreateUniqueTempDir() {
276d528ed9Sopenharmony_ci  if (!path_.empty())
286d528ed9Sopenharmony_ci    return false;
296d528ed9Sopenharmony_ci
306d528ed9Sopenharmony_ci  // This "scoped_dir" prefix is only used on Windows and serves as a template
316d528ed9Sopenharmony_ci  // for the unique name.
326d528ed9Sopenharmony_ci  if (!base::CreateNewTempDirectory(kScopedDirPrefix, &path_))
336d528ed9Sopenharmony_ci    return false;
346d528ed9Sopenharmony_ci
356d528ed9Sopenharmony_ci  return true;
366d528ed9Sopenharmony_ci}
376d528ed9Sopenharmony_ci
386d528ed9Sopenharmony_cibool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) {
396d528ed9Sopenharmony_ci  if (!path_.empty())
406d528ed9Sopenharmony_ci    return false;
416d528ed9Sopenharmony_ci
426d528ed9Sopenharmony_ci  // If |base_path| does not exist, create it.
436d528ed9Sopenharmony_ci  if (!base::CreateDirectory(base_path))
446d528ed9Sopenharmony_ci    return false;
456d528ed9Sopenharmony_ci
466d528ed9Sopenharmony_ci  // Create a new, uniquely named directory under |base_path|.
476d528ed9Sopenharmony_ci  if (!base::CreateTemporaryDirInDir(base_path, kScopedDirPrefix, &path_))
486d528ed9Sopenharmony_ci    return false;
496d528ed9Sopenharmony_ci
506d528ed9Sopenharmony_ci  return true;
516d528ed9Sopenharmony_ci}
526d528ed9Sopenharmony_ci
536d528ed9Sopenharmony_cibool ScopedTempDir::Set(const FilePath& path) {
546d528ed9Sopenharmony_ci  if (!path_.empty())
556d528ed9Sopenharmony_ci    return false;
566d528ed9Sopenharmony_ci
576d528ed9Sopenharmony_ci  if (!DirectoryExists(path) && !base::CreateDirectory(path))
586d528ed9Sopenharmony_ci    return false;
596d528ed9Sopenharmony_ci
606d528ed9Sopenharmony_ci  path_ = path;
616d528ed9Sopenharmony_ci  return true;
626d528ed9Sopenharmony_ci}
636d528ed9Sopenharmony_ci
646d528ed9Sopenharmony_cibool ScopedTempDir::Delete() {
656d528ed9Sopenharmony_ci  if (path_.empty())
666d528ed9Sopenharmony_ci    return false;
676d528ed9Sopenharmony_ci
686d528ed9Sopenharmony_ci  bool ret = base::DeleteFile(path_, true);
696d528ed9Sopenharmony_ci  if (ret) {
706d528ed9Sopenharmony_ci    // We only clear the path if deleted the directory.
716d528ed9Sopenharmony_ci    path_.clear();
726d528ed9Sopenharmony_ci  }
736d528ed9Sopenharmony_ci
746d528ed9Sopenharmony_ci  return ret;
756d528ed9Sopenharmony_ci}
766d528ed9Sopenharmony_ci
776d528ed9Sopenharmony_ciFilePath ScopedTempDir::Take() {
786d528ed9Sopenharmony_ci  FilePath ret = path_;
796d528ed9Sopenharmony_ci  path_ = FilePath();
806d528ed9Sopenharmony_ci  return ret;
816d528ed9Sopenharmony_ci}
826d528ed9Sopenharmony_ci
836d528ed9Sopenharmony_ciconst FilePath& ScopedTempDir::GetPath() const {
846d528ed9Sopenharmony_ci  DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?";
856d528ed9Sopenharmony_ci  return path_;
866d528ed9Sopenharmony_ci}
876d528ed9Sopenharmony_ci
886d528ed9Sopenharmony_cibool ScopedTempDir::IsValid() const {
896d528ed9Sopenharmony_ci  return !path_.empty() && DirectoryExists(path_);
906d528ed9Sopenharmony_ci}
916d528ed9Sopenharmony_ci
926d528ed9Sopenharmony_ci// static
936d528ed9Sopenharmony_ciconst FilePath::CharType* ScopedTempDir::GetTempDirPrefix() {
946d528ed9Sopenharmony_ci  return kScopedDirPrefix;
956d528ed9Sopenharmony_ci}
966d528ed9Sopenharmony_ci
976d528ed9Sopenharmony_ci}  // namespace base
98