public static ServiceResult Validate(ReadValueId valueId)
{
// check for null structure.
if (valueId == null)
{
return StatusCodes.BadStructureMissing;
}
// null node ids are always invalid.
if (valueId.NodeId == null)
{
return StatusCodes.BadNodeIdInvalid;
}
// must be a legimate attribute value.
if (!Attributes.IsValid(valueId.AttributeId))
{
return StatusCodes.BadAttributeIdInvalid;
}
// data encoding and index range is only valid for value attributes.
if (valueId.AttributeId != Attributes.Value)
{
if (!String.IsNullOrEmpty(valueId.IndexRange))
{
return StatusCodes.BadIndexRangeNoData;
}
if (!QualifiedName.IsNull(valueId.DataEncoding))
{
return StatusCodes.BadDataEncodingInvalid;
}
}
// initialize as empty.
valueId.ParsedIndexRange = NumericRange.Empty;
// parse the index range if specified.
if (!String.IsNullOrEmpty(valueId.IndexRange))
{
try
{
valueId.ParsedIndexRange = NumericRange.Parse(valueId.IndexRange);
}
catch (Exception e)
{
return ServiceResult.Create(e, StatusCodes.BadIndexRangeInvalid, String.Empty);
}
}
else
{
valueId.ParsedIndexRange = NumericRange.Empty;
}
// passed basic validation.
return null;
}
#endregion