Files
KinginfoGateway/framework/Foundation/ThingsGateway.Foundation.Adapter.OPCDA/COM/Rcw/Interop.cs
2023-09-30 23:05:53 +08:00

869 lines
38 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#region copyright
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权除特别声明外的代码归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库https://github.com/kimdiego2098/ThingsGateway
// 使用文档https://diego2098.gitee.io/thingsgateway-docs/
// QQ群605534569
//------------------------------------------------------------------------------
#endregion
using System.Collections;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Xml;
namespace ThingsGateway.Foundation.Adapter.OPCDA.Rcw;
#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释
public class Interop
{
public static PropertyID GetPropertyID(int input)
{
foreach (FieldInfo field in typeof(Property).GetFields(BindingFlags.Static | BindingFlags.Public))
{
PropertyID propertyId = (PropertyID)field.GetValue((object)typeof(PropertyID));
if (input == propertyId.Code)
return propertyId;
}
return new PropertyID(input);
}
internal static BrowseElement GetBrowseElement(IntPtr pInput, bool deallocate)
{
BrowseElement browseElement = (BrowseElement)null;
if (pInput != IntPtr.Zero)
{
OPCBROWSEELEMENT structure = (OPCBROWSEELEMENT)Marshal.PtrToStructure(pInput, typeof(OPCBROWSEELEMENT));
browseElement = new BrowseElement();
browseElement.Name = structure.szName;
browseElement.ItemPath = (string)null;
browseElement.ItemName = structure.szItemID;
browseElement.IsItem = (structure.dwFlagValue & 2) != 0;
browseElement.HasChildren = (structure.dwFlagValue & 1) != 0;
browseElement.Properties = Interop.GetItemProperties(ref structure.ItemProperties, deallocate);
if (deallocate)
Marshal.DestroyStructure(pInput, typeof(OPCBROWSEELEMENT));
}
return browseElement;
}
internal static OPCBROWSEELEMENT GetBrowseElement(
BrowseElement input,
bool propertiesRequested)
{
OPCBROWSEELEMENT browseElement = new OPCBROWSEELEMENT();
if (input != null)
{
browseElement.szName = input.Name;
browseElement.szItemID = input.ItemName;
browseElement.dwFlagValue = 0;
browseElement.ItemProperties = Interop.GetItemProperties(input.Properties);
if (input.IsItem)
browseElement.dwFlagValue |= 2;
if (input.HasChildren)
browseElement.dwFlagValue |= 1;
}
return browseElement;
}
internal static BrowseElement[] GetBrowseElements(
ref IntPtr pInput,
int count,
bool deallocate)
{
BrowseElement[] browseElements = (BrowseElement[])null;
if (pInput != IntPtr.Zero && count > 0)
{
browseElements = new BrowseElement[count];
IntPtr pInput1 = pInput;
for (int index = 0; index < count; ++index)
{
browseElements[index] = Interop.GetBrowseElement(pInput1, deallocate);
pInput1 = (IntPtr)(pInput1.ToInt64() + (long)Marshal.SizeOf(typeof(OPCBROWSEELEMENT)));
}
if (deallocate)
{
Marshal.FreeCoTaskMem(pInput);
pInput = IntPtr.Zero;
}
}
return browseElements;
}
internal static IntPtr GetBrowseElements(BrowseElement[] input, bool propertiesRequested)
{
IntPtr browseElements = IntPtr.Zero;
if (input != null && input.Length != 0)
{
browseElements = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(OPCBROWSEELEMENT)) * input.Length);
IntPtr ptr = browseElements;
for (int index = 0; index < input.Length; ++index)
{
Marshal.StructureToPtr((object)Interop.GetBrowseElement(input[index], propertiesRequested), ptr, false);
ptr = (IntPtr)(ptr.ToInt64() + (long)Marshal.SizeOf(typeof(OPCBROWSEELEMENT)));
}
}
return browseElements;
}
internal static ItemProperty[] GetItemProperties(
ref OPCITEMPROPERTIES input,
bool deallocate)
{
ItemProperty[] itemProperties = (ItemProperty[])null;
if (input.dwNumProperties > 0)
{
itemProperties = new ItemProperty[input.dwNumProperties];
IntPtr pInput = input.pItemProperties;
for (int index = 0; index < itemProperties.Length; ++index)
{
try
{
itemProperties[index] = Interop.GetItemProperty(pInput, deallocate);
}
catch (Exception ex)
{
itemProperties[index] = new ItemProperty();
itemProperties[index].Description = ex.Message;
itemProperties[index].ResultID = ResultID.E_FAIL;
}
pInput = (IntPtr)(pInput.ToInt64() + (long)Marshal.SizeOf(typeof(OPCITEMPROPERTY)));
}
if (deallocate)
{
Marshal.FreeCoTaskMem(input.pItemProperties);
input.pItemProperties = IntPtr.Zero;
}
}
return itemProperties;
}
internal static OPCITEMPROPERTIES GetItemProperties(ItemProperty[] input)
{
OPCITEMPROPERTIES itemProperties = new OPCITEMPROPERTIES();
if (input != null && input.Length != 0)
{
itemProperties.hrErrorID = 0;
itemProperties.dwReserved = 0;
itemProperties.dwNumProperties = input.Length;
itemProperties.pItemProperties = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(OPCITEMPROPERTY)) * input.Length);
bool flag = false;
IntPtr ptr = itemProperties.pItemProperties;
for (int index = 0; index < input.Length; ++index)
{
Marshal.StructureToPtr((object)Interop.GetItemProperty(input[index]), ptr, false);
ptr = (IntPtr)(ptr.ToInt64() + (long)Marshal.SizeOf(typeof(OPCITEMPROPERTY)));
if (input[index].ResultID.Failed())
flag = true;
}
if (flag)
itemProperties.hrErrorID = 1;
}
return itemProperties;
}
internal static ItemProperty GetItemProperty(IntPtr pInput, bool deallocate)
{
ItemProperty itemProperty = (ItemProperty)null;
if (pInput != IntPtr.Zero)
{
OPCITEMPROPERTY structure = (OPCITEMPROPERTY)Marshal.PtrToStructure(pInput, typeof(OPCITEMPROPERTY));
itemProperty = new ItemProperty()
{
ID = Interop.GetPropertyID(structure.dwPropertyID),
Description = structure.szDescription,
DataType = Interop.GetType((VarEnum)structure.vtDataType),
ItemPath = (string)null,
ItemName = structure.szItemID
};
itemProperty.Value = Interop.UnmarshalPropertyValue(itemProperty.ID, structure.vValue);
itemProperty.ResultID = Interop.GetResultID(structure.hrErrorID);
if (structure.hrErrorID == -1073479674)
itemProperty.ResultID = new ResultID(ResultID.Da.E_WRITEONLY, -1073479674L);
if (deallocate)
Marshal.DestroyStructure(pInput, typeof(OPCITEMPROPERTY));
}
return itemProperty;
}
internal static OPCITEMPROPERTY GetItemProperty(ItemProperty input)
{
OPCITEMPROPERTY itemProperty = new OPCITEMPROPERTY();
if (input != null)
{
itemProperty.dwPropertyID = input.ID.Code;
itemProperty.szDescription = input.Description;
itemProperty.vtDataType = (short)Interop.GetType(input.DataType);
itemProperty.vValue = Interop.MarshalPropertyValue(input.ID, input.Value);
itemProperty.wReserved = (short)0;
itemProperty.hrErrorID = Interop.GetResultID(input.ResultID);
PropertyDescription propertyDescription = PropertyDescription.Find(input.ID);
if (propertyDescription != null)
itemProperty.vtDataType = (short)Interop.GetType(propertyDescription.Type);
if (input.ResultID == ResultID.Da.E_WRITEONLY)
itemProperty.hrErrorID = -1073479674;
}
return itemProperty;
}
internal static int[] GetPropertyIDs(PropertyID[] propertyIDs)
{
ArrayList arrayList = new ArrayList();
if (propertyIDs != null)
{
foreach (PropertyID propertyId in propertyIDs)
arrayList.Add((object)propertyId.Code);
}
return (int[])arrayList.ToArray(typeof(int));
}
internal static ResultID GetResultID(int input)
{
switch (input)
{
case -2147467262:
return new ResultID(ResultID.E_NOTSUPPORTED, (long)input);
case -2147467259:
return new ResultID(ResultID.E_FAIL, (long)input);
case -2147352571:
return new ResultID(ResultID.Da.E_BADTYPE, (long)input);
case -2147352566:
return new ResultID(ResultID.Da.E_RANGE, (long)input);
case -2147217401:
return new ResultID(ResultID.Hda.W_NOFILTER, (long)input);
case -2147024882:
return new ResultID(ResultID.E_OUTOFMEMORY, (long)input);
case -2147024809:
return new ResultID(ResultID.E_INVALIDARG, (long)input);
case -1073479679:
return new ResultID(ResultID.Da.E_INVALIDHANDLE, (long)input);
case -1073479676:
return new ResultID(ResultID.Da.E_BADTYPE, (long)input);
case -1073479673:
return new ResultID(ResultID.Da.E_UNKNOWN_ITEM_NAME, (long)input);
case -1073479672:
return new ResultID(ResultID.Da.E_INVALID_ITEM_NAME, (long)input);
case -1073479671:
return new ResultID(ResultID.Da.E_INVALID_FILTER, (long)input);
case -1073479670:
return new ResultID(ResultID.Da.E_UNKNOWN_ITEM_PATH, (long)input);
case -1073479669:
return new ResultID(ResultID.Da.E_RANGE, (long)input);
case -1073479165:
return new ResultID(ResultID.Da.E_INVALID_PID, (long)input);
case -1073479164:
return new ResultID(ResultID.Ae.E_INVALIDTIME, (long)input);
case -1073479163:
return new ResultID(ResultID.Ae.E_BUSY, (long)input);
case -1073479162:
return new ResultID(ResultID.Ae.E_NOINFO, (long)input);
case -1073478655:
return new ResultID(ResultID.Da.E_NO_ITEM_DEADBAND, (long)input);
case -1073478654:
return new ResultID(ResultID.Da.E_NO_ITEM_BUFFERING, (long)input);
case -1073478653:
return new ResultID(ResultID.Da.E_INVALIDCONTINUATIONPOINT, (long)input);
case -1073478650:
return new ResultID(ResultID.Da.E_NO_WRITEQT, (long)input);
case -1073478649:
return new ResultID(ResultID.Cpx.E_TYPE_CHANGED, (long)input);
case -1073478648:
return new ResultID(ResultID.Cpx.E_FILTER_DUPLICATE, (long)input);
case -1073478647:
return new ResultID(ResultID.Cpx.E_FILTER_INVALID, (long)input);
case -1073478646:
return new ResultID(ResultID.Cpx.E_FILTER_ERROR, (long)input);
case -1073477888:
return new ResultID(ResultID.Dx.E_PERSISTING, (long)input);
case -1073477887:
return new ResultID(ResultID.Dx.E_NOITEMLIST, (long)input);
case -1073477886:
return new ResultID(ResultID.Dx.E_VERSION_MISMATCH, (long)input);
case -1073477885:
return new ResultID(ResultID.Dx.E_VERSION_MISMATCH, (long)input);
case -1073477884:
return new ResultID(ResultID.Dx.E_UNKNOWN_ITEM_PATH, (long)input);
case -1073477883:
return new ResultID(ResultID.Dx.E_UNKNOWN_ITEM_NAME, (long)input);
case -1073477882:
return new ResultID(ResultID.Dx.E_INVALID_ITEM_PATH, (long)input);
case -1073477881:
return new ResultID(ResultID.Dx.E_INVALID_ITEM_NAME, (long)input);
case -1073477880:
return new ResultID(ResultID.Dx.E_INVALID_NAME, (long)input);
case -1073477879:
return new ResultID(ResultID.Dx.E_DUPLICATE_NAME, (long)input);
case -1073477878:
return new ResultID(ResultID.Dx.E_INVALID_BROWSE_PATH, (long)input);
case -1073477877:
return new ResultID(ResultID.Dx.E_INVALID_SERVER_URL, (long)input);
case -1073477876:
return new ResultID(ResultID.Dx.E_INVALID_SERVER_TYPE, (long)input);
case -1073477875:
return new ResultID(ResultID.Dx.E_UNSUPPORTED_SERVER_TYPE, (long)input);
case -1073477874:
return new ResultID(ResultID.Dx.E_CONNECTIONS_EXIST, (long)input);
case -1073477873:
return new ResultID(ResultID.Dx.E_TOO_MANY_CONNECTIONS, (long)input);
case -1073477872:
return new ResultID(ResultID.Dx.E_OVERRIDE_BADTYPE, (long)input);
case -1073477871:
return new ResultID(ResultID.Dx.E_OVERRIDE_RANGE, (long)input);
case -1073477870:
return new ResultID(ResultID.Dx.E_SUBSTITUTE_BADTYPE, (long)input);
case -1073477869:
return new ResultID(ResultID.Dx.E_SUBSTITUTE_RANGE, (long)input);
case -1073477868:
return new ResultID(ResultID.Dx.E_INVALID_TARGET_ITEM, (long)input);
case -1073477867:
return new ResultID(ResultID.Dx.E_UNKNOWN_TARGET_ITEM, (long)input);
case -1073477866:
return new ResultID(ResultID.Dx.E_TARGET_ALREADY_CONNECTED, (long)input);
case -1073477865:
return new ResultID(ResultID.Dx.E_UNKNOWN_SERVER_NAME, (long)input);
case -1073477864:
return new ResultID(ResultID.Dx.E_UNKNOWN_SOURCE_ITEM, (long)input);
case -1073477863:
return new ResultID(ResultID.Dx.E_INVALID_SOURCE_ITEM, (long)input);
case -1073477862:
return new ResultID(ResultID.Dx.E_INVALID_QUEUE_SIZE, (long)input);
case -1073477861:
return new ResultID(ResultID.Dx.E_INVALID_DEADBAND, (long)input);
case -1073477860:
return new ResultID(ResultID.Dx.E_INVALID_CONFIG_FILE, (long)input);
case -1073477859:
return new ResultID(ResultID.Dx.E_PERSIST_FAILED, (long)input);
case -1073477858:
return new ResultID(ResultID.Dx.E_TARGET_FAULT, (long)input);
case -1073477857:
return new ResultID(ResultID.Dx.E_TARGET_NO_ACCESSS, (long)input);
case -1073477856:
return new ResultID(ResultID.Dx.E_SOURCE_SERVER_FAULT, (long)input);
case -1073477855:
return new ResultID(ResultID.Dx.E_SOURCE_SERVER_NO_ACCESSS, (long)input);
case -1073477854:
return new ResultID(ResultID.Dx.E_SUBSCRIPTION_FAULT, (long)input);
case -1073477853:
return new ResultID(ResultID.Dx.E_SOURCE_ITEM_BADRIGHTS, (long)input);
case -1073477852:
return new ResultID(ResultID.Dx.E_SOURCE_ITEM_BAD_QUALITY, (long)input);
case -1073477851:
return new ResultID(ResultID.Dx.E_SOURCE_ITEM_BADTYPE, (long)input);
case -1073477850:
return new ResultID(ResultID.Dx.E_SOURCE_ITEM_RANGE, (long)input);
case -1073477849:
return new ResultID(ResultID.Dx.E_SOURCE_SERVER_NOT_CONNECTED, (long)input);
case -1073477848:
return new ResultID(ResultID.Dx.E_SOURCE_SERVER_TIMEOUT, (long)input);
case -1073477847:
return new ResultID(ResultID.Dx.E_TARGET_ITEM_DISCONNECTED, (long)input);
case -1073477846:
return new ResultID(ResultID.Dx.E_TARGET_NO_WRITES_ATTEMPTED, (long)input);
case -1073477845:
return new ResultID(ResultID.Dx.E_TARGET_ITEM_BADTYPE, (long)input);
case -1073477844:
return new ResultID(ResultID.Dx.E_TARGET_ITEM_RANGE, (long)input);
case -1073475583:
return new ResultID(ResultID.Hda.E_MAXEXCEEDED, (long)input);
case -1073475580:
return new ResultID(ResultID.Hda.E_INVALIDAGGREGATE, (long)input);
case -1073475576:
return new ResultID(ResultID.Hda.E_UNKNOWNATTRID, (long)input);
case -1073475575:
return new ResultID(ResultID.Hda.E_NOT_AVAIL, (long)input);
case -1073475574:
return new ResultID(ResultID.Hda.E_INVALIDDATATYPE, (long)input);
case -1073475573:
return new ResultID(ResultID.Hda.E_DATAEXISTS, (long)input);
case -1073475572:
return new ResultID(ResultID.Hda.E_INVALIDATTRID, (long)input);
case -1073475571:
return new ResultID(ResultID.Hda.E_NODATAEXISTS, (long)input);
case 0:
return new ResultID(ResultID.S_OK, (long)input);
case 262157:
return new ResultID(ResultID.Da.S_UNSUPPORTEDRATE, (long)input);
case 262158:
return new ResultID(ResultID.Da.S_CLAMP, (long)input);
case 262656:
return new ResultID(ResultID.Ae.S_ALREADYACKED, (long)input);
case 262657:
return new ResultID(ResultID.Ae.S_INVALIDBUFFERTIME, (long)input);
case 262658:
return new ResultID(ResultID.Ae.S_INVALIDMAXSIZE, (long)input);
case 262659:
return new ResultID(ResultID.Ae.S_INVALIDKEEPALIVETIME, (long)input);
case 263172:
return new ResultID(ResultID.Da.S_DATAQUEUEOVERFLOW, (long)input);
case 263179:
return new ResultID(ResultID.Cpx.S_FILTER_NO_DATA, (long)input);
case 264064:
return new ResultID(ResultID.Dx.S_TARGET_SUBSTITUTED, (long)input);
case 264065:
return new ResultID(ResultID.Dx.S_TARGET_OVERRIDEN, (long)input);
case 264066:
return new ResultID(ResultID.Dx.S_CLAMP, (long)input);
case 1074008066:
return new ResultID(ResultID.Hda.S_NODATA, (long)input);
case 1074008067:
return new ResultID(ResultID.Hda.S_MOREDATA, (long)input);
case 1074008069:
return new ResultID(ResultID.Hda.S_CURRENTVALUE, (long)input);
case 1074008070:
return new ResultID(ResultID.Hda.S_EXTRADATA, (long)input);
case 1074008078:
return new ResultID(ResultID.Hda.S_INSERTED, (long)input);
case 1074008079:
return new ResultID(ResultID.Hda.S_REPLACED, (long)input);
default:
if ((input & 2147418112) == 65536)
return new ResultID(ResultID.E_NETWORK_ERROR, (long)input);
return input >= 0 ? new ResultID(ResultID.S_FALSE, (long)input) : new ResultID(ResultID.E_FAIL, (long)input);
}
}
internal static int GetResultID(ResultID input)
{
if (input.Name != (XmlQualifiedName)null && input.Name.Namespace == "http://opcfoundation.org/DataAccess/")
{
if (input == ResultID.S_OK)
return 0;
if (input == ResultID.E_FAIL)
return -2147467259;
if (input == ResultID.E_INVALIDARG)
return -2147024809;
if (input == ResultID.Da.E_BADTYPE)
return -1073479676;
if (input == ResultID.Da.E_READONLY || input == ResultID.Da.E_WRITEONLY)
return -1073479674;
if (input == ResultID.Da.E_RANGE)
return -1073479669;
if (input == ResultID.E_OUTOFMEMORY)
return -2147024882;
if (input == ResultID.E_NOTSUPPORTED)
return -2147467262;
if (input == ResultID.Da.E_INVALIDHANDLE)
return -1073479679;
if (input == ResultID.Da.E_UNKNOWN_ITEM_NAME)
return -1073479673;
if (input == ResultID.Da.E_INVALID_ITEM_NAME || input == ResultID.Da.E_INVALID_ITEM_PATH)
return -1073479672;
if (input == ResultID.Da.E_UNKNOWN_ITEM_PATH)
return -1073479670;
if (input == ResultID.Da.E_INVALID_FILTER)
return -1073479671;
if (input == ResultID.Da.S_UNSUPPORTEDRATE)
return 262157;
if (input == ResultID.Da.S_CLAMP)
return 262158;
if (input == ResultID.Da.E_INVALID_PID)
return -1073479165;
if (input == ResultID.Da.E_NO_ITEM_DEADBAND)
return -1073478655;
if (input == ResultID.Da.E_NO_ITEM_BUFFERING)
return -1073478654;
if (input == ResultID.Da.E_NO_WRITEQT)
return -1073478650;
if (input == ResultID.Da.E_INVALIDCONTINUATIONPOINT)
return -1073478653;
if (input == ResultID.Da.S_DATAQUEUEOVERFLOW)
return 263172;
}
else if (input.Name != (XmlQualifiedName)null && input.Name.Namespace == "http://opcfoundation.org/ComplexData/")
{
if (input == ResultID.Cpx.E_TYPE_CHANGED)
return -1073478649;
if (input == ResultID.Cpx.E_FILTER_DUPLICATE)
return -1073478648;
if (input == ResultID.Cpx.E_FILTER_INVALID)
return -1073478647;
if (input == ResultID.Cpx.E_FILTER_ERROR)
return -1073478646;
if (input == ResultID.Cpx.S_FILTER_NO_DATA)
return 263179;
}
else if (input.Name != (XmlQualifiedName)null && input.Name.Namespace == "http://opcfoundation.org/HistoricalDataAccess/")
{
if (input == ResultID.Hda.E_MAXEXCEEDED)
return -1073475583;
if (input == ResultID.Hda.S_NODATA)
return 1074008066;
if (input == ResultID.Hda.S_MOREDATA)
return 1074008067;
if (input == ResultID.Hda.E_INVALIDAGGREGATE)
return -1073475580;
if (input == ResultID.Hda.S_CURRENTVALUE)
return 1074008069;
if (input == ResultID.Hda.S_EXTRADATA)
return 1074008070;
if (input == ResultID.Hda.E_UNKNOWNATTRID)
return -1073475576;
if (input == ResultID.Hda.E_NOT_AVAIL)
return -1073475575;
if (input == ResultID.Hda.E_INVALIDDATATYPE)
return -1073475574;
if (input == ResultID.Hda.E_DATAEXISTS)
return -1073475573;
if (input == ResultID.Hda.E_INVALIDATTRID)
return -1073475572;
if (input == ResultID.Hda.E_NODATAEXISTS)
return -1073475571;
if (input == ResultID.Hda.S_INSERTED)
return 1074008078;
if (input == ResultID.Hda.S_REPLACED)
return 1074008079;
}
if (input.Name != (XmlQualifiedName)null && input.Name.Namespace == "http://opcfoundation.org/DataExchange/")
{
if (input == ResultID.Dx.E_PERSISTING)
return -1073477888;
if (input == ResultID.Dx.E_NOITEMLIST)
return -1073477887;
if (input == ResultID.Dx.E_SERVER_STATE || input == ResultID.Dx.E_VERSION_MISMATCH)
return -1073477885;
if (input == ResultID.Dx.E_UNKNOWN_ITEM_PATH)
return -1073477884;
if (input == ResultID.Dx.E_UNKNOWN_ITEM_NAME)
return -1073477883;
if (input == ResultID.Dx.E_INVALID_ITEM_PATH)
return -1073477882;
if (input == ResultID.Dx.E_INVALID_ITEM_NAME)
return -1073477881;
if (input == ResultID.Dx.E_INVALID_NAME)
return -1073477880;
if (input == ResultID.Dx.E_DUPLICATE_NAME)
return -1073477879;
if (input == ResultID.Dx.E_INVALID_BROWSE_PATH)
return -1073477878;
if (input == ResultID.Dx.E_INVALID_SERVER_URL)
return -1073477877;
if (input == ResultID.Dx.E_INVALID_SERVER_TYPE)
return -1073477876;
if (input == ResultID.Dx.E_UNSUPPORTED_SERVER_TYPE)
return -1073477875;
if (input == ResultID.Dx.E_CONNECTIONS_EXIST)
return -1073477874;
if (input == ResultID.Dx.E_TOO_MANY_CONNECTIONS)
return -1073477873;
if (input == ResultID.Dx.E_OVERRIDE_BADTYPE)
return -1073477872;
if (input == ResultID.Dx.E_OVERRIDE_RANGE)
return -1073477871;
if (input == ResultID.Dx.E_SUBSTITUTE_BADTYPE)
return -1073477870;
if (input == ResultID.Dx.E_SUBSTITUTE_RANGE)
return -1073477869;
if (input == ResultID.Dx.E_INVALID_TARGET_ITEM)
return -1073477868;
if (input == ResultID.Dx.E_UNKNOWN_TARGET_ITEM)
return -1073477867;
if (input == ResultID.Dx.E_TARGET_ALREADY_CONNECTED)
return -1073477866;
if (input == ResultID.Dx.E_UNKNOWN_SERVER_NAME)
return -1073477865;
if (input == ResultID.Dx.E_UNKNOWN_SOURCE_ITEM)
return -1073477864;
if (input == ResultID.Dx.E_INVALID_SOURCE_ITEM)
return -1073477863;
if (input == ResultID.Dx.E_INVALID_QUEUE_SIZE)
return -1073477862;
if (input == ResultID.Dx.E_INVALID_DEADBAND)
return -1073477861;
if (input == ResultID.Dx.E_INVALID_CONFIG_FILE)
return -1073477860;
if (input == ResultID.Dx.E_PERSIST_FAILED)
return -1073477859;
if (input == ResultID.Dx.E_TARGET_FAULT)
return -1073477858;
if (input == ResultID.Dx.E_TARGET_NO_ACCESSS)
return -1073477857;
if (input == ResultID.Dx.E_SOURCE_SERVER_FAULT)
return -1073477856;
if (input == ResultID.Dx.E_SOURCE_SERVER_NO_ACCESSS)
return -1073477855;
if (input == ResultID.Dx.E_SUBSCRIPTION_FAULT)
return -1073477854;
if (input == ResultID.Dx.E_SOURCE_ITEM_BADRIGHTS)
return -1073477853;
if (input == ResultID.Dx.E_SOURCE_ITEM_BAD_QUALITY)
return -1073477852;
if (input == ResultID.Dx.E_SOURCE_ITEM_BADTYPE)
return -1073477851;
if (input == ResultID.Dx.E_SOURCE_ITEM_RANGE)
return -1073477850;
if (input == ResultID.Dx.E_SOURCE_SERVER_NOT_CONNECTED)
return -1073477849;
if (input == ResultID.Dx.E_SOURCE_SERVER_TIMEOUT)
return -1073477848;
if (input == ResultID.Dx.E_TARGET_ITEM_DISCONNECTED)
return -1073477847;
if (input == ResultID.Dx.E_TARGET_NO_WRITES_ATTEMPTED)
return -1073477846;
if (input == ResultID.Dx.E_TARGET_ITEM_BADTYPE)
return -1073477845;
if (input == ResultID.Dx.E_TARGET_ITEM_RANGE)
return -1073477844;
if (input == ResultID.Dx.S_TARGET_SUBSTITUTED)
return 264064;
if (input == ResultID.Dx.S_TARGET_OVERRIDEN)
return 264065;
if (input == ResultID.Dx.S_CLAMP)
return 264066;
}
else if (input.Code == -1)
return input.Succeeded() ? 1 : -2147467259;
return input.Code;
}
internal static VarEnum GetType(System.Type input)
{
if (input == (System.Type)null)
return VarEnum.VT_EMPTY;
if (input == typeof(sbyte))
return VarEnum.VT_I1;
if (input == typeof(byte))
return VarEnum.VT_UI1;
if (input == typeof(short))
return VarEnum.VT_I2;
if (input == typeof(ushort))
return VarEnum.VT_UI2;
if (input == typeof(int))
return VarEnum.VT_I4;
if (input == typeof(uint))
return VarEnum.VT_UI4;
if (input == typeof(long))
return VarEnum.VT_I8;
if (input == typeof(ulong))
return VarEnum.VT_UI8;
if (input == typeof(float))
return VarEnum.VT_R4;
if (input == typeof(double))
return VarEnum.VT_R8;
if (input == typeof(Decimal))
return VarEnum.VT_CY;
if (input == typeof(bool))
return VarEnum.VT_BOOL;
if (input == typeof(DateTime))
return VarEnum.VT_DATE;
if (input == typeof(string))
return VarEnum.VT_BSTR;
if (input == typeof(object))
return VarEnum.VT_EMPTY;
if (input == typeof(sbyte[]))
return VarEnum.VT_I1 | VarEnum.VT_ARRAY;
if (input == typeof(byte[]))
return VarEnum.VT_UI1 | VarEnum.VT_ARRAY;
if (input == typeof(short[]))
return VarEnum.VT_I2 | VarEnum.VT_ARRAY;
if (input == typeof(ushort[]))
return VarEnum.VT_UI2 | VarEnum.VT_ARRAY;
if (input == typeof(int[]))
return VarEnum.VT_I4 | VarEnum.VT_ARRAY;
if (input == typeof(uint[]))
return VarEnum.VT_UI4 | VarEnum.VT_ARRAY;
if (input == typeof(long[]))
return VarEnum.VT_I8 | VarEnum.VT_ARRAY;
if (input == typeof(ulong[]))
return VarEnum.VT_UI8 | VarEnum.VT_ARRAY;
if (input == typeof(float[]))
return VarEnum.VT_R4 | VarEnum.VT_ARRAY;
if (input == typeof(double[]))
return VarEnum.VT_R8 | VarEnum.VT_ARRAY;
if (input == typeof(Decimal[]))
return VarEnum.VT_CY | VarEnum.VT_ARRAY;
if (input == typeof(bool[]))
return VarEnum.VT_BOOL | VarEnum.VT_ARRAY;
if (input == typeof(DateTime[]))
return VarEnum.VT_DATE | VarEnum.VT_ARRAY;
if (input == typeof(string[]))
return VarEnum.VT_BSTR | VarEnum.VT_ARRAY;
if (input == typeof(object[]))
return VarEnum.VT_VARIANT | VarEnum.VT_ARRAY;
if (input == Type.ILLEGAL_TYPE)
return (VarEnum)System.Enum.ToObject(typeof(VarEnum), (int)short.MaxValue);
if (input == typeof(System.Type) || input == typeof(Quality))
return VarEnum.VT_I2;
return input == typeof(accessRights) || input == typeof(euType) ? VarEnum.VT_I4 : VarEnum.VT_EMPTY;
}
internal static System.Type GetType(VarEnum input)
{
switch (input)
{
case VarEnum.VT_EMPTY:
return (System.Type)null;
case VarEnum.VT_I2:
return typeof(short);
case VarEnum.VT_I4:
return typeof(int);
case VarEnum.VT_R4:
return typeof(float);
case VarEnum.VT_R8:
return typeof(double);
case VarEnum.VT_CY:
return typeof(Decimal);
case VarEnum.VT_DATE:
return typeof(DateTime);
case VarEnum.VT_BSTR:
return typeof(string);
case VarEnum.VT_BOOL:
return typeof(bool);
case VarEnum.VT_I1:
return typeof(sbyte);
case VarEnum.VT_UI1:
return typeof(byte);
case VarEnum.VT_UI2:
return typeof(ushort);
case VarEnum.VT_UI4:
return typeof(uint);
case VarEnum.VT_I8:
return typeof(long);
case VarEnum.VT_UI8:
return typeof(ulong);
case VarEnum.VT_I2 | VarEnum.VT_ARRAY:
return typeof(short[]);
case VarEnum.VT_I4 | VarEnum.VT_ARRAY:
return typeof(int[]);
case VarEnum.VT_R4 | VarEnum.VT_ARRAY:
return typeof(float[]);
case VarEnum.VT_R8 | VarEnum.VT_ARRAY:
return typeof(double[]);
case VarEnum.VT_CY | VarEnum.VT_ARRAY:
return typeof(Decimal[]);
case VarEnum.VT_DATE | VarEnum.VT_ARRAY:
return typeof(DateTime[]);
case VarEnum.VT_BSTR | VarEnum.VT_ARRAY:
return typeof(string[]);
case VarEnum.VT_BOOL | VarEnum.VT_ARRAY:
return typeof(bool[]);
case VarEnum.VT_VARIANT | VarEnum.VT_ARRAY:
return typeof(object[]);
case VarEnum.VT_I1 | VarEnum.VT_ARRAY:
return typeof(sbyte[]);
case VarEnum.VT_UI1 | VarEnum.VT_ARRAY:
return typeof(byte[]);
case VarEnum.VT_UI2 | VarEnum.VT_ARRAY:
return typeof(ushort[]);
case VarEnum.VT_UI4 | VarEnum.VT_ARRAY:
return typeof(uint[]);
case VarEnum.VT_I8 | VarEnum.VT_ARRAY:
return typeof(long[]);
case VarEnum.VT_UI8 | VarEnum.VT_ARRAY:
return typeof(ulong[]);
default:
return Type.ILLEGAL_TYPE;
}
}
internal static object MarshalPropertyValue(PropertyID propertyID, object input)
{
if (input == null)
return (object)null;
try
{
if (propertyID == Property.DATATYPE)
return (object)(short)Interop.GetType((System.Type)input);
if (propertyID == Property.ACCESSRIGHTS)
{
switch ((accessRights)input)
{
case accessRights.readable:
return (object)1;
case accessRights.writable:
return (object)2;
case accessRights.readWritable:
return (object)3;
default:
return (object)null;
}
}
else if (propertyID == Property.EUTYPE)
{
switch ((euType)input)
{
case euType.noEnum:
return (object)OPCEUTYPE.OPC_NOENUM;
case euType.analog:
return (object)OPCEUTYPE.OPC_ANALOG;
case euType.enumerated:
return (object)OPCEUTYPE.OPC_ENUMERATED;
default:
return (object)null;
}
}
else
{
if (propertyID == Property.QUALITY)
return (object)((Quality)input).GetCode();
if (propertyID == Property.TIMESTAMP)
{
if (input.GetType() == typeof(DateTime))
{
DateTime dateTime = (DateTime)input;
return dateTime != DateTime.MinValue ? (object)dateTime.ToLocalTime() : (object)dateTime;
}
}
}
}
catch
{
}
return input;
}
internal static object UnmarshalPropertyValue(PropertyID propertyID, object input)
{
if (input == null)
return (object)null;
try
{
if (propertyID == Property.DATATYPE)
return (object)Interop.GetType((VarEnum)System.Convert.ToUInt16(input));
if (propertyID == Property.ACCESSRIGHTS)
{
switch (System.Convert.ToInt32(input))
{
case 1:
return (object)accessRights.readable;
case 2:
return (object)accessRights.writable;
case 3:
return (object)accessRights.readWritable;
default:
return (object)null;
}
}
else if (propertyID == Property.EUTYPE)
{
switch ((OPCEUTYPE)input)
{
case OPCEUTYPE.OPC_NOENUM:
return (object)euType.noEnum;
case OPCEUTYPE.OPC_ANALOG:
return (object)euType.analog;
case OPCEUTYPE.OPC_ENUMERATED:
return (object)euType.enumerated;
default:
return (object)null;
}
}
else
{
if (propertyID == Property.QUALITY)
return (object)new Quality(System.Convert.ToInt16(input));
if (propertyID == Property.TIMESTAMP)
{
if (input.GetType() == typeof(DateTime))
{
DateTime dateTime = (DateTime)input;
return dateTime != DateTime.MinValue ? (object)dateTime.ToLocalTime() : (object)dateTime;
}
}
}
}
catch
{
}
return input;
}
}