private void IndexTypesFromServer(NodeId baseTypeId, int eventType)
{
// check if event type needs to be revised.
if (baseTypeId == Opc.Ua.ObjectTypeIds.ConditionType)
{
eventType = OpcRcw.Ae.Constants.CONDITION_EVENT;
}
else if (baseTypeId == Opc.Ua.ObjectTypeIds.AuditEventType)
{
eventType = OpcRcw.Ae.Constants.TRACKING_EVENT;
}
else if (baseTypeId == Opc.Ua.ObjectTypeIds.BaseEventType)
{
eventType = OpcRcw.Ae.Constants.SIMPLE_EVENT;
}
// browse for subtypes.
BrowseDescription nodeToBrowse = new BrowseDescription();
nodeToBrowse.NodeId = baseTypeId;
nodeToBrowse.BrowseDirection = BrowseDirection.Forward;
nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasSubtype;
nodeToBrowse.IncludeSubtypes = false;
nodeToBrowse.NodeClassMask = (uint)NodeClass.ObjectType;
nodeToBrowse.ResultMask = (uint)(BrowseResultMask.BrowseName | BrowseResultMask.DisplayName | BrowseResultMask.NodeClass);
ReferenceDescriptionCollection references = ComAeUtils.Browse(
m_session,
nodeToBrowse,
false);
for (int ii = 0; ii < references.Count; ii++)
{
// these types have t
if (references[ii].NodeId.IsAbsolute)
{
continue;
}
NodeId typeId = (NodeId)references[ii].NodeId;
if (!m_eventTypes.ContainsKey(typeId))
{
// collection the instances declared by the type.
List<AeEventAttribute> declarations = new List<AeEventAttribute>();
Dictionary<string, AeEventAttribute> map = new Dictionary<string, AeEventAttribute>();
ComAeUtils.CollectInstanceDeclarations(
m_session,
this,
(NodeId)references[ii].NodeId,
null,
declarations,
map);
AeEventCategory declaration = new AeEventCategory();
declaration.TypeId = (NodeId)references[ii].NodeId;
declaration.SuperTypeId = baseTypeId;
declaration.EventType = eventType;
declaration.Description = (LocalizedText.IsNullOrEmpty(references[ii].DisplayName)) ? references[ii].BrowseName.Name : references[ii].DisplayName.Text;
declaration.Attributes = declarations;
m_eventTypes[declaration.TypeId] = declaration;
}
// recursively look for subtypes.
IndexTypesFromServer(typeId, eventType);
}
}