xref: /third_party/gn/src/base/files/file.cc (revision 6d528ed9)
1// Copyright (c) 2011 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/files/file.h"
6#include "base/files/file_path.h"
7#include "util/build_config.h"
8
9#if defined(OS_POSIX) || defined(OS_FUCHSIA)
10#include <errno.h>
11#endif
12
13namespace base {
14
15File::Info::Info() = default;
16
17File::Info::~Info() = default;
18
19File::File() = default;
20
21File::File(const FilePath& path, uint32_t flags) : error_details_(FILE_OK) {
22  Initialize(path, flags);
23}
24
25File::File(ScopedPlatformFile platform_file)
26    : file_(std::move(platform_file)), error_details_(FILE_OK) {
27#if defined(OS_POSIX) || defined(OS_FUCHSIA)
28  DCHECK_GE(file_.get(), -1);
29#endif
30}
31
32File::File(PlatformFile platform_file)
33    : file_(platform_file), error_details_(FILE_OK) {
34#if defined(OS_POSIX) || defined(OS_FUCHSIA)
35  DCHECK_GE(platform_file, -1);
36#endif
37}
38
39File::File(Error error_details) : error_details_(error_details) {}
40
41File::File(File&& other)
42    : file_(other.TakePlatformFile()), error_details_(other.error_details()) {}
43
44File::~File() {
45  // Go through the AssertIOAllowed logic.
46  Close();
47}
48
49File& File::operator=(File&& other) {
50  Close();
51  SetPlatformFile(other.TakePlatformFile());
52  error_details_ = other.error_details();
53  return *this;
54}
55
56void File::Initialize(const FilePath& path, uint32_t flags) {
57  if (path.ReferencesParent()) {
58#if defined(OS_WIN)
59    ::SetLastError(ERROR_ACCESS_DENIED);
60#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
61    errno = EACCES;
62#else
63#error Unsupported platform
64#endif
65    error_details_ = FILE_ERROR_ACCESS_DENIED;
66    return;
67  }
68  DoInitialize(path, flags);
69}
70
71std::string File::ErrorToString(Error error) {
72  switch (error) {
73    case FILE_OK:
74      return "FILE_OK";
75    case FILE_ERROR_FAILED:
76      return "FILE_ERROR_FAILED";
77    case FILE_ERROR_IN_USE:
78      return "FILE_ERROR_IN_USE";
79    case FILE_ERROR_EXISTS:
80      return "FILE_ERROR_EXISTS";
81    case FILE_ERROR_NOT_FOUND:
82      return "FILE_ERROR_NOT_FOUND";
83    case FILE_ERROR_ACCESS_DENIED:
84      return "FILE_ERROR_ACCESS_DENIED";
85    case FILE_ERROR_TOO_MANY_OPENED:
86      return "FILE_ERROR_TOO_MANY_OPENED";
87    case FILE_ERROR_NO_MEMORY:
88      return "FILE_ERROR_NO_MEMORY";
89    case FILE_ERROR_NO_SPACE:
90      return "FILE_ERROR_NO_SPACE";
91    case FILE_ERROR_NOT_A_DIRECTORY:
92      return "FILE_ERROR_NOT_A_DIRECTORY";
93    case FILE_ERROR_INVALID_OPERATION:
94      return "FILE_ERROR_INVALID_OPERATION";
95    case FILE_ERROR_SECURITY:
96      return "FILE_ERROR_SECURITY";
97    case FILE_ERROR_ABORT:
98      return "FILE_ERROR_ABORT";
99    case FILE_ERROR_NOT_A_FILE:
100      return "FILE_ERROR_NOT_A_FILE";
101    case FILE_ERROR_NOT_EMPTY:
102      return "FILE_ERROR_NOT_EMPTY";
103    case FILE_ERROR_INVALID_URL:
104      return "FILE_ERROR_INVALID_URL";
105    case FILE_ERROR_IO:
106      return "FILE_ERROR_IO";
107    case FILE_ERROR_MAX:
108      break;
109  }
110
111  NOTREACHED();
112  return "";
113}
114
115}  // namespace base
116