protected ServiceResult FetchReferences(
OperationContext context,
bool assignContinuationPoint,
ref ContinuationPoint cp,
ref ReferenceDescriptionCollection references)
{
Debug.Assert(context != null);
Debug.Assert(cp != null);
Debug.Assert(references != null);
INodeManager nodeManager = cp.Manager;
NodeClass nodeClassMask = (NodeClass)cp.NodeClassMask;
BrowseResultMask resultMask = cp.ResultMask;
// loop until browse is complete or max results.
while (cp != null)
{
// fetch next batch.
nodeManager.Browse(context, ref cp, references);
ReferenceDescriptionCollection referencesToKeep = new ReferenceDescriptionCollection(references.Count);
// check for incomplete reference descriptions.
for (int ii = 0; ii < references.Count; ii++)
{
ReferenceDescription reference = references[ii];
// check if filtering must be applied.
if (reference.Unfiltered)
{
// ignore unknown external references.
if (reference.NodeId.IsAbsolute)
{
continue;
}
// update the description.
bool include = UpdateReferenceDescription(
context,
(NodeId)reference.NodeId,
nodeClassMask,
resultMask,
reference);
if (!include)
{
continue;
}
}
// add to list.
referencesToKeep.Add(reference);
}
// replace list.
references = referencesToKeep;
// check if browse limit reached.
if (cp != null && references.Count >= cp.MaxResultsToReturn)
{
if (!assignContinuationPoint)
{
return StatusCodes.BadNoContinuationPoints;
}
cp.Id = Guid.NewGuid();
context.Session.SaveContinuationPoint(cp);
break;
}
}
// all is good.
return ServiceResult.Good;
}
#endregion