private bool VerifyTargetAttributes(
Node node,
BrowseDescription description,
ReferenceDescriptionCollection references)
{
// check if nothing to do.
if (references.Count == 0)
{
return true;
}
bool error = false;
// build list of values to read.
ReadValueIdCollection valuesToRead = new ReadValueIdCollection();
for (int ii = 0; ii < references.Count; ii++)
{
ReferenceDescription reference = references[ii];
// ignore invalid or external references.
if (reference == null || reference.NodeId == null || reference.NodeId.IsAbsolute)
{
continue;
}
ReadValueId valueToRead = new ReadValueId();
valueToRead.NodeId = (NodeId)reference.NodeId;
valueToRead.AttributeId = Attributes.NodeId;
valueToRead.Handle = reference;
valuesToRead.Add(valueToRead);
if ((description.ResultMask & (uint)BrowseResultMask.NodeClass) != 0)
{
valueToRead = new ReadValueId();
valueToRead.NodeId = (NodeId)reference.NodeId;
valueToRead.AttributeId = Attributes.NodeClass;
valueToRead.Handle = reference;
valuesToRead.Add(valueToRead);
}
else
{
if (reference.NodeClass != 0)
{
error = true;
Log(
"Unexpected NodeClass when Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, NodeClass = {3}",
node,
node.NodeId,
reference.NodeId,
reference.NodeClass);
continue;
}
}
if ((description.ResultMask & (uint)BrowseResultMask.BrowseName) != 0)
{
valueToRead = new ReadValueId();
valueToRead.NodeId = (NodeId)reference.NodeId;
valueToRead.AttributeId = Attributes.BrowseName;
valueToRead.Handle = reference;
valuesToRead.Add(valueToRead);
}
else
{
if (!QualifiedName.IsNull(reference.BrowseName))
{
error = true;
Log(
"Unexpected BrowseName when Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, BrowseName = {3}",
node,
node.NodeId,
reference.NodeId,
reference.BrowseName);
continue;
}
}
if ((description.ResultMask & (uint)BrowseResultMask.DisplayName) != 0)
{
valueToRead = new ReadValueId();
valueToRead.NodeId = (NodeId)reference.NodeId;
valueToRead.AttributeId = Attributes.DisplayName;
valueToRead.Handle = reference;
valuesToRead.Add(valueToRead);
}
else
{
if (!LocalizedText.IsNullOrEmpty(reference.DisplayName))
{
error = true;
Log(
"Unexpected DisplayName when Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, DisplayName = {3}",
node,
node.NodeId,
reference.NodeId,
reference.DisplayName);
continue;
}
}
}
// halt if errors occured.
if (error)
{
return false;
}
// read values from server.
DataValueCollection results;
DiagnosticInfoCollection diagnosticInfos;
RequestHeader requestHeader = new RequestHeader();
requestHeader.ReturnDiagnostics = 0;
Session.Read(
requestHeader,
0,
TimestampsToReturn.Neither,
valuesToRead,
out results,
out diagnosticInfos);
ClientBase.ValidateResponse(results, valuesToRead);
ClientBase.ValidateDiagnosticInfos(diagnosticInfos, valuesToRead);
// check diagnostics.
if (diagnosticInfos != null && diagnosticInfos.Count > 0)
{
Log("Returned non-empty DiagnosticInfos array when Reading Attributes while Browsing Node '{0}'. NodeId = {1}", node, node.NodeId);
return false;
}
for (int ii = 0; ii < valuesToRead.Count; ii++)
{
if (results[ii].StatusCode != StatusCodes.Good)
{
error = true;
Log(
"Could not read {2} when Browsing Node '{0}'. NodeId = {1}, TargetId = {3}, Status = {4}",
node,
node.NodeId,
Attributes.GetBrowseName(valuesToRead[ii].AttributeId),
valuesToRead[ii].NodeId,
results[ii].StatusCode);
continue;
}
ReferenceDescription reference = (ReferenceDescription)valuesToRead[ii].Handle;
if (valuesToRead[ii].AttributeId == Attributes.NodeId)
{
NodeId expectedId = results[ii].Value as NodeId;
if (expectedId != reference.NodeId)
{
error = true;
Log(
"Incorrect NodeId Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}",
node,
node.NodeId,
reference.NodeId,
expectedId,
reference.NodeId);
}
continue;
}
if (valuesToRead[ii].AttributeId == Attributes.NodeClass)
{
int? expectedClass = results[ii].Value as int?;
if (expectedClass == null || expectedClass.Value != (int)reference.NodeClass)
{
error = true;
Log(
"Incorrect NodeClass Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}",
node,
node.NodeId,
reference.NodeId,
expectedClass,
reference.NodeClass);
}
continue;
}
if (valuesToRead[ii].AttributeId == Attributes.BrowseName)
{
QualifiedName expectedName = results[ii].Value as QualifiedName;
if (expectedName != reference.BrowseName)
{
error = true;
Log(
"Incorrect BrowseName Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}",
node,
node.NodeId,
reference.NodeId,
expectedName,
reference.BrowseName);
}
continue;
}
if (valuesToRead[ii].AttributeId == Attributes.DisplayName)
{
LocalizedText expectedName = results[ii].Value as LocalizedText;
if (expectedName != reference.DisplayName)
{
error = true;
Log(
"Incorrect DisplayName Browsing Node '{0}'. NodeId = {1}, TargetId = {2}, Expected = {3}, Actual = {4}",
node,
node.NodeId,
reference.NodeId,
expectedName,
reference.DisplayName);
}
continue;
}
}
return !error;
}