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