private ServiceResult ValidateFilter(
NodeMetadata metadata,
uint attributeId,
ExtensionObject filter,
out bool rangeRequired)
{
rangeRequired = false;
// check filter.
DataChangeFilter datachangeFilter = null;
if (filter != null)
{
datachangeFilter = filter.Body as DataChangeFilter;
}
if (datachangeFilter != null)
{
// get the datatype of the node.
NodeId datatypeId = metadata.DataType;
// check that filter is valid.
ServiceResult error = datachangeFilter.Validate();
if (ServiceResult.IsBad(error))
{
return error;
}
// check datatype of the variable.
if (!m_server.TypeTree.IsTypeOf(datatypeId, DataTypes.Number))
{
return StatusCodes.BadDeadbandFilterInvalid;
}
// percent deadbands only allowed for analog data items.
if (datachangeFilter.DeadbandType == (uint)(int)DeadbandType.Percent)
{
ExpandedNodeId typeDefinitionId = metadata.TypeDefinition;
if (typeDefinitionId == null)
{
return StatusCodes.BadDeadbandFilterInvalid;
}
// percent deadbands only allowed for analog data items.
if (!m_server.TypeTree.IsTypeOf(typeDefinitionId, VariableTypes.AnalogItemType))
{
return StatusCodes.BadDeadbandFilterInvalid;
}
// the EURange property is required to use the filter.
rangeRequired = true;
}
}
// filter is valid
return ServiceResult.Good;
}