From 94e2a74dc8483a05ac38b85b4441bb04d4de9e7b Mon Sep 17 00:00:00 2001 From: Robin Mattheussen Date: Mon, 12 Nov 2018 19:31:05 +0100 Subject: [PATCH] Added OnReferenceAdded and OnReferenceRemoved handlers to NodeState --- Stack/Opc.Ua.Core/Stack/State/NodeState.cs | 42 +++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/Stack/Opc.Ua.Core/Stack/State/NodeState.cs b/Stack/Opc.Ua.Core/Stack/State/NodeState.cs index a41b056417..85897ae24e 100644 --- a/Stack/Opc.Ua.Core/Stack/State/NodeState.cs +++ b/Stack/Opc.Ua.Core/Stack/State/NodeState.cs @@ -15,6 +15,7 @@ using System.Collections.Generic; using System.Xml; using System.Text; using System.IO; +using System.Linq; using System.Reflection; namespace Opc.Ua @@ -1992,6 +1993,16 @@ namespace Opc.Ua /// public NodeStateChangedHandler OnStateChanged; + /// + /// Called when a reference gets added to the node + /// + public NodeStateReferenceAdded OnReferenceAdded; + + /// + /// Called when a reference gets removed from the node + /// + public NodeStateReferenceRemoved OnReferenceRemoved; + /// /// Called when a node produces an event that needs to be reported. /// @@ -4150,6 +4161,8 @@ namespace Opc.Ua m_references.Add(new NodeStateReference(referenceTypeId, isInverse, targetId), null); m_changeMasks |= NodeStateChangeMasks.References; + + OnReferenceAdded?.Invoke(this, referenceTypeId, isInverse, targetId); } /// @@ -4174,6 +4187,7 @@ namespace Opc.Ua if (m_references.Remove(new NodeStateReference(referenceTypeId, isInverse, targetId))) { m_changeMasks |= NodeStateChangeMasks.References; + OnReferenceRemoved?.Invoke(this, referenceTypeId, isInverse, targetId); return true; } @@ -4198,6 +4212,7 @@ namespace Opc.Ua if (!m_references.ContainsKey(references[ii])) { m_references.Add(references[ii], null); + OnReferenceAdded?.Invoke(this, references[ii].ReferenceTypeId, references[ii].IsInverse, references[ii].TargetId); } } @@ -4220,7 +4235,14 @@ namespace Opc.Ua return false; } - return m_references.RemoveAll(referenceTypeId, isInverse); + var refsToRemove = m_references + .Select(r => r.Key) + .Where(r => r.ReferenceTypeId == referenceTypeId && r.IsInverse == isInverse) + .ToList(); + + refsToRemove.ForEach(r => RemoveReference(r.ReferenceTypeId, r.IsInverse, r.TargetId)); + + return refsToRemove.Any(); } #endregion @@ -4435,6 +4457,24 @@ namespace Opc.Ua ISystemContext context, NodeState node, NodeStateChangeMasks changes); + + /// + /// Used to receive notifications when a reference get added to the node + /// + public delegate void NodeStateReferenceAdded( + NodeState node, + NodeId referenceTypeId, + bool isInverse, + ExpandedNodeId targetId); + + /// + /// Used to receive notifications when a reference get removed to the node + /// + public delegate void NodeStateReferenceRemoved( + NodeState node, + NodeId referenceTypeId, + bool isInverse, + ExpandedNodeId targetId); /// /// Used to receive notifications when a node produces an event.