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;
}