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;
}
}