/// <summary> /// Validates the nodes and reads the values from the underlying source. /// </summary> /// <param name="context">The context.</param> /// <param name="nodesToRead">The nodes to read.</param> /// <param name="values">The values.</param> /// <param name="errors">The errors.</param> /// <param name="nodesToValidate">The nodes to validate.</param> /// <param name="cache">The cache.</param> protected override void Read( ServerSystemContext context, IList<ReadValueId> nodesToRead, IList<DataValue> values, IList<ServiceResult> errors, List<NodeHandle> nodesToValidate, IDictionary<NodeId, NodeState> cache) { ComHdaClientManager system = (ComHdaClientManager)this.SystemContext.SystemHandle; ComHdaClient client = (ComHdaClient)system.SelectClient((ServerSystemContext)SystemContext, false); HdaReadRequestCollection requests = new HdaReadRequestCollection(); for (int ii = 0; ii < nodesToValidate.Count; ii++) { NodeHandle handle = nodesToValidate[ii]; lock (Lock) { NodeState source = ValidateNode(context, handle, cache); if (source == null) { continue; } DataValue value = values[handle.Index]; ReadValueId nodeToRead = nodesToRead[handle.Index]; // determine if request can be sent to the server. bool queued = false; errors[handle.Index] = requests.Add(source, nodeToRead, out queued); if (queued) { continue; } // read built-in metadata. errors[handle.Index] = source.ReadAttribute( context, nodeToRead.AttributeId, nodeToRead.ParsedIndexRange, nodeToRead.DataEncoding, value); } } // read the attributes. if (requests.Count > 0) { client.Read(requests, false); } // extract the values from the results. for (int ii = 0; ii < nodesToValidate.Count; ii++) { NodeHandle handle = nodesToValidate[ii]; DataValue value = values[handle.Index]; ReadValueId nodeToRead = nodesToRead[handle.Index]; lock (Lock) { if (!requests.HasResult(nodeToRead)) { continue; } errors[handle.Index] = requests.GetResult(context, handle.Node, nodeToRead, value, context.DiagnosticsMask); } } }