/// <summary> /// Adds a DataValue to a list of values to return. /// </summary> private void AddValue( TimestampsToReturn timestampsToReturn, NumericRange indexRange, QualifiedName dataEncoding, DataValueCollection values, DataValue value) { // ignore invalid case. if (value == null) { return; } // save the last timestamp returned. m_lastTime = value.ServerTimestamp; // check if the index range or data encoding can be applied. if (StatusCode.IsGood(value.StatusCode)) { object valueToReturn = value.Value; // apply the index range. if (indexRange != NumericRange.Empty) { StatusCode error = indexRange.ApplyRange(ref valueToReturn); if (StatusCode.IsBad(error)) { value.Value = null; value.StatusCode = error; } else { value.Value = valueToReturn; } } // apply the data encoding. if (!QualifiedName.IsNull(dataEncoding)) { value.Value = null; value.StatusCode = StatusCodes.BadDataEncodingUnsupported; } } // apply the timestamps filter. if (timestampsToReturn == TimestampsToReturn.Neither || timestampsToReturn == TimestampsToReturn.Server) { value.SourceTimestamp = DateTime.MinValue; } if (timestampsToReturn == TimestampsToReturn.Neither || timestampsToReturn == TimestampsToReturn.Source) { value.ServerTimestamp = DateTime.MinValue; } // add result. values.Add(value); }
/// <summary> /// Adds index ranges to the collection. /// </summary> private void AddWriteValues( Node node, WriteValueCollection nodesToWrite, params uint[] attributeIds) { if (attributeIds != null) { for (int ii = 0; ii < attributeIds.Length; ii++) { WriteValue nodeToWrite = new WriteValue(); nodeToWrite.NodeId = node.NodeId; nodeToWrite.AttributeId = attributeIds[ii]; DataValue value = new DataValue(); ServiceResult result = node.Read( null, attributeIds[ii], value); value.StatusCode = StatusCodes.Good; value.ServerTimestamp = DateTime.MinValue; value.SourceTimestamp = DateTime.MinValue; if (ServiceResult.IsBad(result)) { value.Value = null; } nodeToWrite.Value = value; nodeToWrite.Handle = node; nodesToWrite.Add(nodeToWrite); Array array = value.Value as Array; if (array != null) { NumericRange range = new NumericRange(0, 1); object subarray = array; range.ApplyRange(ref subarray); nodeToWrite = new WriteValue(); nodeToWrite.Value = new DataValue(); nodeToWrite.Value.Value = subarray; nodeToWrite.Value.StatusCode = StatusCodes.Good; nodeToWrite.Value.ServerTimestamp = DateTime.MinValue; nodeToWrite.Value.SourceTimestamp = DateTime.MinValue; nodeToWrite.NodeId = node.NodeId; nodeToWrite.AttributeId = attributeIds[ii]; nodeToWrite.IndexRange = "0"; nodeToWrite.Handle = node; nodesToWrite.Add(nodeToWrite); } nodeToWrite = new WriteValue(); nodeToWrite.Value = new DataValue(); nodeToWrite.Value.Value = value.Value; nodeToWrite.Value.StatusCode = StatusCodes.Uncertain; nodeToWrite.Value.ServerTimestamp = DateTime.MinValue; nodeToWrite.Value.SourceTimestamp = DateTime.MinValue; nodeToWrite.NodeId = node.NodeId; nodeToWrite.AttributeId = attributeIds[ii]; nodeToWrite.Handle = node; nodesToWrite.Add(nodeToWrite); nodeToWrite = new WriteValue(); nodeToWrite.Value = new DataValue(); nodeToWrite.Value.Value = value.Value; nodeToWrite.Value.StatusCode = StatusCodes.Good; nodeToWrite.Value.ServerTimestamp = DateTime.UtcNow; nodeToWrite.Value.SourceTimestamp = DateTime.MinValue; nodeToWrite.NodeId = node.NodeId; nodeToWrite.AttributeId = attributeIds[ii]; nodeToWrite.Handle = node; nodesToWrite.Add(nodeToWrite); nodeToWrite = new WriteValue(); nodeToWrite.Value = new DataValue(); nodeToWrite.Value.Value = value.Value; nodeToWrite.Value.StatusCode = StatusCodes.Good; nodeToWrite.Value.ServerTimestamp = DateTime.MinValue; nodeToWrite.Value.SourceTimestamp = DateTime.UtcNow; nodeToWrite.NodeId = node.NodeId; nodeToWrite.AttributeId = attributeIds[ii]; nodeToWrite.Handle = node; nodesToWrite.Add(nodeToWrite); } } }
/// <summary> /// Reads the value for an attribute of a node. /// </summary> public DataValue ReadAttributeValue( IOperationContext context, ExpandedNodeId typeDefinitionId, IList<QualifiedName> relativePath, uint attributeId, NumericRange indexRange) { lock (DataLock) { // check for match on the event type being searched. if (!Server.TypeTree.IsTypeOf(TypeDefinitionId, typeDefinitionId)) { return new DataValue(StatusCodes.BadNotSupported); } // find the target. NodeSource target = this; if (relativePath != null && relativePath.Count > 0) { target = Find(relativePath, 0); if (target == null) { return new DataValue(StatusCodes.BadNotSupported); } } // read the attribute value. DataValue dataValue = new DataValue(); ServiceResult result = target.Read(context, attributeId, dataValue); if (ServiceResult.IsBad(result)) { return new DataValue(result.StatusCode); } // apply any index range. object value = dataValue.Value; result = indexRange.ApplyRange(ref value); if (ServiceResult.IsBad(result)) { return new DataValue(result.StatusCode); } dataValue.Value = value; // return the value. return dataValue; } }