public int[] SetActive(int[] serverHandles, bool active)
{
TraceState("SetActive", serverHandles.Length, active);
ThrowIfDisposed();
lock (m_lock)
{
// get net monitoring mode.
MonitoringMode monitoringMode = MonitoringMode.Disabled;
if (m_active && active)
{
monitoringMode = MonitoringMode.Reporting;
}
// validate the handles.
int[] results = new int[serverHandles.Length];
ComDaGroupItem[] items = new ComDaGroupItem[serverHandles.Length];
List<MonitoredItem> monitoredItems = new List<MonitoredItem>();
for (int ii = 0; ii < serverHandles.Length; ii++)
{
ComDaGroupItem item = null;
if (!m_itemsByHandle.TryGetValue(serverHandles[ii], out item))
{
results[ii] = ResultIds.E_INVALIDHANDLE;
continue;
}
// nothing to do if already in the correct state.
if (item.MonitoredItem.Status.MonitoringMode == monitoringMode)
{
item.Active = active;
results[ii] = ResultIds.S_OK;
continue;
}
items[ii] = item;
monitoredItems.Add(item.MonitoredItem);
}
// update the subscription.
try
{
m_subscription.SetMonitoringMode(monitoringMode, monitoredItems);
}
catch (Exception e)
{
SetFatalError(items, results, e, ResultIds.E_FAIL);
}
// update active state on success
for (int ii = 0; ii < items.Length; ii++)
{
if (items[ii] != null)
{
// clear the last sent value when deactivated.
// this prevents the change filter from suppressing
// updates if the item is reactivated and the value
// has not changed.
if (items[ii].Active && !active)
{
items[ii].LastSentValue = null;
}
items[ii].Active = active;
}
}
// return any errors.
return results;
}
}