Skip to content

Translate between Windows Errors and Cocoa Errors #2325

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 12, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 52 additions & 4 deletions Foundation/FoundationErrors.swift
Original file line number Diff line number Diff line change
Expand Up @@ -212,10 +212,58 @@ internal func _NSErrorWithErrno(_ posixErrno : Int32, reading : Bool, path : Str
internal let _NSWindowsErrorDomain = "org.swift.Foundation.WindowsError"

internal func _NSErrorWithWindowsError(_ windowsError: DWORD, reading: Bool) -> NSError {
// <#TODO#> os(Windows): Map Win32 errors to Cocoa errors as _NSErrorWithErrno() does.
let code: CocoaError.Code = reading ? .fileReadUnknown : .fileWriteUnknown
return NSError(domain: NSCocoaErrorDomain, code: code.rawValue, userInfo: [
NSUnderlyingErrorKey: NSError(domain: _NSWindowsErrorDomain, code: Int(windowsError))
var cocoaError : CocoaError.Code
switch Int32(bitPattern: windowsError) {
case ERROR_LOCK_VIOLATION: cocoaError = .fileLocking
case ERROR_NOT_LOCKED: cocoaError = .fileLocking
case ERROR_LOCK_FAILED: cocoaError = .fileLocking
case ERROR_INVALID_EXE_SIGNATURE: cocoaError = .executableNotLoadable
case ERROR_EXE_MARKED_INVALID: cocoaError = .executableNotLoadable
case ERROR_BAD_EXE_FORMAT: cocoaError = .executableNotLoadable
case ERROR_BAD_EXE_FORMAT: cocoaError = .executableNotLoadable
case ERROR_LOCKED: cocoaError = .fileLocking
default:
if reading {
switch Int32(bitPattern: windowsError) {
case ERROR_FILE_NOT_FOUND: cocoaError = .fileReadNoSuchFile
case ERROR_PATH_NOT_FOUND: cocoaError = .fileReadNoSuchFile
case ERROR_ACCESS_DENIED: cocoaError = .fileReadNoPermission
case ERROR_INVALID_ACCESS: cocoaError = .fileReadNoPermission
case ERROR_INVALID_DRIVE: cocoaError = .fileReadNoSuchFile
case ERROR_SHARING_VIOLATION: cocoaError = .fileReadNoPermission
case ERROR_INVALID_NAME: cocoaError = .fileReadInvalidFileName
case ERROR_LABEL_TOO_LONG: cocoaError = .fileReadInvalidFileName
case ERROR_BAD_PATHNAME: cocoaError = .fileReadInvalidFileName
case ERROR_FILENAME_EXCED_RANGE: cocoaError = .fileReadInvalidFileName
case ERROR_DIRECTORY: cocoaError = .fileReadInvalidFileName
default: cocoaError = .fileReadUnknown
}
} else {
switch Int32(bitPattern: windowsError) {
case ERROR_FILE_NOT_FOUND: cocoaError = .fileNoSuchFile
case ERROR_PATH_NOT_FOUND: cocoaError = .fileNoSuchFile
case ERROR_ACCESS_DENIED: cocoaError = .fileWriteNoPermission
case ERROR_INVALID_ACCESS: cocoaError = .fileWriteNoPermission
case ERROR_INVALID_DRIVE: cocoaError = .fileNoSuchFile
case ERROR_WRITE_PROTECT: cocoaError = .fileWriteVolumeReadOnly
case ERROR_WRITE_FAULT: cocoaError = .fileWriteNoPermission
case ERROR_SHARING_VIOLATION: cocoaError = .fileWriteNoPermission
case ERROR_FILE_EXISTS: cocoaError = .fileWriteFileExists
case ERROR_DISK_FULL: cocoaError = .fileWriteOutOfSpace
case ERROR_INVALID_NAME: cocoaError = .fileWriteInvalidFileName
case ERROR_LABEL_TOO_LONG: cocoaError = .fileWriteInvalidFileName
case ERROR_BAD_PATHNAME: cocoaError = .fileWriteInvalidFileName
case ERROR_ALREADY_EXISTS: cocoaError = .fileWriteFileExists
case ERROR_FILENAME_EXCED_RANGE: cocoaError = .fileWriteInvalidFileName
case ERROR_DIRECTORY: cocoaError = .fileWriteInvalidFileName
case ERROR_DISK_RESOURCES_EXHAUSTED: cocoaError = .fileWriteOutOfSpace
default: cocoaError = .fileWriteUnknown
}
}
}

return NSError(domain: NSCocoaErrorDomain, code: cocoaError.rawValue, userInfo: [
NSUnderlyingErrorKey: NSError(domain: _NSWindowsErrorDomain, code: Int(windowsError))
])
}
#endif