You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1432 lines
51 KiB
C#
1432 lines
51 KiB
C#
namespace OPCDA.NET
|
|
{
|
|
using Microsoft.Win32;
|
|
using OPC;
|
|
using OPC.Common;
|
|
using OPCDA;
|
|
using OPCDA.Interface;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Diagnostics;
|
|
using System.Reflection;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Runtime.InteropServices;
|
|
using System.Security;
|
|
using System.Security.Permissions;
|
|
using System.Windows.Forms;
|
|
|
|
[SuppressUnmanagedCodeSecurity, ComVisible(true), ReflectionPermission(SecurityAction.Assert, Unrestricted=true), SecurityPermission(SecurityAction.Assert, UnmanagedCode=true)]
|
|
public class OpcServer : IOPCShutdown
|
|
{
|
|
private UCOMIConnectionPointContainer cpointcontainer = null;
|
|
private IOPCBrowseServerAddressSpace ifBrowse = null;
|
|
private IOPCBrowse ifBrowse3 = null;
|
|
private IOPCCommon ifCommon = null;
|
|
private IOPCItemIO ifItemIO = null;
|
|
private IOPCItemProperties ifItmProps = null;
|
|
private IOPCSecurityNT ifSecurityNT = null;
|
|
private IOPCSecurityPrivate ifSecurityPriv = null;
|
|
internal IOPCServer ifServer = null;
|
|
private bool myConnectThroughNIOS = false;
|
|
internal bool myErrorsAsExecptions;
|
|
private Host myHostInfo = new Host();
|
|
private string myServerName;
|
|
private object OPCserverObj = null;
|
|
private int shutdowncookie = 0;
|
|
private UCOMIConnectionPoint shutdowncpoint = null;
|
|
|
|
public event ShutdownRequestEventHandler ShutdownRequested;
|
|
|
|
public OpcServer()
|
|
{
|
|
|
|
}
|
|
|
|
public BrowseTree AddBrowseTree()
|
|
{
|
|
return new BrowseTree(this);
|
|
}
|
|
|
|
public BrowseTree AddBrowseTree(TreeView tvServer)
|
|
{
|
|
return new BrowseTree(this, tvServer);
|
|
}
|
|
|
|
public OpcGroup AddGroup(string groupName, bool setActive, int requestedUpdateRate, int ClientHandle)
|
|
{
|
|
float percentDeadband = 0f;
|
|
return this.AddGroup(groupName, setActive, requestedUpdateRate, ref percentDeadband, 0, ClientHandle);
|
|
}
|
|
|
|
public OpcGroup AddGroup(string groupName, bool setActive, int requestedUpdateRate, int ClientHandle, out int err)
|
|
{
|
|
float percentDeadband = 0f;
|
|
return this.AddGroup(groupName, setActive, requestedUpdateRate, ref percentDeadband, 0, ClientHandle, out err);
|
|
}
|
|
|
|
public OpcGroup AddGroup(string groupName, bool setActive, int requestedUpdateRate, ref float percentDeadband, int localeID, int ClientHandle)
|
|
{
|
|
int num;
|
|
if (this.ifServer == null)
|
|
{
|
|
num = -2147467262;
|
|
throw new OPCException(num, "AddGroup failed with error " + ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
OpcGroup grp = new OpcGroup(this, groupName, setActive, requestedUpdateRate, ClientHandle);
|
|
|
|
num = grp.internalAdd(ref percentDeadband, localeID);
|
|
if (HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, "AddGroup failed with error " + ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return grp;
|
|
}
|
|
|
|
public OpcGroup AddGroup(string groupName, bool setActive, int requestedUpdateRate, ref float percentDeadband, int localeID, int ClientHandle, out int err)
|
|
{
|
|
if (this.ifServer == null)
|
|
{
|
|
err = -2147467262;
|
|
return null;
|
|
}
|
|
OpcGroup grp = new OpcGroup(this, groupName, setActive, requestedUpdateRate, ClientHandle);
|
|
|
|
err = grp.internalAdd(ref percentDeadband, localeID);
|
|
if (HRESULTS.Failed(err))
|
|
{
|
|
grp = null;
|
|
}
|
|
return grp;
|
|
}
|
|
|
|
public RefreshGroup AddRefreshGroup(RefreshEventHandler UserHnd)
|
|
{
|
|
return new RefreshGroup(this, 500, UserHnd);
|
|
}
|
|
|
|
public RefreshGroup AddRefreshGroup(int Rate, RefreshEventHandler UserHnd)
|
|
{
|
|
return new RefreshGroup(this, Rate, UserHnd);
|
|
}
|
|
|
|
public SyncIOGroup AddSyncIOGroup()
|
|
{
|
|
return new SyncIOGroup(this);
|
|
}
|
|
|
|
private void AdviseIOPCShutdown()
|
|
{
|
|
System.Type type = typeof(IOPCShutdown);
|
|
Guid gUID = type.GUID;
|
|
if (this.cpointcontainer != null)
|
|
{
|
|
this.cpointcontainer.FindConnectionPoint(ref gUID, out this.shutdowncpoint);
|
|
if (this.shutdowncpoint != null)
|
|
{
|
|
this.shutdowncpoint.Advise(this, out this.shutdowncookie);
|
|
}
|
|
}
|
|
}
|
|
|
|
public BrowseElement[] Browse(string itemID, ref string continuationPoint, int maxElements, browseFilter mode, string elementFilter, string vendorFilter, bool returnProperties, bool returnValues, int[] propertyIDs, out bool moreElements)
|
|
{
|
|
if (itemID == null)
|
|
{
|
|
itemID = "";
|
|
}
|
|
int pdwCount = 0;
|
|
IntPtr zero = IntPtr.Zero;
|
|
int hresultcode = this.ifBrowse3.Browse(itemID, ref continuationPoint, maxElements, (OPCBROWSEFILTER) mode, (elementFilter == null) ? "" : elementFilter, (vendorFilter == null) ? "" : vendorFilter, returnProperties, returnValues, (!returnProperties || (propertyIDs == null)) ? 0 : propertyIDs.Length, (!returnProperties || (propertyIDs == null)) ? new int[0] : propertyIDs, out moreElements, out pdwCount, out zero);
|
|
if (HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, "Browse failed with error " + ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
if (pdwCount == 0)
|
|
{
|
|
return null;
|
|
}
|
|
BrowseElement[] elementArray = new BrowseElement[pdwCount];
|
|
int num3 = (int) zero;
|
|
for (int i = 0; i < pdwCount; i++)
|
|
{
|
|
elementArray[i] = new BrowseElement();
|
|
IntPtr ptr = (IntPtr) Marshal.ReadInt32((IntPtr) num3);
|
|
elementArray[i].Name = Marshal.PtrToStringUni(ptr);
|
|
Marshal.FreeCoTaskMem(ptr);
|
|
ptr = (IntPtr) Marshal.ReadInt32((IntPtr) (num3 + 4));
|
|
elementArray[i].ItemID = Marshal.PtrToStringUni(ptr);
|
|
Marshal.FreeCoTaskMem(ptr);
|
|
int num5 = Marshal.ReadInt32((IntPtr) (num3 + 8));
|
|
elementArray[i].HasChildren = (num5 & 1) != 0;
|
|
elementArray[i].IsItem = (num5 & 2) != 0;
|
|
ItemProperties properties = this.UnmarshalProperties((IntPtr) (num3 + 0x10));
|
|
elementArray[i].Properties = properties.Properties;
|
|
elementArray[i].Error = properties.Error;
|
|
num3 += 0x20;
|
|
}
|
|
Marshal.FreeCoTaskMem(zero);
|
|
return elementArray;
|
|
}
|
|
|
|
public int BrowseAccessPaths(string itemID, out UCOMIEnumString stringEnumerator)
|
|
{
|
|
int num;
|
|
stringEnumerator = null;
|
|
object ppUnk = null;
|
|
if (this.ifBrowse == null)
|
|
{
|
|
num = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifBrowse.BrowseAccessPaths(itemID, out ppUnk);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
if (HRESULTS.Succeeded(num))
|
|
{
|
|
stringEnumerator = (UCOMIEnumString) ppUnk;
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int BrowseCurrentBranch(OPCBROWSETYPE filterType, string NameFilter, VarEnum dataTypeFilter, OPCACCESSRIGHTS accessRightsFilter, out ArrayList NameArr)
|
|
{
|
|
UCOMIEnumString str;
|
|
NameArr = new ArrayList();
|
|
int rtc = this.BrowseOPCItemIDs(filterType, NameFilter, dataTypeFilter, accessRightsFilter, out str);
|
|
if (rtc == 0)
|
|
{
|
|
if (str == null)
|
|
{
|
|
rtc = -2147467259;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(rtc, ErrorDescriptions.GetErrorDescription(rtc));
|
|
}
|
|
return rtc;
|
|
}
|
|
NameArr = new ArrayList(500);
|
|
string[] rgelt = new string[100];
|
|
str.Reset();
|
|
do
|
|
{
|
|
int pceltFetched = 0;
|
|
rtc = str.Next(rgelt.Length, rgelt, out pceltFetched);
|
|
if (pceltFetched > 0)
|
|
{
|
|
for (int i = 0; i < pceltFetched; i++)
|
|
{
|
|
if (rgelt[i] == null)
|
|
{
|
|
break;
|
|
}
|
|
NameArr.Add(rgelt[i]);
|
|
}
|
|
}
|
|
}
|
|
while (rtc == 0);
|
|
Marshal.ReleaseComObject(str);
|
|
str = null;
|
|
NameArr.TrimToSize();
|
|
return 0;
|
|
}
|
|
if (str != null)
|
|
{
|
|
Marshal.ReleaseComObject(str);
|
|
}
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(rtc, ErrorDescriptions.GetErrorDescription(rtc));
|
|
}
|
|
return rtc;
|
|
}
|
|
|
|
public int BrowseCurrentBranch(OPCBROWSETYPE filterType, string NameFilter, System.Type sTypeFilter, OPCACCESSRIGHTS accessRightsFilter, out ArrayList NameArr)
|
|
{
|
|
int hresultcode = this.BrowseCurrentBranch(filterType, NameFilter, types.ConvertToVarType(sTypeFilter), accessRightsFilter, out NameArr);
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
public int BrowseOPCItemIDs(OPCBROWSETYPE filterType, string filterCriteria, VarEnum dataTypeFilter, OPCACCESSRIGHTS accessRightsFilter, out UCOMIEnumString stringEnumerator)
|
|
{
|
|
int num;
|
|
stringEnumerator = null;
|
|
if (this.ifBrowse == null)
|
|
{
|
|
num = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
object obj2;
|
|
num = this.ifBrowse.BrowseOPCItemIDs(filterType, filterCriteria, (short) dataTypeFilter, accessRightsFilter, out obj2);
|
|
stringEnumerator = (UCOMIEnumString) obj2;
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int BrowseOPCItemIDs(OPCBROWSETYPE filterType, string filterCriteria, System.Type sTypeFilter, OPCACCESSRIGHTS accessRightsFilter, out UCOMIEnumString stringEnumerator)
|
|
{
|
|
int hresultcode = this.BrowseOPCItemIDs(filterType, filterCriteria, types.ConvertToVarType(sTypeFilter), accessRightsFilter, out stringEnumerator);
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
public int BrowseOPCItemIDs(OPCBROWSETYPE filterType, string filterCriteria, System.Type sTypeFilter, OPCACCESSRIGHTS accessRightsFilter, out string[] nodes)
|
|
{
|
|
UCOMIEnumString str;
|
|
nodes = new string[0];
|
|
int hresultcode = this.BrowseOPCItemIDs(filterType, filterCriteria, types.ConvertToVarType(sTypeFilter), accessRightsFilter, out str);
|
|
if (hresultcode == 0)
|
|
{
|
|
int num3;
|
|
string[] rgelt = new string[1];
|
|
int celt = 0;
|
|
while (str.Next(1, rgelt, out num3) == 0)
|
|
{
|
|
celt++;
|
|
}
|
|
nodes = new string[celt];
|
|
str.Reset();
|
|
str.Next(celt, nodes, out num3);
|
|
}
|
|
Marshal.ReleaseComObject(str);
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
public int ChangeBrowsePosition(OPCBROWSEDIRECTION direction, string name)
|
|
{
|
|
int num;
|
|
if (this.ifBrowse == null)
|
|
{
|
|
num = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifBrowse.ChangeBrowsePosition(direction, name);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int ChangeUser()
|
|
{
|
|
int num;
|
|
if (this.ifSecurityNT == null)
|
|
{
|
|
num = -2147467263;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifSecurityNT.ChangeUser();
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int Connect(Guid ClsidOPCserver)
|
|
{
|
|
this.Disconnect();
|
|
System.Type typeFromCLSID = System.Type.GetTypeFromCLSID(ClsidOPCserver);
|
|
if (typeFromCLSID == null)
|
|
{
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(-1073479663, ErrorDescriptions.GetErrorDescription(-1073479663));
|
|
}
|
|
return -1073479663;
|
|
}
|
|
int hresultcode = this.SetInterfaces(Activator.CreateInstance(typeFromCLSID));
|
|
if (HRESULTS.Succeeded(hresultcode))
|
|
{
|
|
this.myServerName = ClsidOPCserver.ToString();
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
public int Connect(string SrvName)
|
|
{
|
|
int num;
|
|
if (SrvName.StartsWith(@"\\") || SrvName.StartsWith("//"))
|
|
{
|
|
if (SrvName.StartsWith("//"))
|
|
{
|
|
SrvName.Replace("/", @"\");
|
|
}
|
|
int index = SrvName.IndexOf('\\', 2);
|
|
string srvName = SrvName.Substring(index + 1);
|
|
string computerName = SrvName.Substring(2, index - 2);
|
|
if (srvName == "")
|
|
{
|
|
num = -2147024809;
|
|
}
|
|
else if (computerName == "")
|
|
{
|
|
num = this.ConnectLocal(SrvName);
|
|
}
|
|
else if (this.myConnectThroughNIOS)
|
|
{
|
|
num = this.ConnectRemoteNIOS(computerName, srvName);
|
|
}
|
|
else
|
|
{
|
|
Host accessInfo = new Host(computerName);
|
|
num = this.Connect(accessInfo, srvName);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num = this.ConnectLocal(SrvName);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int Connect(Host accessInfo, Guid ClsidOPCserver)
|
|
{
|
|
this.Disconnect();
|
|
int hresultcode = this.SetInterfaces(ComApi.CreateInstance(ClsidOPCserver, accessInfo));
|
|
if (HRESULTS.Succeeded(hresultcode))
|
|
{
|
|
this.myHostInfo = accessInfo;
|
|
this.myServerName = ClsidOPCserver.ToString();
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
public int Connect(Host accessInfo, string SrvName)
|
|
{
|
|
int num;
|
|
string[] strArray;
|
|
Guid[] guidArray;
|
|
if (this.myConnectThroughNIOS)
|
|
{
|
|
num = this.ConnectRemoteNIOS(accessInfo.HostName, SrvName);
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
OpcServerBrowser browser = new OpcServerBrowser(accessInfo);
|
|
Guid empty = Guid.Empty;
|
|
bool flag = false;
|
|
browser.GetServerList(out strArray, out guidArray);
|
|
if (strArray == null)
|
|
{
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(-1073479663, ErrorDescriptions.GetErrorDescription(-1073479663));
|
|
}
|
|
return -1073479663;
|
|
}
|
|
for (int i = 0; i < strArray.Length; i++)
|
|
{
|
|
if (strArray[i] == SrvName)
|
|
{
|
|
empty = guidArray[i];
|
|
flag = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!flag)
|
|
{
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(-1073479663, ErrorDescriptions.GetErrorDescription(-1073479663));
|
|
}
|
|
return -1073479663;
|
|
}
|
|
strArray = null;
|
|
guidArray = null;
|
|
num = this.SetInterfaces(ComApi.CreateInstance(empty, accessInfo));
|
|
if (HRESULTS.Succeeded(num))
|
|
{
|
|
this.myHostInfo = accessInfo;
|
|
this.myServerName = SrvName;
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int Connect(string ComputerName, Guid ClsidOPCserver)
|
|
{
|
|
this.Disconnect();
|
|
Host host = new Host(ComputerName);
|
|
int hresultcode = this.SetInterfaces(ComApi.CreateInstance(ClsidOPCserver, host));
|
|
if (HRESULTS.Succeeded(hresultcode))
|
|
{
|
|
this.myHostInfo.HostName = ComputerName;
|
|
this.myServerName = ClsidOPCserver.ToString();
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
public int Connect(string ComputerName, string SrvName)
|
|
{
|
|
int num;
|
|
if ((ComputerName != null) && (ComputerName != ""))
|
|
{
|
|
if (this.myConnectThroughNIOS)
|
|
{
|
|
num = this.ConnectRemoteNIOS(ComputerName, SrvName);
|
|
}
|
|
else
|
|
{
|
|
Host accessInfo = new Host(ComputerName);
|
|
num = this.Connect(accessInfo, SrvName);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num = this.Connect(SrvName);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
private int ConnectLocal(string SrvName)
|
|
{
|
|
System.Type typeFromProgID = null;
|
|
bool throwOnError = false;
|
|
this.Disconnect();
|
|
typeFromProgID = System.Type.GetTypeFromProgID(SrvName, throwOnError);
|
|
if (typeFromProgID == null)
|
|
{
|
|
return -1073479663;
|
|
}
|
|
int hresultcode = this.SetInterfaces(Activator.CreateInstance(typeFromProgID));
|
|
if (HRESULTS.Succeeded(hresultcode))
|
|
{
|
|
this.myHostInfo.HostName = ComApi.GetComputerName();
|
|
}
|
|
this.myServerName = SrvName;
|
|
return hresultcode;
|
|
}
|
|
|
|
private int ConnectRemoteNIOS(string ComputerName, string SrvName)
|
|
{
|
|
System.Type type = null;
|
|
bool throwOnError = false;
|
|
this.Disconnect();
|
|
type = System.Type.GetTypeFromProgID(SrvName, ComputerName, throwOnError);
|
|
if (type == null)
|
|
{
|
|
return -1073479663;
|
|
}
|
|
int hresultcode = this.SetInterfaces(Activator.CreateInstance(type));
|
|
if (HRESULTS.Succeeded(hresultcode))
|
|
{
|
|
this.myHostInfo.HostName = ComputerName;
|
|
}
|
|
this.myServerName = SrvName;
|
|
return hresultcode;
|
|
}
|
|
|
|
public void Disconnect()
|
|
{
|
|
this.myHostInfo = new Host();
|
|
this.myServerName = "";
|
|
if (this.shutdowncpoint != null)
|
|
{
|
|
if (this.shutdowncookie != 0)
|
|
{
|
|
try
|
|
{
|
|
this.shutdowncpoint.Unadvise(this.shutdowncookie);
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
this.shutdowncookie = 0;
|
|
}
|
|
try
|
|
{
|
|
Marshal.ReleaseComObject(this.shutdowncpoint);
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
this.shutdowncpoint = null;
|
|
}
|
|
|
|
this.cpointcontainer = null;
|
|
this.ifBrowse = null;
|
|
this.ifItmProps = null;
|
|
this.ifCommon = null;
|
|
this.ifSecurityNT = null;
|
|
this.ifSecurityPriv = null;
|
|
this.ifServer = null;
|
|
if (this.OPCserverObj != null)
|
|
{
|
|
try
|
|
{
|
|
Marshal.ReleaseComObject(this.OPCserverObj);
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
this.OPCserverObj = null;
|
|
}
|
|
}
|
|
|
|
~OpcServer()
|
|
{
|
|
this.Disconnect();
|
|
}
|
|
public string GetErrorString(int errorCode, int localeID)
|
|
{
|
|
string ppString = null;
|
|
int hresultcode = this.ifServer.GetErrorString(errorCode, localeID, out ppString);
|
|
if (HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, "GetErrorString failed with error code {hr}");
|
|
}
|
|
return ppString;
|
|
}
|
|
|
|
public string GetItemID(string itemDataID)
|
|
{
|
|
string szItemID = null;
|
|
int itemID;
|
|
if (this.ifBrowse == null)
|
|
{
|
|
itemID = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
itemID = this.ifBrowse.GetItemID(itemDataID, out szItemID);
|
|
}
|
|
if (HRESULTS.Failed(itemID))
|
|
{
|
|
throw new OPCException(itemID, "GetItemID failed with error " + ErrorDescriptions.GetErrorDescription(itemID));
|
|
}
|
|
return szItemID;
|
|
}
|
|
|
|
public int GetItemProperties(string itemID, int[] propertyIDs, out ItemPropertyData[] propertiesData)
|
|
{
|
|
int num;
|
|
IntPtr ptr;
|
|
IntPtr ptr2;
|
|
propertiesData = null;
|
|
int length = propertyIDs.Length;
|
|
if (length < 1)
|
|
{
|
|
num = -2147467259;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
if (this.ifItmProps == null)
|
|
{
|
|
num = -2147467262;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
num = this.ifItmProps.GetItemProperties(itemID, length, propertyIDs, out ptr, out ptr2);
|
|
if (HRESULTS.Failed(num))
|
|
{
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
int num3 = (int) ptr;
|
|
int num4 = (int) ptr2;
|
|
if ((num3 == 0) || (num4 == 0))
|
|
{
|
|
num = -2147467260;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
propertiesData = new ItemPropertyData[length];
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
propertiesData[i] = new ItemPropertyData();
|
|
propertiesData[i].PropertyID = propertyIDs[i];
|
|
propertiesData[i].Error = Marshal.ReadInt32((IntPtr) num4);
|
|
num4 += 4;
|
|
if (propertiesData[i].Error == 0)
|
|
{
|
|
propertiesData[i].Data = Marshal.GetObjectForNativeVariant((IntPtr) num3);
|
|
DUMMY_VARIANT.VariantClear((IntPtr) num3);
|
|
}
|
|
else
|
|
{
|
|
propertiesData[i].Data = null;
|
|
}
|
|
num3 += DUMMY_VARIANT.ConstSize;
|
|
}
|
|
Marshal.FreeCoTaskMem(ptr);
|
|
Marshal.FreeCoTaskMem(ptr2);
|
|
return 0;
|
|
}
|
|
|
|
public int GetLocaleID(out int lcid)
|
|
{
|
|
int localeID;
|
|
lcid = 0;
|
|
if (this.ifCommon == null)
|
|
{
|
|
localeID = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
localeID = this.ifCommon.GetLocaleID(out lcid);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(localeID))
|
|
{
|
|
throw new OPCException(localeID, ErrorDescriptions.GetErrorDescription(localeID));
|
|
}
|
|
return localeID;
|
|
}
|
|
|
|
public ItemProperties[] GetProperties(string[] itemIDs, bool returnValues, int[] propertyIDs)
|
|
{
|
|
IntPtr zero = IntPtr.Zero;
|
|
int hresultcode = this.ifBrowse3.GetProperties(itemIDs.Length, itemIDs, returnValues, (propertyIDs == null) ? 0 : propertyIDs.Length, (propertyIDs == null) ? new int[0] : propertyIDs, out zero);
|
|
if (HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, "GetProperties failed with error " + ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
ItemProperties[] propertiesArray = new ItemProperties[itemIDs.Length];
|
|
int num2 = (int) zero;
|
|
for (int i = 0; i < itemIDs.Length; i++)
|
|
{
|
|
propertiesArray[i] = this.UnmarshalProperties((IntPtr) num2);
|
|
propertiesArray[i].ItemID = itemIDs[i];
|
|
num2 += 0x10;
|
|
}
|
|
Marshal.FreeCoTaskMem(zero);
|
|
return propertiesArray;
|
|
}
|
|
|
|
public int GetStatus(out SERVERSTATUS serverStatus)
|
|
{
|
|
int status = this.ifServer.GetStatus(out serverStatus);
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(status))
|
|
{
|
|
throw new OPCException(status, ErrorDescriptions.GetErrorDescription(status));
|
|
}
|
|
return status;
|
|
}
|
|
|
|
public int GetStatus(out SrvStatus serverStatus)
|
|
{
|
|
SERVERSTATUS serverstatus;
|
|
int status = this.ifServer.GetStatus(out serverstatus);
|
|
serverStatus = new SrvStatus();
|
|
serverStatus.CurrentTime = DateTime.FromFileTime(serverstatus.ftCurrentTime);
|
|
serverStatus.LastUpdateTime = DateTime.FromFileTime(serverstatus.ftLastUpdateTime);
|
|
serverStatus.StartTime = DateTime.FromFileTime(serverstatus.ftStartTime);
|
|
serverStatus.BandWidth = serverstatus.dwBandWidth;
|
|
serverStatus.BuildNumber = serverstatus.wBuildNumber;
|
|
serverStatus.GroupCount = serverstatus.dwGroupCount;
|
|
serverStatus.MajorVersion = serverstatus.wMajorVersion;
|
|
serverStatus.MinorVersion = serverstatus.wMinorVersion;
|
|
serverStatus.ServerState = serverstatus.eServerState;
|
|
serverStatus.VendorInfo = serverstatus.szVendorInfo;
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(status))
|
|
{
|
|
throw new OPCException(status, ErrorDescriptions.GetErrorDescription(status));
|
|
}
|
|
return status;
|
|
}
|
|
|
|
public int GetStatus(out SrvStatus2 serverStatus)
|
|
{
|
|
SERVERSTATUS serverstatus;
|
|
int status = this.ifServer.GetStatus(out serverstatus);
|
|
serverStatus = new SrvStatus2();
|
|
serverStatus.CurrentTime = DateTime.FromFileTime(serverstatus.ftCurrentTime);
|
|
serverStatus.LastUpdateTime = DateTime.FromFileTime(serverstatus.ftLastUpdateTime);
|
|
serverStatus.StartTime = DateTime.FromFileTime(serverstatus.ftStartTime);
|
|
serverStatus.BandWidth = serverstatus.dwBandWidth;
|
|
serverStatus.BuildNumber = serverstatus.wBuildNumber;
|
|
serverStatus.GroupCount = serverstatus.dwGroupCount;
|
|
serverStatus.MajorVersion = serverstatus.wMajorVersion;
|
|
serverStatus.MinorVersion = serverstatus.wMinorVersion;
|
|
serverStatus.ServerState = serverstatus.eServerState;
|
|
serverStatus.VendorInfo = serverstatus.szVendorInfo;
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(status))
|
|
{
|
|
throw new OPCException(status, ErrorDescriptions.GetErrorDescription(status));
|
|
}
|
|
return status;
|
|
}
|
|
|
|
public int IsAvailableNT(out bool available)
|
|
{
|
|
int num;
|
|
available = false;
|
|
if (this.ifSecurityNT == null)
|
|
{
|
|
num = -2147467263;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifSecurityNT.IsAvailableNT(out available);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int IsAvailablePriv(out bool available)
|
|
{
|
|
int num;
|
|
available = false;
|
|
if (this.ifSecurityPriv == null)
|
|
{
|
|
num = -2147467263;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifSecurityPriv.IsAvailablePriv(out available);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
internal bool isConnected()
|
|
{
|
|
return ((this.OPCserverObj != null) && (this.ifServer != null));
|
|
}
|
|
|
|
public int Logoff()
|
|
{
|
|
int num;
|
|
if (this.ifSecurityPriv == null)
|
|
{
|
|
num = -2147467263;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifSecurityPriv.Logoff();
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int Logon(string userID, string password)
|
|
{
|
|
int num;
|
|
if (this.ifSecurityPriv == null)
|
|
{
|
|
num = -2147467263;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifSecurityPriv.Logon(userID, password);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int LookupItemIDs(string itemID, int[] propertyIDs, out ItemPropertyItemID[] propertyItems)
|
|
{
|
|
int num2;
|
|
IntPtr ptr;
|
|
IntPtr ptr2;
|
|
propertyItems = null;
|
|
int length = propertyIDs.Length;
|
|
if (length < 1)
|
|
{
|
|
num2 = -1073479165;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num2, ErrorDescriptions.GetErrorDescription(num2));
|
|
}
|
|
return num2;
|
|
}
|
|
if (this.ifItmProps == null)
|
|
{
|
|
num2 = -2147467262;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num2, ErrorDescriptions.GetErrorDescription(num2));
|
|
}
|
|
return num2;
|
|
}
|
|
num2 = this.ifItmProps.LookupItemIDs(itemID, length, propertyIDs, out ptr2, out ptr);
|
|
if (HRESULTS.Failed(num2))
|
|
{
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num2, ErrorDescriptions.GetErrorDescription(num2));
|
|
}
|
|
return num2;
|
|
}
|
|
int num3 = (int) ptr2;
|
|
int num4 = (int) ptr;
|
|
if ((num3 == 0) || (num4 == 0))
|
|
{
|
|
num2 = -2147467260;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num2, ErrorDescriptions.GetErrorDescription(num2));
|
|
}
|
|
return num2;
|
|
}
|
|
propertyItems = new ItemPropertyItemID[length];
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
propertyItems[i] = new ItemPropertyItemID();
|
|
propertyItems[i].PropertyID = propertyIDs[i];
|
|
propertyItems[i].Error = Marshal.ReadInt32((IntPtr) num4);
|
|
num4 += 4;
|
|
if (propertyItems[i].Error == 0)
|
|
{
|
|
IntPtr ptr3 = (IntPtr) Marshal.ReadInt32((IntPtr) num3);
|
|
propertyItems[i].newItemID = Marshal.PtrToStringUni(ptr3);
|
|
Marshal.FreeCoTaskMem(ptr3);
|
|
}
|
|
else
|
|
{
|
|
propertyItems[i].newItemID = null;
|
|
}
|
|
num3 += 4;
|
|
}
|
|
Marshal.FreeCoTaskMem(ptr2);
|
|
Marshal.FreeCoTaskMem(ptr);
|
|
return 0;
|
|
}
|
|
|
|
void IOPCShutdown.ShutdownRequest(string shutdownReason)
|
|
{
|
|
ShutdownRequestEventArgs e = new ShutdownRequestEventArgs(shutdownReason);
|
|
if (this.ShutdownRequested != null)
|
|
{
|
|
this.ShutdownRequested(this, e);
|
|
}
|
|
}
|
|
|
|
public int QueryAvailableLocaleIDs(out int[] lcids)
|
|
{
|
|
int num;
|
|
IntPtr ptr;
|
|
lcids = null;
|
|
int rtc = 0;
|
|
if (this.ifCommon == null)
|
|
{
|
|
rtc = -2147467262;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(rtc, ErrorDescriptions.GetErrorDescription(rtc));
|
|
}
|
|
return rtc;
|
|
}
|
|
rtc = this.ifCommon.QueryAvailableLocaleIDs(out num, out ptr);
|
|
if (HRESULTS.Failed(rtc))
|
|
{
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(rtc, ErrorDescriptions.GetErrorDescription(rtc));
|
|
}
|
|
return rtc;
|
|
}
|
|
if (((int) ptr) == 0)
|
|
{
|
|
rtc = -2147467259;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(rtc, ErrorDescriptions.GetErrorDescription(rtc));
|
|
}
|
|
return rtc;
|
|
}
|
|
if (num < 1)
|
|
{
|
|
Marshal.FreeCoTaskMem(ptr);
|
|
rtc = -2147467259;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(rtc, ErrorDescriptions.GetErrorDescription(rtc));
|
|
}
|
|
return rtc;
|
|
}
|
|
lcids = new int[num];
|
|
Marshal.Copy(ptr, lcids, 0, num);
|
|
Marshal.FreeCoTaskMem(ptr);
|
|
return 0;
|
|
}
|
|
|
|
public int QueryAvailableProperties(string itemID, out OPCItemProperty[] opcProperties)
|
|
{
|
|
int num2;
|
|
opcProperties = null;
|
|
int dwCount = 0;
|
|
IntPtr zero = IntPtr.Zero;
|
|
IntPtr ppDescriptions = IntPtr.Zero;
|
|
IntPtr ppvtDataTypes = IntPtr.Zero;
|
|
if (this.ifItmProps == null)
|
|
{
|
|
num2 = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
num2 = this.ifItmProps.QueryAvailableProperties(itemID, out dwCount, out zero, out ppDescriptions, out ppvtDataTypes);
|
|
}
|
|
if ((HRESULTS.Failed(num2) || (dwCount == 0)) || (dwCount > 0x2710))
|
|
{
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num2, ErrorDescriptions.GetErrorDescription(num2));
|
|
}
|
|
return num2;
|
|
}
|
|
int num3 = (int) zero;
|
|
int num4 = (int) ppDescriptions;
|
|
int num5 = (int) ppvtDataTypes;
|
|
if (((num3 == 0) || (num4 == 0)) || (num5 == 0))
|
|
{
|
|
num2 = -2147467260;
|
|
if (this.myErrorsAsExecptions)
|
|
{
|
|
throw new OPCException(num2, ErrorDescriptions.GetErrorDescription(num2));
|
|
}
|
|
return num2;
|
|
}
|
|
opcProperties = new OPCItemProperty[dwCount];
|
|
for (int i = 0; i < dwCount; i++)
|
|
{
|
|
opcProperties[i] = new OPCItemProperty();
|
|
opcProperties[i].PropertyID = Marshal.ReadInt32((IntPtr) num3);
|
|
num3 += 4;
|
|
IntPtr ptr = (IntPtr) Marshal.ReadInt32((IntPtr) num4);
|
|
num4 += 4;
|
|
opcProperties[i].Description = Marshal.PtrToStringUni(ptr);
|
|
Marshal.FreeCoTaskMem(ptr);
|
|
opcProperties[i].DataType = (VarEnum) Marshal.ReadInt16((IntPtr) num5);
|
|
num5 += 2;
|
|
}
|
|
Marshal.FreeCoTaskMem(zero);
|
|
Marshal.FreeCoTaskMem(ppDescriptions);
|
|
Marshal.FreeCoTaskMem(ppvtDataTypes);
|
|
return 0;
|
|
}
|
|
|
|
public int QueryMinImpersonationLevel(out int minImpLevel)
|
|
{
|
|
int num;
|
|
minImpLevel = 0;
|
|
if (this.ifSecurityNT == null)
|
|
{
|
|
num = -2147467263;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifSecurityNT.QueryMinImpersonationLevel(out minImpLevel);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public OPCNAMESPACETYPE QueryOrganization()
|
|
{
|
|
int num;
|
|
OPCNAMESPACETYPE pNameSpaceType = OPCNAMESPACETYPE.OPC_NS_HIERARCHIAL;
|
|
if (this.ifBrowse == null)
|
|
{
|
|
num = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifBrowse.QueryOrganization(out pNameSpaceType);
|
|
}
|
|
if (num != 0)
|
|
{
|
|
throw new OPCException(num, "QueryOrganization failed with error " + ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return pNameSpaceType;
|
|
}
|
|
|
|
public ItemValue[] Read(string[] itemIDs, int[] maxAges)
|
|
{
|
|
int count = (itemIDs == null) ? 0 : itemIDs.Length;
|
|
IntPtr zero = IntPtr.Zero;
|
|
IntPtr ppwQualities = IntPtr.Zero;
|
|
IntPtr ppftTimeStamps = IntPtr.Zero;
|
|
IntPtr ppErrors = IntPtr.Zero;
|
|
int hresultcode = this.ifItemIO.Read(count, itemIDs, maxAges, out zero, out ppwQualities, out ppftTimeStamps, out ppErrors);
|
|
if (HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, "Read failed with error " + ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
object[] objArray = CustomMarshal.ToObjects(count, ref zero);
|
|
OPCQuality[] qualityArray = CustomMarshal.ToQualities(count, ref ppwQualities);
|
|
DateTime[] timeArray = CustomMarshal.ToDateTimes(count, ref ppftTimeStamps);
|
|
int[] destination = new int[count];
|
|
Marshal.Copy(ppErrors, destination, 0, count);
|
|
ItemValue[] valueArray = new ItemValue[count];
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
valueArray[i] = new ItemValue();
|
|
valueArray[i].ItemID = itemIDs[i];
|
|
valueArray[i].ClientHandle = 0;
|
|
valueArray[i].ServerHandle = 0;
|
|
valueArray[i].Value = objArray[i];
|
|
valueArray[i].Quality = qualityArray[i];
|
|
valueArray[i].Timestamp = timeArray[i];
|
|
valueArray[i].Error = destination[i];
|
|
}
|
|
Marshal.FreeCoTaskMem(ppErrors);
|
|
return valueArray;
|
|
}
|
|
|
|
public ItemValue[] Read(string[] itemIDs, int maxAge)
|
|
{
|
|
int[] maxAges = new int[itemIDs.Length];
|
|
for (int i = 0; i < itemIDs.Length; i++)
|
|
{
|
|
maxAges[i] = maxAge;
|
|
}
|
|
return this.Read(itemIDs, maxAges);
|
|
}
|
|
|
|
public int RemoveGroup(OpcGroup groupObject, bool bForce)
|
|
{
|
|
int hresultcode = groupObject.Remove(bForce);
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
return hresultcode;
|
|
}
|
|
|
|
public int SetClientName(string name)
|
|
{
|
|
int num;
|
|
if (this.ifCommon == null)
|
|
{
|
|
num = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifCommon.SetClientName(name);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
private int SetInterfaces(object srvObj)
|
|
{
|
|
|
|
this.OPCserverObj = srvObj;
|
|
this.ifServer = (IOPCServer) this.OPCserverObj;
|
|
if (this.ifServer == null)
|
|
{
|
|
return -2147220992;
|
|
}
|
|
try
|
|
{
|
|
this.ifCommon = (IOPCCommon) this.OPCserverObj;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
try
|
|
{
|
|
this.ifSecurityNT = (IOPCSecurityNT) this.OPCserverObj;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
try
|
|
{
|
|
this.ifSecurityPriv = (IOPCSecurityPrivate) this.OPCserverObj;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
try
|
|
{
|
|
this.ifBrowse = (IOPCBrowseServerAddressSpace) this.ifServer;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
try
|
|
{
|
|
this.ifItmProps = (IOPCItemProperties) this.ifServer;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
try
|
|
{
|
|
this.cpointcontainer = (UCOMIConnectionPointContainer) this.OPCserverObj;
|
|
this.AdviseIOPCShutdown();
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
try
|
|
{
|
|
this.ifBrowse3 = (IOPCBrowse) this.ifServer;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
try
|
|
{
|
|
this.ifItemIO = (IOPCItemIO) this.ifServer;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public int SetLocaleID(int lcid)
|
|
{
|
|
int num;
|
|
if (this.ifCommon == null)
|
|
{
|
|
num = -2147467262;
|
|
}
|
|
else
|
|
{
|
|
num = this.ifCommon.SetLocaleID(lcid);
|
|
}
|
|
if (this.myErrorsAsExecptions && HRESULTS.Failed(num))
|
|
{
|
|
throw new OPCException(num, ErrorDescriptions.GetErrorDescription(num));
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public OPCDA.NET.ShowBrowseTree ShowBrowseTree(TreeView tvServer)
|
|
{
|
|
return new OPCDA.NET.ShowBrowseTree(this, tvServer);
|
|
}
|
|
|
|
public OPCDA.NET.ShowBrowseTreeList ShowBrowseTreeList(TreeView tvBranches, ListView lvItems)
|
|
{
|
|
return new OPCDA.NET.ShowBrowseTreeList(this, tvBranches, lvItems);
|
|
}
|
|
|
|
private ItemProperties UnmarshalProperties(IntPtr iProp)
|
|
{
|
|
int num = (int) iProp;
|
|
ItemProperties properties = new ItemProperties();
|
|
properties.Error = Marshal.ReadInt32((IntPtr) num);
|
|
int num2 = Marshal.ReadInt32((IntPtr) (num + 4));
|
|
IntPtr ptr = (IntPtr) Marshal.ReadInt32((IntPtr) (num + 8));
|
|
if (!HRESULTS.Succeeded(properties.Error) || ((num2 != 0) && !HRESULTS.Failed(properties.Error)))
|
|
{
|
|
properties.Properties = new Property[num2];
|
|
int num3 = (int) ptr;
|
|
for (int i = 0; i < num2; i++)
|
|
{
|
|
properties.Properties[i] = new Property();
|
|
properties.Properties[i].DataType = (VarEnum) Marshal.ReadInt16((IntPtr) num3);
|
|
properties.Properties[i].ID = Marshal.ReadInt32((IntPtr) (num3 + 4));
|
|
IntPtr ptr2 = (IntPtr) Marshal.ReadInt32((IntPtr) (num3 + 8));
|
|
properties.Properties[i].ItemID = Marshal.PtrToStringUni(ptr2);
|
|
Marshal.FreeCoTaskMem(ptr2);
|
|
ptr2 = (IntPtr) Marshal.ReadInt32((IntPtr) (num3 + 12));
|
|
properties.Properties[i].Description = Marshal.PtrToStringUni(ptr2);
|
|
Marshal.FreeCoTaskMem(ptr2);
|
|
object objectForNativeVariant = Marshal.GetObjectForNativeVariant((IntPtr) (num3 + 0x10));
|
|
properties.Properties[i].Error = Marshal.ReadInt32((IntPtr) (num3 + 0x20));
|
|
properties.Properties[i].Value = this.UnmarshalPropertyValue(properties.Properties[i].ID, objectForNativeVariant);
|
|
num3 += 40;
|
|
}
|
|
Marshal.FreeCoTaskMem(ptr);
|
|
}
|
|
return properties;
|
|
}
|
|
|
|
private object UnmarshalPropertyValue(int propertyID, object propertyValue)
|
|
{
|
|
switch (propertyID)
|
|
{
|
|
case 1:
|
|
return Enum.ToObject(typeof(VarEnum), Convert.ToInt16(propertyValue));
|
|
|
|
case 2:
|
|
case 4:
|
|
case 6:
|
|
return propertyValue;
|
|
|
|
case 3:
|
|
return new OPCQuality((qualityBits) Convert.ToInt16(propertyValue));
|
|
|
|
case 5:
|
|
return Enum.ToObject(typeof(OPCACCESSRIGHTS), Convert.ToInt32(propertyValue));
|
|
|
|
case 7:
|
|
return Enum.ToObject(typeof(OPCEUTYPE), Convert.ToInt32(propertyValue));
|
|
}
|
|
return propertyValue;
|
|
}
|
|
|
|
private static string WrapperVersion()
|
|
{
|
|
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion;
|
|
int length = fileVersion.LastIndexOf('.');
|
|
return fileVersion.Substring(0, length);
|
|
}
|
|
|
|
public ItemValue[] Write(ItemValue[] items)
|
|
{
|
|
int dwCount = (items == null) ? 0 : items.Length;
|
|
string[] pszItemIDs = new string[dwCount];
|
|
OPCITEMVQT structure = new OPCITEMVQT();
|
|
int num2 = Marshal.SizeOf(structure);
|
|
IntPtr pItemVQT = Marshal.AllocCoTaskMem(dwCount * num2);
|
|
int num3 = (int) pItemVQT;
|
|
structure.dwReserved = 0;
|
|
structure.wReserved = 0;
|
|
foreach (ItemValue value2 in items)
|
|
{
|
|
structure.vDataValue = CustomMarshal.ToVariant(value2.Value);
|
|
structure.bQualitySpecified = value2.QualitySpecified;
|
|
structure.wQuality = value2.Quality.GetCode();
|
|
structure.bTimeStampSpecified = value2.TimestampSpecified;
|
|
structure.ftTimeStamp = value2.Timestamp.ToFileTime();
|
|
Marshal.StructureToPtr(structure, (IntPtr) num3, false);
|
|
num3 += num2;
|
|
}
|
|
for (int i = 0; i < dwCount; i++)
|
|
{
|
|
pszItemIDs[i] = items[i].ItemID;
|
|
}
|
|
IntPtr zero = IntPtr.Zero;
|
|
int hresultcode = this.ifItemIO.WriteVQT(dwCount, pszItemIDs, pItemVQT, out zero);
|
|
if (HRESULTS.Failed(hresultcode))
|
|
{
|
|
throw new OPCException(hresultcode, "Write failed with error " + ErrorDescriptions.GetErrorDescription(hresultcode));
|
|
}
|
|
int[] destination = new int[dwCount];
|
|
Marshal.Copy(zero, destination, 0, dwCount);
|
|
for (int j = 0; j < dwCount; j++)
|
|
{
|
|
items[j].Error = destination[j];
|
|
}
|
|
Marshal.FreeCoTaskMem(zero);
|
|
return items;
|
|
}
|
|
|
|
public bool ConnectThroughNIOS
|
|
{
|
|
get
|
|
{
|
|
return this.myConnectThroughNIOS;
|
|
}
|
|
set
|
|
{
|
|
this.myConnectThroughNIOS = value;
|
|
}
|
|
}
|
|
|
|
public bool ErrorsAsExecptions
|
|
{
|
|
get
|
|
{
|
|
return this.myErrorsAsExecptions;
|
|
}
|
|
set
|
|
{
|
|
this.myErrorsAsExecptions = value;
|
|
}
|
|
}
|
|
|
|
public Host HostInfo
|
|
{
|
|
get
|
|
{
|
|
return this.myHostInfo;
|
|
}
|
|
}
|
|
|
|
public string ServerName
|
|
{
|
|
get
|
|
{
|
|
return this.myServerName;
|
|
}
|
|
}
|
|
|
|
public static string Version
|
|
{
|
|
get
|
|
{
|
|
return WrapperVersion();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|