private bool Browse(
List<Node> nodes,
BrowseDescriptionCollection nodesToBrowse,
List<ReferenceDescriptionCollection> references)
{
BrowseResultCollection results;
DiagnosticInfoCollection diagnosticInfos;
RequestHeader requestHeader = new RequestHeader();
requestHeader.ReturnDiagnostics = 0;
Session.Browse(
requestHeader,
m_view,
m_maxReferencesPerNode,
nodesToBrowse,
out results,
out diagnosticInfos);
ClientBase.ValidateResponse(results, nodesToBrowse);
ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToBrowse);
// check diagnostics.
if (diagnosticInfos != null && diagnosticInfos.Count > 0)
{
Log("Returned non-empty DiagnosticInfos array during Browse.");
return false;
}
List<Node> originalNodes = nodes;
BrowseDescriptionCollection originalNodesToBrowse = nodesToBrowse;
List<ReferenceDescriptionCollection> originalReferences = references;
List<Node> remainingNodes = new List<Node>();
BrowseDescriptionCollection remainingNodesToBrowse = new BrowseDescriptionCollection();
List<ReferenceDescriptionCollection> remainingReferences = new List<ReferenceDescriptionCollection>();
ByteStringCollection continuationPoints = new ByteStringCollection();
// process results.
for (int ii = 0; ii < results.Count; ii++)
{
// check status code.
if (StatusCode.IsBad(results[ii].StatusCode))
{
Log(
"HierarchicalBrowseTest Failed for Node '{0}'. Status = {2}, NodeId = {1}",
nodes[ii],
nodes[ii].NodeId,
results[ii].StatusCode);
return false;
}
// check max references.
if (m_maxReferencesPerNode > 0 && m_maxReferencesPerNode < results[ii].References.Count)
{
Log(
"Too many references returned for Node '{0}'. NodeId = {1}, Expected = {2}, Actual = {3}",
nodes[ii],
nodes[ii].NodeId,
m_maxReferencesPerNode,
results[ii].References.Count);
return false;
}
// verify references returned.
if (!VerifyReferences(nodes[ii], nodesToBrowse[ii], results[ii].References))
{
return false;
}
// save references.
references[ii].AddRange(results[ii].References);
if (results[ii].ContinuationPoint != null)
{
// check max references.
if (results[ii].References.Count == 0)
{
Log(
"No references returned with a continuation point for Node '{0}'. NodeId = {1}, Expected = {2}",
nodes[ii],
nodes[ii].NodeId,
m_maxReferencesPerNode);
return false;
}
// add to list to rebrowse.
remainingNodes.Add(nodes[ii]);
remainingNodesToBrowse.Add(nodesToBrowse[ii]);
remainingReferences.Add(references[ii]);
continuationPoints.Add(results[ii].ContinuationPoint);
}
}
// process continuation points.
while (continuationPoints.Count > 0)
{
requestHeader = new RequestHeader();
requestHeader.ReturnDiagnostics = 0;
Session.BrowseNext(
requestHeader,
false,
continuationPoints,
out results,
out diagnosticInfos);
ClientBase.ValidateResponse(results, continuationPoints);
ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints);
// check diagnostics.
if (diagnosticInfos != null && diagnosticInfos.Count > 0)
{
Log("Returned non-empty DiagnosticInfos array during BrowseNext.");
return false;
}
nodes = remainingNodes;
nodesToBrowse = remainingNodesToBrowse;
references = remainingReferences;
// process results.
remainingNodes = new List<Node>();
remainingNodesToBrowse = new BrowseDescriptionCollection();
remainingReferences = new List<ReferenceDescriptionCollection>();
continuationPoints = new ByteStringCollection();
for (int ii = 0; ii < results.Count; ii++)
{
// check status code.
if (StatusCode.IsBad(results[ii].StatusCode))
{
Log(
"BrowseNext Failed for Node '{0}'. Status = {2}, NodeId = {1}",
nodes[ii],
nodes[ii].NodeId,
results[ii].StatusCode);
return false;
}
// check max references.
if (m_maxReferencesPerNode > 0 && m_maxReferencesPerNode < results[ii].References.Count)
{
Log(
"Too many references returned for Node '{0}'. NodeId = {1}, Expected = {2}, Actual = {3}",
nodes[ii],
nodes[ii].NodeId,
m_maxReferencesPerNode,
results[ii].References.Count);
return false;
}
// verify references returned.
if (!VerifyReferences(nodes[ii], nodesToBrowse[ii], results[ii].References))
{
return false;
}
// save references.
references[ii].AddRange(results[ii].References);
if (results[ii].ContinuationPoint != null)
{
// check max references.
if (results[ii].References.Count == 0)
{
Log(
"No references returned with a continuation point for Node '{0}'. NodeId = {1}, Expected = {2}",
nodes[ii],
nodes[ii].NodeId,
m_maxReferencesPerNode);
return false;
}
// add to list to rebrowse.
remainingNodes.Add(nodes[ii]);
remainingNodesToBrowse.Add(nodesToBrowse[ii]);
remainingReferences.Add(references[ii]);
continuationPoints.Add(results[ii].ContinuationPoint);
}
}
}
// verify filters.
for (int ii = 0; ii < originalNodes.Count; ii++)
{
if (!VerifyFilterResults(originalNodes[ii], originalNodesToBrowse[ii], originalReferences[ii]))
{
return false;
}
}
return true;
}