137 lines
3.6 KiB
C#
137 lines
3.6 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using System.Runtime.ExceptionServices;
|
|
using ArchestrA.MxAccess;
|
|
|
|
namespace MxGateway.Worker.MxAccess;
|
|
|
|
public sealed class MxAccessComServer : IMxAccessServer
|
|
{
|
|
private readonly object mxAccessComObject;
|
|
|
|
public MxAccessComServer(object mxAccessComObject)
|
|
{
|
|
this.mxAccessComObject = mxAccessComObject ?? throw new ArgumentNullException(nameof(mxAccessComObject));
|
|
}
|
|
|
|
public int Register(string clientName)
|
|
{
|
|
if (mxAccessComObject is ILMXProxyServer mxAccessServer)
|
|
{
|
|
return mxAccessServer.Register(clientName);
|
|
}
|
|
|
|
return (int)Invoke(nameof(Register), clientName);
|
|
}
|
|
|
|
public void Unregister(int serverHandle)
|
|
{
|
|
if (mxAccessComObject is ILMXProxyServer mxAccessServer)
|
|
{
|
|
mxAccessServer.Unregister(serverHandle);
|
|
return;
|
|
}
|
|
|
|
Invoke(nameof(Unregister), serverHandle);
|
|
}
|
|
|
|
public int AddItem(
|
|
int serverHandle,
|
|
string itemDefinition)
|
|
{
|
|
if (mxAccessComObject is ILMXProxyServer mxAccessServer)
|
|
{
|
|
return mxAccessServer.AddItem(serverHandle, itemDefinition);
|
|
}
|
|
|
|
return (int)Invoke(nameof(AddItem), serverHandle, itemDefinition);
|
|
}
|
|
|
|
public int AddItem2(
|
|
int serverHandle,
|
|
string itemDefinition,
|
|
string itemContext)
|
|
{
|
|
if (mxAccessComObject is ILMXProxyServer3 mxAccessServer)
|
|
{
|
|
return mxAccessServer.AddItem2(serverHandle, itemDefinition, itemContext);
|
|
}
|
|
|
|
return (int)Invoke(nameof(AddItem2), serverHandle, itemDefinition, itemContext);
|
|
}
|
|
|
|
public void RemoveItem(
|
|
int serverHandle,
|
|
int itemHandle)
|
|
{
|
|
if (mxAccessComObject is ILMXProxyServer mxAccessServer)
|
|
{
|
|
mxAccessServer.RemoveItem(serverHandle, itemHandle);
|
|
return;
|
|
}
|
|
|
|
Invoke(nameof(RemoveItem), serverHandle, itemHandle);
|
|
}
|
|
|
|
public void Advise(
|
|
int serverHandle,
|
|
int itemHandle)
|
|
{
|
|
if (mxAccessComObject is ILMXProxyServer mxAccessServer)
|
|
{
|
|
mxAccessServer.Advise(serverHandle, itemHandle);
|
|
return;
|
|
}
|
|
|
|
Invoke(nameof(Advise), serverHandle, itemHandle);
|
|
}
|
|
|
|
public void UnAdvise(
|
|
int serverHandle,
|
|
int itemHandle)
|
|
{
|
|
if (mxAccessComObject is ILMXProxyServer mxAccessServer)
|
|
{
|
|
mxAccessServer.UnAdvise(serverHandle, itemHandle);
|
|
return;
|
|
}
|
|
|
|
Invoke(nameof(UnAdvise), serverHandle, itemHandle);
|
|
}
|
|
|
|
public void AdviseSupervisory(
|
|
int serverHandle,
|
|
int itemHandle)
|
|
{
|
|
if (mxAccessComObject is ILMXProxyServer4 mxAccessServer)
|
|
{
|
|
mxAccessServer.AdviseSupervisory(serverHandle, itemHandle);
|
|
return;
|
|
}
|
|
|
|
Invoke(nameof(AdviseSupervisory), serverHandle, itemHandle);
|
|
}
|
|
|
|
private object Invoke(
|
|
string methodName,
|
|
params object[] arguments)
|
|
{
|
|
try
|
|
{
|
|
return mxAccessComObject
|
|
.GetType()
|
|
.InvokeMember(
|
|
methodName,
|
|
BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
|
|
binder: null,
|
|
target: mxAccessComObject,
|
|
args: arguments);
|
|
}
|
|
catch (TargetInvocationException exception) when (exception.InnerException is not null)
|
|
{
|
|
ExceptionDispatchInfo.Capture(exception.InnerException).Throw();
|
|
throw;
|
|
}
|
|
}
|
|
}
|