Opc.Ua.Com.Server.ComDaBrowseCache.UpdateBrowseElement C# (CSharp) Method

UpdateBrowseElement() private method

Updates the browse element with the children returned in the browse results.
private UpdateBrowseElement ( BrowseElement element, BrowseDescriptionCollection nodesToBrowse, BrowseResultCollection results, int first ) : bool
element BrowseElement The element.
nodesToBrowse BrowseDescriptionCollection The nodes to browse.
results BrowseResultCollection The results.
first int The index of the first browse result associated with the element.
return bool
        private bool UpdateBrowseElement(
            BrowseElement element,
            BrowseDescriptionCollection nodesToBrowse,
            BrowseResultCollection results,
            int first)
        {
            // check for a valid range within the collection.
            if (first < 0 || first >= nodesToBrowse.Count)
            {
                return false;
            }

            bool missingReferences = false;

            // process all references.
            Dictionary<string,ReferenceDescription> referencesByName = new Dictionary<string, ReferenceDescription>();
            Dictionary<string,ReferenceDescription> duplicateNames = new Dictionary<string, ReferenceDescription>();

            for (int ii = first; ii < first+2; ii++)
            {
                BrowseResult result = results[ii];

                // check for errors - rejected node id are fatal; others can be ignored.
                if (StatusCode.IsBad(result.StatusCode))
                {
                    if (result.StatusCode == StatusCodes.BadNodeIdInvalid || result.StatusCode == StatusCodes.BadNodeIdInvalid || result.StatusCode == StatusCodes.BadNodeNotInView)
                    {
                        return false;
                    }

                    missingReferences = true;
                    continue;
                }

                // eliminate duplicates and index references by browse name.
                for (int jj = 0; jj < result.References.Count; jj++)
                {
                    ReferenceDescription reference = result.References[jj];

                    // ignore off server references.
                    if (reference.NodeId == null || reference.NodeId.IsAbsolute)
                    {
                        continue;
                    }

                    // construct the browse name.
                    string browseName = m_mapper.GetLocalBrowseName(reference.BrowseName);

                    if (reference.DisplayName != null)
                    {
                        browseName = reference.DisplayName.Text;
                    }

                    // check for duplicates.
                    ReferenceDescription duplicate = null;

                    if (referencesByName.TryGetValue(browseName, out duplicate))
                    {
                        if (reference.NodeId != duplicate.NodeId)
                        {
                            duplicateNames[browseName] = duplicate;
                        }

                        continue;
                    }

                    // add to table.
                    referencesByName.Add(browseName, reference);
                }
            }

            // remove duplicates.
            foreach (string duplicateName in duplicateNames.Keys)
            {
                referencesByName.Remove(duplicateName);
            }

            // save child lookup table.
            element.ReferencesByName = referencesByName;
            element.MissingReferences = missingReferences;
            
            // update the masks.
            SetElementMasks(element);
            return true;
        }

Same methods

ComDaBrowseCache::UpdateBrowseElement ( ITypeTable typeTree, BrowseElement element, ReadValueIdCollection nodesToRead, DataValueCollection values, NodeClass nodeClass, bool onlyEssentialProperties, int first ) : bool