184 lines
6.9 KiB
C#
184 lines
6.9 KiB
C#
// ==++==
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// ==--==
|
|
//============================================================
|
|
//
|
|
// Class: __Error
|
|
//
|
|
// Purpose: Centralized error methods for the IO package.
|
|
// Mostly useful for translating Win32 HRESULTs into meaningful
|
|
// error strings & exceptions.
|
|
//
|
|
//===========================================================
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using Microsoft.Singularity.Directory;
|
|
|
|
|
|
namespace System.IO
|
|
{
|
|
// Only static data no need to serialize
|
|
internal sealed class __Error
|
|
{
|
|
private __Error() {
|
|
}
|
|
|
|
internal static void EndOfFile() {
|
|
throw new EndOfStreamException("IO.EOF_ReadBeyondEOF");
|
|
}
|
|
|
|
private static String GetMessage(int errorCode) {
|
|
return String.Format("IO_UnknownError {0}", errorCode);
|
|
}
|
|
|
|
internal static void FileNotOpen() {
|
|
throw new ObjectDisposedException(null, "ObjectDisposed_FileClosed");
|
|
}
|
|
|
|
internal static void StreamIsClosed() {
|
|
throw new ObjectDisposedException(null, "ObjectDisposed_StreamClosed");
|
|
}
|
|
|
|
internal static void MemoryStreamNotExpandable() {
|
|
throw new NotSupportedException("NotSupported_MemStreamNotExpandable");
|
|
}
|
|
|
|
internal static void ReaderClosed() {
|
|
throw new ObjectDisposedException(null, "ObjectDisposed_ReaderClosed");
|
|
}
|
|
|
|
internal static void ReadNotSupported() {
|
|
throw new NotSupportedException("NotSupported_UnreadableStream");
|
|
}
|
|
|
|
internal static void SeekNotSupported() {
|
|
throw new NotSupportedException("NotSupported_UnseekableStream");
|
|
}
|
|
|
|
internal static void WrongAsyncResult() {
|
|
throw new ArgumentException("Arg_WrongAsyncResult");
|
|
}
|
|
|
|
internal static void EndReadCalledTwice() {
|
|
throw new InvalidOperationException("InvalidOperation_EndReadCalledMultiple");
|
|
}
|
|
|
|
internal static void EndWriteCalledTwice() {
|
|
throw new InvalidOperationException("InvalidOperation_EndWriteCalledMultiple");
|
|
}
|
|
|
|
internal static void WinIOError() {
|
|
WinIOError(0, String.Empty);
|
|
}
|
|
|
|
internal static void SingularityIOError(ErrorCode code, String str) {
|
|
string errString = SdsUtils.ErrorCodeToString(code);
|
|
switch (code) {
|
|
case ErrorCode.NotFound :{
|
|
throw new FileNotFoundException(String.Format("FileNotFound: {0}", str));
|
|
}
|
|
default: {
|
|
throw new IOException(String.Format("{0}: {1}", errString, str));
|
|
}
|
|
}
|
|
}
|
|
|
|
internal static int ErrorCodeToWin32Error(ErrorCode code)
|
|
{
|
|
// Console.WriteLine("Converting error {0}", SdsUtils.ErrorCodeToString(code));
|
|
int win32 = 0;
|
|
switch (code) {
|
|
case ErrorCode.NoError :
|
|
win32 = 0;
|
|
break;
|
|
case ErrorCode.AccessDenied :
|
|
win32 = ERROR_ACCESS_DENIED;
|
|
break;
|
|
case ErrorCode.AlreadyExists :
|
|
win32 = ERROR_FILE_EXISTS;
|
|
break;
|
|
case ErrorCode.BadArguments:
|
|
win32 = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
case ErrorCode.ContractNotSupported :
|
|
win32 = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
case ErrorCode.NotFound :
|
|
win32 = ERROR_FILE_NOT_FOUND;
|
|
break;
|
|
case ErrorCode.NotSupported :
|
|
win32 = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
default :
|
|
win32 = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
return win32;
|
|
}
|
|
|
|
// After calling GetLastWin32Error(), it clears the last error field,
|
|
// so you must save the HResult and pass it to this method. This method
|
|
// will determine the appropriate exception to throw dependent on your
|
|
// error, and depending on the error, insert a string into the message
|
|
// gotten from the ResourceManager.
|
|
internal static void WinIOError(int errorCode, String str) {
|
|
switch (errorCode) {
|
|
case ERROR_FILE_NOT_FOUND: {
|
|
throw new FileNotFoundException("FileNotFound:" + str);
|
|
}
|
|
case ERROR_PATH_NOT_FOUND: {
|
|
throw new DirectoryNotFoundException("PathNotFound");
|
|
}
|
|
case ERROR_FILENAME_EXCED_RANGE: {
|
|
throw new PathTooLongException("PathTooLong");
|
|
}
|
|
case ERROR_INVALID_PARAMETER: {
|
|
throw new IOException("Invalid Parameter");
|
|
}
|
|
case ERROR_SHARING_VIOLATION: {
|
|
throw new IOException("SharingViolation");
|
|
}
|
|
case ERROR_FILE_EXISTS: {
|
|
throw new IOException("FileExists");
|
|
}
|
|
default: {
|
|
throw new IOException("Unexpanded error code");
|
|
}
|
|
}
|
|
}
|
|
|
|
internal static void WriteNotSupported() {
|
|
throw new NotSupportedException("NotSupported_UnwritableStream");
|
|
}
|
|
|
|
internal static void WriterClosed() {
|
|
throw new ObjectDisposedException(null, "ObjectDisposed_WriterClosed");
|
|
}
|
|
|
|
private const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
|
|
private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;
|
|
private const int FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000;
|
|
|
|
// From WinError.h
|
|
public const int ERROR_FILE_NOT_FOUND = Native.ERROR_FILE_NOT_FOUND;
|
|
public const int ERROR_PATH_NOT_FOUND = Native.ERROR_PATH_NOT_FOUND;
|
|
public const int ERROR_ACCESS_DENIED = Native.ERROR_ACCESS_DENIED;
|
|
public const int ERROR_INVALID_PARAMETER = Native.ERROR_INVALID_PARAMETER;
|
|
public const int ERROR_FILENAME_EXCED_RANGE = 0xCE;
|
|
public const int ERROR_SHARING_VIOLATION = 0x20;
|
|
public const int ERROR_FILE_EXISTS = 0x50;
|
|
|
|
public const int ERROR_NOT_SUPPORTED = Native.ERROR_NOT_SUPPORTED;
|
|
public const int ERROR_DUP_NAME = Native.ERROR_DUP_NAME;
|
|
public const int ERROR_DISK_FULL = Native.ERROR_DISK_FULL;
|
|
public const int ERROR_CALL_NOT_IMPLEMENTED = Native.ERROR_CALL_NOT_IMPLEMENTED;
|
|
public const int ERROR_DIR_NOT_EMPTY = Native.ERROR_DIR_NOT_EMPTY;
|
|
public const int ERROR_ALREADY_EXISTS = Native.ERROR_ALREADY_EXISTS;
|
|
|
|
}
|
|
}
|