/// <summary> /// Subscribes to events. /// </summary> /// <param name="context">The context.</param> /// <param name="source">The source.</param> /// <param name="monitoredItem">The monitored item.</param> /// <param name="unsubscribe">if set to <c>true</c> [unsubscribe].</param> /// <returns>Any error code.</returns> protected virtual ServiceResult SubscribeToEvents( ServerSystemContext context, NodeState source, IEventMonitoredItem monitoredItem, bool unsubscribe) { MonitoredNode monitoredNode = null; // handle unsubscribe. if (unsubscribe) { // check for existing monitored node. if (!MonitoredNodes.TryGetValue(source.NodeId, out monitoredNode)) { return StatusCodes.BadNodeIdUnknown; } monitoredNode.Remove(monitoredItem); // check if node is no longer being monitored. if (!monitoredNode.HasMonitoredItems) { MonitoredNodes.Remove(source.NodeId); } // update flag. source.SetAreEventsMonitored(context, !unsubscribe, true); // call subclass. OnSubscribeToEvents(context, monitoredNode, unsubscribe); // all done. return ServiceResult.Good; } // only objects or views can be subscribed to. BaseObjectState instance = source as BaseObjectState; if (instance == null || (instance.EventNotifier & EventNotifiers.SubscribeToEvents) == 0) { ViewState view = source as ViewState; if (view == null || (view.EventNotifier & EventNotifiers.SubscribeToEvents) == 0) { return StatusCodes.BadNotSupported; } } // check for existing monitored node. if (!MonitoredNodes.TryGetValue(source.NodeId, out monitoredNode)) { MonitoredNodes[source.NodeId] = monitoredNode = new MonitoredNode(this, source); } // this links the node to specified monitored item and ensures all events // reported by the node are added to the monitored item's queue. monitoredNode.Add(monitoredItem); // This call recursively updates a reference count all nodes in the notifier // hierarchy below the area. Sources with a reference count of 0 do not have // any active subscriptions so they do not need to report events. source.SetAreEventsMonitored(context, !unsubscribe, true); // signal update. OnSubscribeToEvents(context, monitoredNode, unsubscribe); // all done. return ServiceResult.Good; }
/// <summary> /// Subscribes to events. /// </summary> /// <param name="context">The context.</param> /// <param name="source">The source.</param> /// <param name="monitoredItem">The monitored item.</param> /// <param name="unsubscribe">if set to <c>true</c> [unsubscribe].</param> /// <returns>Any error code.</returns> protected override ServiceResult SubscribeToEvents( ServerSystemContext context, NodeState source, IEventMonitoredItem monitoredItem, bool unsubscribe) { // handle unsubscribe. if (unsubscribe) { // check for existing monitored node. if (!MonitoredNodes.TryGetValue(source.NodeId, out MonitoredNode2 monitoredNode2)) { return(StatusCodes.BadNodeIdUnknown); } monitoredNode2.Remove(monitoredItem); // check if node is no longer being monitored. if (!monitoredNode2.HasMonitoredItems) { MonitoredNodes.Remove(source.NodeId); } // update flag. source.SetAreEventsMonitored(context, !unsubscribe, true); // call subclass. OnSubscribeToEvents(context, monitoredNode2, unsubscribe); // all done. return(ServiceResult.Good); } // only objects or views can be subscribed to. BaseObjectState instance = source as BaseObjectState; if (instance == null || (instance.EventNotifier & EventNotifiers.SubscribeToEvents) == 0) { ViewState view = source as ViewState; if (view == null || (view.EventNotifier & EventNotifiers.SubscribeToEvents) == 0) { return(StatusCodes.BadNotSupported); } } // check for existing monitored node. if (!MonitoredNodes.TryGetValue(source.NodeId, out MonitoredNode2 monitoredNode)) { MonitoredNodes[source.NodeId] = monitoredNode = new MonitoredNode2(this, source); } // this links the node to specified monitored item and ensures all events // reported by the node are added to the monitored item's queue. monitoredNode.Add(monitoredItem); // This call recursively updates a reference count all nodes in the notifier // hierarchy below the area. Sources with a reference count of 0 do not have // any active subscriptions so they do not need to report events. source.SetAreEventsMonitored(context, !unsubscribe, true); // signal update. OnSubscribeToEvents(context, monitoredNode, unsubscribe); // all done. return(ServiceResult.Good); }