• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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