@@ -212,10 +212,58 @@ internal func _NSErrorWithErrno(_ posixErrno : Int32, reading : Bool, path : Str
212
212
internal let _NSWindowsErrorDomain = " org.swift.Foundation.WindowsError "
213
213
214
214
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) )
219
267
] )
220
268
}
221
269
#endif
0 commit comments