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
13 namespace base {
14
15 File::Info::Info() = default;
16
17 File::Info::~Info() = default;
18
19 File::File() = default;
20
File(const FilePath & path,uint32_t flags)21 File::File(const FilePath& path, uint32_t flags) : error_details_(FILE_OK) {
22 Initialize(path, flags);
23 }
24
File(ScopedPlatformFile platform_file)25 File::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
File(PlatformFile platform_file)32 File::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
File(Error error_details)39 File::File(Error error_details) : error_details_(error_details) {}
40
File(File && other)41 File::File(File&& other)
42 : file_(other.TakePlatformFile()), error_details_(other.error_details()) {}
43
~File()44 File::~File() {
45 // Go through the AssertIOAllowed logic.
46 Close();
47 }
48
operator =(File && other)49 File& File::operator=(File&& other) {
50 Close();
51 SetPlatformFile(other.TakePlatformFile());
52 error_details_ = other.error_details();
53 return *this;
54 }
55
Initialize(const FilePath & path,uint32_t flags)56 void 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
ErrorToString(Error error)71 std::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