protected virtual bool Browse(
Node node,
BrowseDescription nodeToBrowse,
ReferenceDescriptionCollection references)
{
BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection();
nodesToBrowse.Add(nodeToBrowse);
BrowseResultCollection results;
DiagnosticInfoCollection diagnosticInfos;
RequestHeader requestHeader = new RequestHeader();
requestHeader.ReturnDiagnostics = 0;
Session.Browse(
requestHeader,
new ViewDescription(),
0,
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;
}
// process results.
ByteStringCollection continuationPoints = new ByteStringCollection();
for (int ii = 0; ii < results.Count; ii++)
{
// check status code.
if (StatusCode.IsBad(results[ii].StatusCode))
{
Log(
"Browse Failed for Node '{0}'. Status = {2}, NodeId = {1}",
node,
node.NodeId,
results[ii].StatusCode);
return false;
}
// save references.
references.AddRange(results[ii].References);
if (results[ii].ContinuationPoint != null)
{
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;
}
continuationPoints.Clear();
// process results.
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}",
node,
node.NodeId,
results[ii].StatusCode);
return false;
}
// save references.
references.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}",
node,
node.NodeId);
return false;
}
continuationPoints.Add(results[ii].ContinuationPoint);
}
}
}
return true;
}