You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.4 KiB
81 lines
2.4 KiB
// License: Apache 2.0. See LICENSE file in root directory.
|
|
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.
|
|
|
|
namespace Intel.RealSense
|
|
{
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
|
|
/// <summary>
|
|
/// Custom marshaler for throwing exceptions on errors codes.
|
|
/// </summary>
|
|
public class ErrorMarshaler : ICustomMarshaler
|
|
{
|
|
private static ErrorMarshaler Instance;
|
|
|
|
public static ICustomMarshaler GetInstance(string s)
|
|
{
|
|
if (Instance == null)
|
|
{
|
|
Instance = new ErrorMarshaler();
|
|
}
|
|
|
|
return Instance;
|
|
}
|
|
|
|
public void CleanUpManagedData(object ManagedObj)
|
|
{
|
|
}
|
|
|
|
public void CleanUpNativeData(IntPtr pNativeData)
|
|
{
|
|
// !TODO: maybe rs_free_error here?
|
|
NativeMethods.rs2_free_error(pNativeData);
|
|
}
|
|
|
|
public int GetNativeDataSize()
|
|
{
|
|
return IntPtr.Size;
|
|
}
|
|
|
|
public IntPtr MarshalManagedToNative(object ManagedObj)
|
|
{
|
|
return IntPtr.Zero;
|
|
}
|
|
|
|
public object MarshalNativeToManaged(IntPtr pNativeData)
|
|
{
|
|
if (pNativeData == IntPtr.Zero)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
string function = Marshal.PtrToStringAnsi(NativeMethods.rs2_get_failed_function(pNativeData));
|
|
string args = Marshal.PtrToStringAnsi(NativeMethods.rs2_get_failed_args(pNativeData));
|
|
string message = Marshal.PtrToStringAnsi(NativeMethods.rs2_get_error_message(pNativeData));
|
|
ExceptionType type = NativeMethods.rs2_get_librealsense_exception_type(pNativeData);
|
|
|
|
var inner = new ExternalException($"{function}({args})");
|
|
switch (type)
|
|
{
|
|
case ExceptionType.NotImplemented:
|
|
throw new NotImplementedException(message, inner);
|
|
|
|
case ExceptionType.WrongApiCallSequence:
|
|
throw new InvalidOperationException(message, inner);
|
|
|
|
case ExceptionType.InvalidValue:
|
|
throw new ArgumentException(message, inner);
|
|
|
|
case ExceptionType.Io:
|
|
throw new System.IO.IOException(message, inner);
|
|
|
|
default:
|
|
// TODO: custom exception type
|
|
throw new Exception(message, inner);
|
|
}
|
|
}
|
|
}
|
|
}
|