Opc.Ua.Server.MasterNodeManager.FetchReferences C# (CSharp) Method

FetchReferences() protected method

Loops until browse is complete for max results reached.
protected FetchReferences ( OperationContext context, bool assignContinuationPoint, ContinuationPoint &cp, ReferenceDescriptionCollection &references ) : ServiceResult
context OperationContext
assignContinuationPoint bool
cp ContinuationPoint
references ReferenceDescriptionCollection
return ServiceResult
        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