internal void OnDataChange(int[] clientHandles, DaValue[] values)
{
// check if callbacks are enabled.
if (m_monitoredItems == null)
{
return;
}
// lookup client handle a report change directly to monitored item.
lock (m_monitoredItems)
{
for (int ii = 0; ii < clientHandles.Length; ii++)
{
DataChangeInfo info = null;
if (!m_monitoredItems.TryGetValue(clientHandles[ii], out info))
{
continue;
}
MonitoredItem[] monitoredItems = info.MonitoredItems;
// convert the value to a UA value.
info.LastValue = new DataValue();
info.LastError = ReadRequest.GetItemValue(values[ii], info.LastValue, DiagnosticsMasks.All);
info.LastValue.ServerTimestamp = DateTime.UtcNow;
// queue the values.
for (int jj = 0; jj < monitoredItems.Length; jj++)
{
if (info.LastValue.Value.GetType().IsArray
&& monitoredItems[jj].IndexRange.Count != info.LastValue.Value.GetType().GetArrayRank()
&& StatusCode.IsBad(info.LastValue.StatusCode))
{
info.LastValue.StatusCode = StatusCodes.BadIndexRangeNoData;
}
monitoredItems[jj].QueueValue(info.LastValue, info.LastError);
}
}
}
}