public void ModifyMonitoredItems(
OperationContext context,
TimestampsToReturn timestampsToReturn,
IList<IMonitoredItem> monitoredItems,
IList<MonitoredItemModifyRequest> itemsToModify,
IList<ServiceResult> errors,
IList<MonitoringFilterResult> filterErrors)
{
if (context == null) throw new ArgumentNullException("context");
if (monitoredItems == null) throw new ArgumentNullException("monitoredItems");
if (itemsToModify == null) throw new ArgumentNullException("itemsToModify");
if (errors == null) throw new ArgumentNullException("errors");
try
{
m_lock.Enter();
for (int ii = 0; ii < errors.Count; ii++)
{
MonitoredItemModifyRequest itemToModify = itemsToModify[ii];
// skip items that have already been processed.
if (itemToModify.Processed || monitoredItems[ii] == null)
{
continue;
}
// check if the node manager created the item.
if (!Object.ReferenceEquals(this, monitoredItems[ii].NodeManager))
{
continue;
}
// owned by this node manager.
itemToModify.Processed = true;
// validate monitored item.
MonitoredItem monitoredItem = null;
if (!m_monitoredItems.TryGetValue(monitoredItems[ii].Id, out monitoredItem))
{
errors[ii] = StatusCodes.BadMonitoredItemIdInvalid;
continue;
}
if (!Object.ReferenceEquals(monitoredItem, monitoredItems[ii]))
{
errors[ii] = StatusCodes.BadMonitoredItemIdInvalid;
continue;
}
// find the node being monitored.
ILocalNode node = monitoredItem.ManagerHandle as ILocalNode;
if (node == null)
{
errors[ii] = StatusCodes.BadNodeIdUnknown;
continue;
}
// fetch the metadata for the node.
NodeMetadata metadata = GetNodeMetadata(context, monitoredItem.ManagerHandle, BrowseResultMask.All);
bool rangeRequired = false;
// validate the filter against the node/attribute being monitored.
errors[ii] = ValidateFilter(
metadata,
monitoredItem.AttributeId,
itemToModify.RequestedParameters.Filter,
out rangeRequired);
if (ServiceResult.IsBad(errors[ii]))
{
continue;
}
// lookup EU range if required.
Range range = null;
if (rangeRequired)
{
// look up EU range.
errors[ii] = ReadEURange(context, node, out range);
if (ServiceResult.IsBad(errors[ii]))
{
continue;
}
}
// update sampling.
errors[ii] = m_samplingGroupManager.ModifyMonitoredItem(
context,
timestampsToReturn,
monitoredItem,
itemToModify,
range);
// state of item did not change if an error returned here.
if (ServiceResult.IsBad(errors[ii]))
{
continue;
}
// item has been modified successfully.
// errors updating the sampling groups will be reported in notifications.
errors[ii] = StatusCodes.Good;
}
}
finally
{
m_lock.Exit();
}
// update all sampling groups.
m_samplingGroupManager.ApplyChanges();
}