Opc.Ua.Server.MasterNodeManager.ModifyMonitoredItemsForEvents C# (CSharp) Method

ModifyMonitoredItemsForEvents() private method

Modify monitored items for event subscriptions.
private ModifyMonitoredItemsForEvents ( OperationContext context, TimestampsToReturn timestampsToReturn, IList monitoredItems, IList itemsToModify, IList errors, IList filterResults ) : void
context OperationContext
timestampsToReturn TimestampsToReturn
monitoredItems IList
itemsToModify IList
errors IList
filterResults IList
return void
        private void ModifyMonitoredItemsForEvents(
            OperationContext                  context,
            TimestampsToReturn                timestampsToReturn,
            IList<IMonitoredItem>             monitoredItems, 
            IList<MonitoredItemModifyRequest> itemsToModify,
            IList<ServiceResult>              errors,
            IList<MonitoringFilterResult>     filterResults)
        {           
            for (int ii = 0; ii < itemsToModify.Count; ii++)
            {
                IEventMonitoredItem monitoredItem = monitoredItems[ii] as IEventMonitoredItem;

                // all event subscriptions are handled by the event manager.
                if (monitoredItem == null || (monitoredItem.MonitoredItemType & MonitoredItemTypeMask.Events) == 0)
                {
                    continue;
                }
                
                MonitoredItemModifyRequest itemToModify = itemsToModify[ii];
                itemToModify.Processed = true;

                // check for a valid filter.
                if (ExtensionObject.IsNull(itemToModify.RequestedParameters.Filter))
                {
                    errors[ii] = StatusCodes.BadEventFilterInvalid;
                    continue;
                }

                // all event subscriptions required an event filter.
                EventFilter filter = itemToModify.RequestedParameters.Filter.Body as EventFilter;

                if (filter == null)
                {                
                    errors[ii] = StatusCodes.BadEventFilterInvalid;
                    continue;
                }
 
                // validate the event filter.
                EventFilter.Result result = filter.Validate(new FilterContext(m_server.NamespaceUris, m_server.TypeTree, context));

                if (ServiceResult.IsBad(result.Status))
                {
                    errors[ii] = result.Status;
                    filterResults[ii] = result.ToEventFilterResult(context.DiagnosticsMask, context.StringTable);
                    continue;
                }

                // modify the item.
                m_server.EventManager.ModifyMonitoredItem(
                    context,
                    monitoredItem,
                    timestampsToReturn,
                    itemToModify,
                    filter);
                
                // subscribe to all node managers.
                if ((monitoredItem.MonitoredItemType & MonitoredItemTypeMask.AllEvents) != 0)
                {
                    foreach (INodeManager manager in m_nodeManagers)
                    {
                        manager.SubscribeToAllEvents(
                            context, 
                            monitoredItem.SubscriptionId, 
                            monitoredItem, 
                            false);
                    }
                }

                // only subscribe to the node manager that owns the node.
                else
                {
                    monitoredItem.NodeManager.SubscribeToEvents(
                        context, 
                        monitoredItem.ManagerHandle, 
                        monitoredItem.SubscriptionId, 
                        monitoredItem, 
                        false);
                }

                errors[ii] = StatusCodes.Good;
            }
        }