Skip to content

Commit 39e3587

Browse files
authored
Merge pull request #2325 from gmittert/WindowsErrors
Translate between Windows Errors and Cocoa Errors
2 parents 3ed9466 + 201d85d commit 39e3587

File tree

1 file changed

+52
-4
lines changed

1 file changed

+52
-4
lines changed

Foundation/FoundationErrors.swift

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,58 @@ internal func _NSErrorWithErrno(_ posixErrno : Int32, reading : Bool, path : Str
212212
internal let _NSWindowsErrorDomain = "org.swift.Foundation.WindowsError"
213213

214214
internal func _NSErrorWithWindowsError(_ windowsError: DWORD, reading: Bool) -> NSError {
215-
// <#TODO#> os(Windows): Map Win32 errors to Cocoa errors as _NSErrorWithErrno() does.
216-
let code: CocoaError.Code = reading ? .fileReadUnknown : .fileWriteUnknown
217-
return NSError(domain: NSCocoaErrorDomain, code: code.rawValue, userInfo: [
218-
NSUnderlyingErrorKey: NSError(domain: _NSWindowsErrorDomain, code: Int(windowsError))
215+
var cocoaError : CocoaError.Code
216+
switch Int32(bitPattern: windowsError) {
217+
case ERROR_LOCK_VIOLATION: cocoaError = .fileLocking
218+
case ERROR_NOT_LOCKED: cocoaError = .fileLocking
219+
case ERROR_LOCK_FAILED: cocoaError = .fileLocking
220+
case ERROR_INVALID_EXE_SIGNATURE: cocoaError = .executableNotLoadable
221+
case ERROR_EXE_MARKED_INVALID: cocoaError = .executableNotLoadable
222+
case ERROR_BAD_EXE_FORMAT: cocoaError = .executableNotLoadable
223+
case ERROR_BAD_EXE_FORMAT: cocoaError = .executableNotLoadable
224+
case ERROR_LOCKED: cocoaError = .fileLocking
225+
default:
226+
if reading {
227+
switch Int32(bitPattern: windowsError) {
228+
case ERROR_FILE_NOT_FOUND: cocoaError = .fileReadNoSuchFile
229+
case ERROR_PATH_NOT_FOUND: cocoaError = .fileReadNoSuchFile
230+
case ERROR_ACCESS_DENIED: cocoaError = .fileReadNoPermission
231+
case ERROR_INVALID_ACCESS: cocoaError = .fileReadNoPermission
232+
case ERROR_INVALID_DRIVE: cocoaError = .fileReadNoSuchFile
233+
case ERROR_SHARING_VIOLATION: cocoaError = .fileReadNoPermission
234+
case ERROR_INVALID_NAME: cocoaError = .fileReadInvalidFileName
235+
case ERROR_LABEL_TOO_LONG: cocoaError = .fileReadInvalidFileName
236+
case ERROR_BAD_PATHNAME: cocoaError = .fileReadInvalidFileName
237+
case ERROR_FILENAME_EXCED_RANGE: cocoaError = .fileReadInvalidFileName
238+
case ERROR_DIRECTORY: cocoaError = .fileReadInvalidFileName
239+
default: cocoaError = .fileReadUnknown
240+
}
241+
} else {
242+
switch Int32(bitPattern: windowsError) {
243+
case ERROR_FILE_NOT_FOUND: cocoaError = .fileNoSuchFile
244+
case ERROR_PATH_NOT_FOUND: cocoaError = .fileNoSuchFile
245+
case ERROR_ACCESS_DENIED: cocoaError = .fileWriteNoPermission
246+
case ERROR_INVALID_ACCESS: cocoaError = .fileWriteNoPermission
247+
case ERROR_INVALID_DRIVE: cocoaError = .fileNoSuchFile
248+
case ERROR_WRITE_PROTECT: cocoaError = .fileWriteVolumeReadOnly
249+
case ERROR_WRITE_FAULT: cocoaError = .fileWriteNoPermission
250+
case ERROR_SHARING_VIOLATION: cocoaError = .fileWriteNoPermission
251+
case ERROR_FILE_EXISTS: cocoaError = .fileWriteFileExists
252+
case ERROR_DISK_FULL: cocoaError = .fileWriteOutOfSpace
253+
case ERROR_INVALID_NAME: cocoaError = .fileWriteInvalidFileName
254+
case ERROR_LABEL_TOO_LONG: cocoaError = .fileWriteInvalidFileName
255+
case ERROR_BAD_PATHNAME: cocoaError = .fileWriteInvalidFileName
256+
case ERROR_ALREADY_EXISTS: cocoaError = .fileWriteFileExists
257+
case ERROR_FILENAME_EXCED_RANGE: cocoaError = .fileWriteInvalidFileName
258+
case ERROR_DIRECTORY: cocoaError = .fileWriteInvalidFileName
259+
case ERROR_DISK_RESOURCES_EXHAUSTED: cocoaError = .fileWriteOutOfSpace
260+
default: cocoaError = .fileWriteUnknown
261+
}
262+
}
263+
}
264+
265+
return NSError(domain: NSCocoaErrorDomain, code: cocoaError.rawValue, userInfo: [
266+
NSUnderlyingErrorKey: NSError(domain: _NSWindowsErrorDomain, code: Int(windowsError))
219267
])
220268
}
221269
#endif

0 commit comments

Comments
 (0)