private void UpdateAreaFilter(List<NodeId> areas)
{
// check if monitoring all events.
if (areas == null || areas.Count == 0)
{
MonitoredItem monitoredItem = null;
if (!m_notifiers.TryGetValue(Opc.Ua.ObjectIds.Server, out monitoredItem))
{
monitoredItem = CreateMonitoredItem(Opc.Ua.ObjectIds.Server);
}
m_notifiers.Clear();
m_notifiers[Opc.Ua.ObjectIds.Server] = monitoredItem;
return;
}
// build table of areas to monitor.
NodeIdDictionary<MonitoredItem> notifiers = new NodeIdDictionary<MonitoredItem>();
// map all of the area search strings onto NodeIds for notifiers.
for (int ii = 0; ii < areas.Count; ii++)
{
NodeId areaId = areas[ii];
// check for existing item.
MonitoredItem monitoredItem = null;
if (m_notifiers.TryGetValue(areaId, out monitoredItem))
{
notifiers[areaId] = monitoredItem;
continue;
}
// check for new item.
if (!notifiers.ContainsKey(areaId))
{
notifiers[areaId] = CreateMonitoredItem(areaId);
}
}
// mark unused items for deletion.
foreach (MonitoredItem monitoredItem in m_notifiers.Values)
{
if (!notifiers.ContainsKey(monitoredItem.StartNodeId))
{
m_subscription.RemoveItem(monitoredItem);
}
}
m_notifiers = notifiers;
}