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 "base/files/file_tracing.h" 8 #include "base/metrics/histogram.h" 9 #include "base/timer/elapsed_timer.h" 10 #include "build/build_config.h" 11 12 namespace base { 13 14 File::Info::Info() 15 : size(0), 16 is_directory(false), 17 is_symbolic_link(false) { 18 } 19 20 File::Info::~Info() { 21 } 22 23 File::File() 24 : error_details_(FILE_ERROR_FAILED), 25 created_(false), 26 async_(false) { 27 } 28 29 #if !defined(OS_NACL) 30 File::File(const FilePath& path, uint32_t flags) 31 : error_details_(FILE_OK), created_(false), async_(false) { 32 Initialize(path, flags); 33 } 34 #endif 35 36 File::File(PlatformFile platform_file) 37 : file_(platform_file), 38 error_details_(FILE_OK), 39 created_(false), 40 async_(false) { 41 #if defined(OS_POSIX) 42 DCHECK_GE(platform_file, -1); 43 #endif 44 } 45 46 File::File(Error error_details) 47 : error_details_(error_details), 48 created_(false), 49 async_(false) { 50 } 51 52 File::File(File&& other) 53 : file_(other.TakePlatformFile()), 54 tracing_path_(other.tracing_path_), 55 error_details_(other.error_details()), 56 created_(other.created()), 57 async_(other.async_) {} 58 59 File::~File() { 60 // Go through the AssertIOAllowed logic. 61 Close(); 62 } 63 64 // static 65 File File::CreateForAsyncHandle(PlatformFile platform_file) { 66 File file(platform_file); 67 // It would be nice if we could validate that |platform_file| was opened with 68 // FILE_FLAG_OVERLAPPED on Windows but this doesn't appear to be possible. 69 file.async_ = true; 70 return file; 71 } 72 73 File& File::operator=(File&& other) { 74 DCHECK_NE(this, &other); 75 Close(); 76 SetPlatformFile(other.TakePlatformFile()); 77 tracing_path_ = other.tracing_path_; 78 error_details_ = other.error_details(); 79 created_ = other.created(); 80 async_ = other.async_; 81 return *this; 82 } 83 84 #if !defined(OS_NACL) 85 void File::Initialize(const FilePath& path, uint32_t flags) { 86 if (path.ReferencesParent()) { 87 error_details_ = FILE_ERROR_ACCESS_DENIED; 88 return; 89 } 90 if (FileTracing::IsCategoryEnabled()) 91 tracing_path_ = path; 92 SCOPED_FILE_TRACE("Initialize"); 93 DoInitialize(path, flags); 94 } 95 #endif 96 97 std::string File::ErrorToString(Error error) { 98 switch (error) { 99 case FILE_OK: 100 return "FILE_OK"; 101 case FILE_ERROR_FAILED: 102 return "FILE_ERROR_FAILED"; 103 case FILE_ERROR_IN_USE: 104 return "FILE_ERROR_IN_USE"; 105 case FILE_ERROR_EXISTS: 106 return "FILE_ERROR_EXISTS"; 107 case FILE_ERROR_NOT_FOUND: 108 return "FILE_ERROR_NOT_FOUND"; 109 case FILE_ERROR_ACCESS_DENIED: 110 return "FILE_ERROR_ACCESS_DENIED"; 111 case FILE_ERROR_TOO_MANY_OPENED: 112 return "FILE_ERROR_TOO_MANY_OPENED"; 113 case FILE_ERROR_NO_MEMORY: 114 return "FILE_ERROR_NO_MEMORY"; 115 case FILE_ERROR_NO_SPACE: 116 return "FILE_ERROR_NO_SPACE"; 117 case FILE_ERROR_NOT_A_DIRECTORY: 118 return "FILE_ERROR_NOT_A_DIRECTORY"; 119 case FILE_ERROR_INVALID_OPERATION: 120 return "FILE_ERROR_INVALID_OPERATION"; 121 case FILE_ERROR_SECURITY: 122 return "FILE_ERROR_SECURITY"; 123 case FILE_ERROR_ABORT: 124 return "FILE_ERROR_ABORT"; 125 case FILE_ERROR_NOT_A_FILE: 126 return "FILE_ERROR_NOT_A_FILE"; 127 case FILE_ERROR_NOT_EMPTY: 128 return "FILE_ERROR_NOT_EMPTY"; 129 case FILE_ERROR_INVALID_URL: 130 return "FILE_ERROR_INVALID_URL"; 131 case FILE_ERROR_IO: 132 return "FILE_ERROR_IO"; 133 case FILE_ERROR_MAX: 134 break; 135 } 136 137 NOTREACHED(); 138 return ""; 139 } 140 141 } // namespace base 142