using System;
using Microsoft.SPOT;
using System.Reflection;
//namespace System.Runtime.CompilerServices
//{
// [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
// public sealed class ExtensionAttribute : Attribute { }
//}
namespace BreakContinue.Diagnostics
{
///
/// Helper extension to get HRESULT name
///
public static class ExceptionMessage
{
#region .Net MicroFramework HRESULT codes
public const uint CLR_E_UNKNOWN_INSTRUCTION = 0x80000000 | 0x01000000 | 0x0000;
public const uint CLR_E_UNSUPPORTED_INSTRUCTION = 0x80000000 | 0x02000000 | 0x0000;
public const uint CLR_E_STACK_OVERFLOW = 0x80000000 | 0x11000000 | 0x0000;
public const uint CLR_E_STACK_UNDERFLOW = 0x80000000 | 0x12000000 | 0x0000;
public const uint CLR_E_ENTRY_NOT_FOUND = 0x80000000 | 0x15000000 | 0x0000;
public const uint CLR_E_ASSM_WRONG_CHECKSUM = 0x80000000 | 0x16000000 | 0x0000;
public const uint CLR_E_ASSM_PATCHING_NOT_SUPPORTED = 0x80000000 | 0x17000000 | 0x0000;
public const uint CLR_E_SHUTTING_DOWN = 0x80000000 | 0x18000000 | 0x0000;
public const uint CLR_E_OBJECT_DISPOSED = 0x80000000 | 0x19000000 | 0x0000;
public const uint CLR_E_WATCHDOG_TIMEOUT = 0x80000000 | 0x1A000000 | 0x0000;
public const uint CLR_E_NULL_REFERENCE = 0x80000000 | 0x21000000 | 0x0000;
public const uint CLR_E_WRONG_TYPE = 0x80000000 | 0x22000000 | 0x0000;
public const uint CLR_E_TYPE_UNAVAILABLE = 0x80000000 | 0x23000000 | 0x0000;
public const uint CLR_E_INVALID_CAST = 0x80000000 | 0x24000000 | 0x0000;
public const uint CLR_E_OUT_OF_RANGE = 0x80000000 | 0x25000000 | 0x0000;
public const uint CLR_E_SERIALIZATION_VIOLATION = 0x80000000 | 0x27000000 | 0x0000;
public const uint CLR_E_SERIALIZATION_BADSTREAM = 0x80000000 | 0x28000000 | 0x0000;
public const uint CLR_E_INDEX_OUT_OF_RANGE = 0x80000000 | 0x29000000 | 0x0000;
public const uint CLR_E_DIVIDE_BY_ZERO = 0x80000000 | 0x31000000 | 0x0000;
public const uint CLR_E_BUSY = 0x80000000 | 0x33000000 | 0x0000;
public const uint CLR_E_PROCESS_EXCEPTION = 0x80000000 | 0x41000000 | 0x0000;
public const uint CLR_E_THREAD_WAITING = 0x80000000 | 0x42000000 | 0x0000;
public const uint CLR_E_LOCK_SYNCHRONIZATION_EXCEPTION = 0x80000000 | 0x44000000 | 0x0000;
public const uint CLR_E_APPDOMAIN_EXITED = 0x80000000 | 0x48000000 | 0x0000;
public const uint CLR_E_APPDOMAIN_MARSHAL_EXCEPTION = 0x80000000 | 0x49000000 | 0x0000;
public const uint CLR_E_NOTIMPL = 0x80000000 | 0x4a000000 | 0x0000;
public const uint CLR_E_UNKNOWN_TYPE = 0x80000000 | 0x4d000000 | 0x0000;
public const uint CLR_E_ARGUMENT_NULL = 0x80000000 | 0x4e000000 | 0x0000;
public const uint CLR_E_IO = 0x80000000 | 0x4f000000 | 0x0000;
public const uint CLR_E_ENTRYPOINT_NOT_FOUND = 0x80000000 | 0x50000000 | 0x0000;
public const uint CLR_E_DRIVER_NOT_REGISTERED = 0x80000000 | 0x51000000 | 0x0000;
//
// Gp IO error codes
//
public const uint CLR_E_PIN_UNAVAILABLE = 0x80000000 | 0x54000000 | 0x0000;
public const uint CLR_E_PIN_DEAD = 0x80000000 | 0x55000000 | 0x0000;
public const uint CLR_E_INVALID_OPERATION = 0x80000000 | 0x56000000 | 0x0000;
public const uint CLR_E_WRONG_INTERRUPT_TYPE = 0x80000000 | 0x57000000 | 0x0000;
public const uint CLR_E_NO_INTERRUPT = 0x80000000 | 0x58000000 | 0x0000;
public const uint CLR_E_DISPATCHER_ACTIVE = 0x80000000 | 0x59000000 | 0x0000;
//
// IO error codes
//
public const uint CLR_E_FILE_IO = 0x80000000 | 0x60000000 | 0x0000;
public const uint CLR_E_INVALID_DRIVER = 0x80000000 | 0x61000000 | 0x0000;
public const uint CLR_E_FILE_NOT_FOUND = 0x80000000 | 0x62000000 | 0x0000;
public const uint CLR_E_DIRECTORY_NOT_FOUND = 0x80000000 | 0x63000000 | 0x0000;
public const uint CLR_E_VOLUME_NOT_FOUND = 0x80000000 | 0x64000000 | 0x0000;
public const uint CLR_E_PATH_TOO_LONG = 0x80000000 | 0x65000000 | 0x0000;
public const uint CLR_E_DIRECTORY_NOT_EMPTY = 0x80000000 | 0x66000000 | 0x0000;
public const uint CLR_E_UNAUTHORIZED_ACCESS = 0x80000000 | 0x67000000 | 0x0000;
public const uint CLR_E_PATH_ALREADY_EXISTS = 0x80000000 | 0x68000000 | 0x0000;
public const uint CLR_E_TOO_MANY_OPEN_HANDLES = 0x80000000 | 0x69000000 | 0x0000;
//
// General error codes
//
public const uint CLR_E_NOT_SUPPORTED = 0x80000000 | 0x77000000 | 0x0000;
public const uint CLR_E_RESCHEDULE = 0x80000000 | 0x78000000 | 0x0000;
public const uint CLR_E_OUT_OF_MEMORY = 0x80000000 | 0x7A000000 | 0x0000;
public const uint CLR_E_RESTART_EXECUTION = 0x80000000 | 0x7B000000 | 0x0000;
public const uint CLR_E_INVALID_PARAMETER = 0x80000000 | 0x7D000000 | 0x0000;
public const uint CLR_E_TIMEOUT = 0x80000000 | 0x7E000000 | 0x0000;
public const uint CLR_E_FAIL = 0x80000000 | 0x7f000000 | 0x0000;
//--//
public const uint CLR_S_THREAD_EXITED = 0x01000000 | 0x0000;
public const uint CLR_S_QUANTUM_EXPIRED = 0x02000000 | 0x0000;
public const uint CLR_S_NO_READY_THREADS = 0x03000000 | 0x0000;
public const uint CLR_S_NO_THREADS = 0x04000000 | 0x0000;
public const uint CLR_S_RESTART_EXECUTION = 0x05000000 | 0x0000;
//
// PARSER error codes.
//
public const uint CLR_E_PARSER_BAD_TEXT_SIGNATURE = 0x80000000 | 0x01010000 | 0x0001;
public const uint CLR_E_PARSER_BAD_CUSTOM_ATTRIBUTE = 0x80000000 | 0x01010000 | 0x0002;
public const uint CLR_E_PARSER_UNSUPPORTED_MULTIDIM_ARRAY = 0x80000000 | 0x01010000 | 0x0003;
public const uint CLR_E_PARSER_UNKNOWN_MEMBER_REF = 0x80000000 | 0x01010000 | 0x0004;
public const uint CLR_E_PARSER_MISSING_FIELD = 0x80000000 | 0x01010000 | 0x0005;
public const uint CLR_E_PARSER_MISSING_METHOD = 0x80000000 | 0x01010000 | 0x0006;
public const uint CLR_E_PARSER_MISSING_INTERFACE = 0x80000000 | 0x01010000 | 0x0007;
public const uint CLR_E_PARSER_MISSING_TOKEN = 0x80000000 | 0x01010000 | 0x0008;
public const uint CLR_E_PARSER_UNSUPPORTED_GENERICS = 0x80000000 | 0x01010000 | 0x0009;
#endregion
///
/// Extension method that returns "name" of the hresult code as it is defined in MF
///
///
///
static public string HResultToString(this Exception ex)
{
string ret = string.Empty;
//I have to use reflection because m_HResult is a protected field
Type exceptionType = typeof(Exception);
FieldInfo hresultFieldInfo = exceptionType.GetField("m_HResult", BindingFlags.Instance | BindingFlags.NonPublic);
uint hResult = hresultFieldInfo != null ? (uint)hresultFieldInfo.GetValue(ex) : 0;
switch (hResult)
{
case CLR_E_UNKNOWN_INSTRUCTION:
ret = "CLR_E_UNKNOWN_INSTRUCTION";
break;
case CLR_E_UNSUPPORTED_INSTRUCTION:
ret = "CLR_E_UNSUPPORTED_INSTRUCTION";
break;
case CLR_E_STACK_OVERFLOW:
ret = "CLR_E_STACK_OVERFLOW";
break;
case CLR_E_STACK_UNDERFLOW:
ret = "CLR_E_STACK_UNDERFLOW";
break;
case CLR_E_ENTRY_NOT_FOUND:
ret = "CLR_E_ENTRY_NOT_FOUND";
break;
case CLR_E_ASSM_WRONG_CHECKSUM:
ret = "CLR_E_ASSM_WRONG_CHECKSUM";
break;
case CLR_E_ASSM_PATCHING_NOT_SUPPORTED:
ret = "CLR_E_ASSM_PATCHING_NOT_SUPPORTED";
break;
case CLR_E_SHUTTING_DOWN:
ret = "CLR_E_SHUTTING_DOWN";
break;
case CLR_E_OBJECT_DISPOSED:
ret = "CLR_E_OBJECT_DISPOSED";
break;
case CLR_E_WATCHDOG_TIMEOUT:
ret = "CLR_E_OBJECT_DISPOSED";
break;
case CLR_E_NULL_REFERENCE:
ret = "CLR_E_NULL_REFERENCE";
break;
case CLR_E_WRONG_TYPE:
ret = "CLR_E_WRONG_TYPE";
break;
case CLR_E_TYPE_UNAVAILABLE:
ret = "CLR_E_TYPE_UNAVAILABLE";
break;
case CLR_E_INVALID_CAST:
ret = "CLR_E_INVALID_CAST";
break;
case CLR_E_OUT_OF_RANGE:
ret = "CLR_E_OUT_OF_RANGE";
break;
case CLR_E_SERIALIZATION_VIOLATION:
ret = "CLR_E_SERIALIZATION_VIOLATION";
break;
case CLR_E_SERIALIZATION_BADSTREAM:
ret = "CLR_E_SERIALIZATION_BADSTREAM";
break;
case CLR_E_INDEX_OUT_OF_RANGE:
ret = "CLR_E_INDEX_OUT_OF_RANGE";
break;
case CLR_E_DIVIDE_BY_ZERO:
ret = "CLR_E_DIVIDE_BY_ZERO";
break;
case CLR_E_BUSY:
ret = "CLR_E_BUSY";
break;
case CLR_E_PROCESS_EXCEPTION:
ret = "CLR_E_PROCESS_EXCEPTION";
break;
case CLR_E_THREAD_WAITING:
ret = "CLR_E_THREAD_WAITING";
break;
case CLR_E_LOCK_SYNCHRONIZATION_EXCEPTION:
ret = "CLR_E_LOCK_SYNCHRONIZATION_EXCEPTION";
break;
case CLR_E_APPDOMAIN_EXITED:
ret = "CLR_E_APPDOMAIN_EXITED";
break;
case CLR_E_APPDOMAIN_MARSHAL_EXCEPTION:
ret = "CLR_E_APPDOMAIN_MARSHAL_EXCEPTION";
break;
case CLR_E_NOTIMPL:
ret = "CLR_E_NOTIMPL";
break;
case CLR_E_UNKNOWN_TYPE:
ret = "CLR_E_UNKNOWN_TYPE";
break;
case CLR_E_ARGUMENT_NULL:
ret = "CLR_E_ARGUMENT_NULL";
break;
case CLR_E_IO:
ret = "CLR_E_IO";
break;
case CLR_E_ENTRYPOINT_NOT_FOUND:
ret = "CLR_E_ENTRYPOINT_NOT_FOUND";
break;
case CLR_E_DRIVER_NOT_REGISTERED:
ret = "CLR_E_DRIVER_NOT_REGISTERED";
break;
case CLR_E_PIN_UNAVAILABLE:
ret = "CLR_E_PIN_UNAVAILABLE";
break;
case CLR_E_PIN_DEAD:
ret = "CLR_E_PIN_DEAD";
break;
case CLR_E_INVALID_OPERATION:
ret = "CLR_E_INVALID_OPERATION";
break;
case CLR_E_WRONG_INTERRUPT_TYPE:
ret = "CLR_E_WRONG_INTERRUPT_TYPE";
break;
case CLR_E_NO_INTERRUPT:
ret = "CLR_E_NO_INTERRUPT";
break;
case CLR_E_DISPATCHER_ACTIVE:
ret = "CLR_E_DISPATCHER_ACTIVE";
break;
case CLR_E_FILE_IO:
ret = "CLR_E_FILE_IO";
break;
case CLR_E_INVALID_DRIVER:
ret = "CLR_E_INVALID_DRIVER";
break;
case CLR_E_FILE_NOT_FOUND:
ret = "CLR_E_FILE_NOT_FOUND";
break;
case CLR_E_DIRECTORY_NOT_FOUND:
ret = "CLR_E_DIRECTORY_NOT_FOUND";
break;
case CLR_E_VOLUME_NOT_FOUND:
ret = "CLR_E_VOLUME_NOT_FOUND";
break;
case CLR_E_PATH_TOO_LONG:
ret = "CLR_E_PATH_TOO_LONG";
break;
case CLR_E_DIRECTORY_NOT_EMPTY:
ret = "CLR_E_DIRECTORY_NOT_EMPTY";
break;
case CLR_E_UNAUTHORIZED_ACCESS:
ret = "CLR_E_UNAUTHORIZED_ACCESS";
break;
case CLR_E_PATH_ALREADY_EXISTS:
ret = "CLR_E_PATH_ALREADY_EXISTS";
break;
case CLR_E_TOO_MANY_OPEN_HANDLES:
ret = "CLR_E_TOO_MANY_OPEN_HANDLES";
break;
case CLR_E_NOT_SUPPORTED:
ret = "CLR_E_NOT_SUPPORTED";
break;
case CLR_E_RESCHEDULE:
ret = "CLR_E_RESCHEDULE";
break;
case CLR_E_OUT_OF_MEMORY:
ret = "CLR_E_OUT_OF_MEMORY";
break;
case CLR_E_RESTART_EXECUTION:
ret = "CLR_E_RESTART_EXECUTION";
break;
case CLR_E_INVALID_PARAMETER:
ret = "CLR_E_INVALID_PARAMETER";
break;
case CLR_E_TIMEOUT:
ret = "CLR_E_TIMEOUT";
break;
case CLR_E_FAIL:
ret = "CLR_E_FAIL";
break;
case CLR_S_THREAD_EXITED:
ret = "CLR_S_THREAD_EXITED";
break;
case CLR_S_QUANTUM_EXPIRED:
ret = "CLR_S_QUANTUM_EXPIRED";
break;
case CLR_S_NO_READY_THREADS:
ret = "CLR_S_NO_READY_THREADS";
break;
case CLR_S_NO_THREADS:
ret = "CLR_S_NO_THREADS";
break;
case CLR_S_RESTART_EXECUTION:
ret = "CLR_S_RESTART_EXECUTION";
break;
case CLR_E_PARSER_BAD_TEXT_SIGNATURE:
ret = "CLR_E_PARSER_BAD_TEXT_SIGNATURE";
break;
case CLR_E_PARSER_BAD_CUSTOM_ATTRIBUTE:
ret = "CLR_E_PARSER_BAD_CUSTOM_ATTRIBUTE";
break;
case CLR_E_PARSER_UNSUPPORTED_MULTIDIM_ARRAY:
ret = "CLR_E_PARSER_UNSUPPORTED_MULTIDIM_ARRAY";
break;
case CLR_E_PARSER_UNKNOWN_MEMBER_REF:
ret = "CLR_E_PARSER_UNKNOWN_MEMBER_REF";
break;
case CLR_E_PARSER_MISSING_FIELD:
ret = "CLR_E_PARSER_MISSING_FIELD";
break;
case CLR_E_PARSER_MISSING_METHOD:
ret = "CLR_E_PARSER_MISSING_METHOD";
break;
case CLR_E_PARSER_MISSING_INTERFACE:
ret = "CLR_E_PARSER_MISSING_INTERFACE";
break;
case CLR_E_PARSER_MISSING_TOKEN:
ret = "CLR_E_PARSER_MISSING_TOKEN";
break;
case CLR_E_PARSER_UNSUPPORTED_GENERICS:
ret = "CLR_E_PARSER_UNSUPPORTED_GENERICS";
break;
default:
ret = "UNKNOWN";
break;
}
return ret;
}
}
}