OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/platform_file.h" | 5 #include "base/platform_file.h" |
6 | 6 |
7 #include <io.h> | 7 #include <io.h> |
8 | 8 |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 if (created && (INVALID_HANDLE_VALUE != file)) { | 83 if (created && (INVALID_HANDLE_VALUE != file)) { |
84 if (flags & (PLATFORM_FILE_OPEN_ALWAYS)) | 84 if (flags & (PLATFORM_FILE_OPEN_ALWAYS)) |
85 *created = (ERROR_ALREADY_EXISTS != GetLastError()); | 85 *created = (ERROR_ALREADY_EXISTS != GetLastError()); |
86 else if (flags & (PLATFORM_FILE_CREATE_ALWAYS | PLATFORM_FILE_CREATE)) | 86 else if (flags & (PLATFORM_FILE_CREATE_ALWAYS | PLATFORM_FILE_CREATE)) |
87 *created = true; | 87 *created = true; |
88 } | 88 } |
89 | 89 |
90 if (error) { | 90 if (error) { |
91 if (file != kInvalidPlatformFileValue) | 91 if (file != kInvalidPlatformFileValue) |
92 *error = PLATFORM_FILE_OK; | 92 *error = PLATFORM_FILE_OK; |
93 else { | 93 else |
94 DWORD last_error = GetLastError(); | 94 *error = LastErrorToPlatformFileError(GetLastError()); |
95 switch (last_error) { | |
96 case ERROR_SHARING_VIOLATION: | |
97 *error = PLATFORM_FILE_ERROR_IN_USE; | |
98 break; | |
99 case ERROR_FILE_EXISTS: | |
100 *error = PLATFORM_FILE_ERROR_EXISTS; | |
101 break; | |
102 case ERROR_FILE_NOT_FOUND: | |
103 case ERROR_PATH_NOT_FOUND: | |
104 *error = PLATFORM_FILE_ERROR_NOT_FOUND; | |
105 break; | |
106 case ERROR_ACCESS_DENIED: | |
107 *error = PLATFORM_FILE_ERROR_ACCESS_DENIED; | |
108 break; | |
109 case ERROR_TOO_MANY_OPEN_FILES: | |
110 *error = PLATFORM_FILE_ERROR_TOO_MANY_OPENED; | |
111 break; | |
112 case ERROR_OUTOFMEMORY: | |
113 case ERROR_NOT_ENOUGH_MEMORY: | |
114 *error = PLATFORM_FILE_ERROR_NO_MEMORY; | |
115 break; | |
116 case ERROR_HANDLE_DISK_FULL: | |
117 case ERROR_DISK_FULL: | |
118 case ERROR_DISK_RESOURCES_EXHAUSTED: | |
119 *error = PLATFORM_FILE_ERROR_NO_SPACE; | |
120 break; | |
121 case ERROR_USER_MAPPED_FILE: | |
122 *error = PLATFORM_FILE_ERROR_INVALID_OPERATION; | |
123 break; | |
124 case ERROR_NOT_READY: | |
125 case ERROR_SECTOR_NOT_FOUND: | |
126 case ERROR_DEV_NOT_EXIST: | |
127 case ERROR_IO_DEVICE: | |
128 case ERROR_FILE_CORRUPT: | |
129 case ERROR_DISK_CORRUPT: | |
130 *error = PLATFORM_FILE_ERROR_IO; | |
131 break; | |
132 default: | |
133 UMA_HISTOGRAM_SPARSE_SLOWLY("PlatformFile.UnknownCreateFileErrors", | |
134 last_error); | |
135 *error = PLATFORM_FILE_ERROR_FAILED; | |
136 } | |
137 } | |
138 } | 95 } |
139 | 96 |
140 return file; | 97 return file; |
141 } | 98 } |
142 | 99 |
143 FILE* FdopenPlatformFile(PlatformFile file, const char* mode) { | 100 FILE* FdopenPlatformFile(PlatformFile file, const char* mode) { |
144 if (file == kInvalidPlatformFileValue) | 101 if (file == kInvalidPlatformFileValue) |
145 return NULL; | 102 return NULL; |
146 int fd = _open_osfhandle(reinterpret_cast<intptr_t>(file), 0); | 103 int fd = _open_osfhandle(reinterpret_cast<intptr_t>(file), 0); |
147 if (fd < 0) | 104 if (fd < 0) |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 info->size = size.QuadPart; | 249 info->size = size.QuadPart; |
293 info->is_directory = | 250 info->is_directory = |
294 (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; | 251 (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; |
295 info->is_symbolic_link = false; // Windows doesn't have symbolic links. | 252 info->is_symbolic_link = false; // Windows doesn't have symbolic links. |
296 info->last_modified = base::Time::FromFileTime(file_info.ftLastWriteTime); | 253 info->last_modified = base::Time::FromFileTime(file_info.ftLastWriteTime); |
297 info->last_accessed = base::Time::FromFileTime(file_info.ftLastAccessTime); | 254 info->last_accessed = base::Time::FromFileTime(file_info.ftLastAccessTime); |
298 info->creation_time = base::Time::FromFileTime(file_info.ftCreationTime); | 255 info->creation_time = base::Time::FromFileTime(file_info.ftCreationTime); |
299 return true; | 256 return true; |
300 } | 257 } |
301 | 258 |
| 259 PlatformFileError LastErrorToPlatformFileError(DWORD last_error) { |
| 260 switch (last_error) { |
| 261 case ERROR_SHARING_VIOLATION: |
| 262 return PLATFORM_FILE_ERROR_IN_USE; |
| 263 case ERROR_FILE_EXISTS: |
| 264 return PLATFORM_FILE_ERROR_EXISTS; |
| 265 case ERROR_FILE_NOT_FOUND: |
| 266 case ERROR_PATH_NOT_FOUND: |
| 267 return PLATFORM_FILE_ERROR_NOT_FOUND; |
| 268 case ERROR_ACCESS_DENIED: |
| 269 return PLATFORM_FILE_ERROR_ACCESS_DENIED; |
| 270 case ERROR_TOO_MANY_OPEN_FILES: |
| 271 return PLATFORM_FILE_ERROR_TOO_MANY_OPENED; |
| 272 case ERROR_OUTOFMEMORY: |
| 273 case ERROR_NOT_ENOUGH_MEMORY: |
| 274 return PLATFORM_FILE_ERROR_NO_MEMORY; |
| 275 case ERROR_HANDLE_DISK_FULL: |
| 276 case ERROR_DISK_FULL: |
| 277 case ERROR_DISK_RESOURCES_EXHAUSTED: |
| 278 return PLATFORM_FILE_ERROR_NO_SPACE; |
| 279 case ERROR_USER_MAPPED_FILE: |
| 280 return PLATFORM_FILE_ERROR_INVALID_OPERATION; |
| 281 case ERROR_NOT_READY: |
| 282 case ERROR_SECTOR_NOT_FOUND: |
| 283 case ERROR_DEV_NOT_EXIST: |
| 284 case ERROR_IO_DEVICE: |
| 285 case ERROR_FILE_CORRUPT: |
| 286 case ERROR_DISK_CORRUPT: |
| 287 return PLATFORM_FILE_ERROR_IO; |
| 288 default: |
| 289 UMA_HISTOGRAM_SPARSE_SLOWLY("PlatformFile.UnknownCreateFileErrors", |
| 290 last_error); |
| 291 return PLATFORM_FILE_ERROR_FAILED; |
| 292 } |
| 293 } |
| 294 |
302 } // namespace base | 295 } // namespace base |
OLD | NEW |