49 lines
1.3 KiB
C#
49 lines
1.3 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using MxGateway.Contracts.Proto;
|
|
|
|
namespace MxGateway.Worker.Conversion;
|
|
|
|
public sealed class HResultConverter
|
|
{
|
|
public HResultConversion Convert(Exception exception)
|
|
{
|
|
if (exception is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(exception));
|
|
}
|
|
|
|
int hresult = exception is COMException comException
|
|
? comException.ErrorCode
|
|
: exception.HResult;
|
|
|
|
return new HResultConversion(
|
|
hresult,
|
|
CreateProtocolStatus(hresult, exception),
|
|
CreateSafeDiagnosticMessage(exception));
|
|
}
|
|
|
|
public ProtocolStatus CreateProtocolStatus(
|
|
int hresult,
|
|
Exception? exception = null)
|
|
{
|
|
return new ProtocolStatus
|
|
{
|
|
Code = hresult == 0 ? ProtocolStatusCode.Ok : ProtocolStatusCode.MxaccessFailure,
|
|
Message = exception is null
|
|
? FormatHResult(hresult)
|
|
: $"{exception.GetType().Name}: {FormatHResult(hresult)}",
|
|
};
|
|
}
|
|
|
|
private static string CreateSafeDiagnosticMessage(Exception exception)
|
|
{
|
|
return $"{exception.GetType().FullName}: {FormatHResult(exception.HResult)}";
|
|
}
|
|
|
|
private static string FormatHResult(int hresult)
|
|
{
|
|
return $"HRESULT 0x{unchecked((uint)hresult):X8}";
|
|
}
|
|
}
|