private void IndexWellKnownTypes()
{
SystemContext context = new SystemContext();
context.EncodeableFactory = m_session.MessageContext.Factory;
context.NamespaceUris = m_session.NamespaceUris;
context.ServerUris = m_session.ServerUris;
NodeStateCollection predefinedNodes = new NodeStateCollection();
predefinedNodes.LoadFromBinaryResource(context, "Opc.Ua.Stack.Generated.Opc.Ua.PredefinedNodes.uanodes", typeof(NodeState).Assembly, true);
NodeIdDictionary<BaseTypeState> types = new NodeIdDictionary<BaseTypeState>();
// collect the instance declarations for all types.
for (int ii = 0; ii < predefinedNodes.Count; ii++)
{
BaseTypeState type = predefinedNodes[ii] as BaseTypeState;
if (type != null)
{
types.Add(type.NodeId, type);
}
}
// index only those types which are subtypes of BaseEventType.
foreach (BaseTypeState type in types.Values)
{
BaseTypeState subType = type;
BaseTypeState superType = null;
int eventType = 0;
while (subType != null)
{
if (subType.NodeId == Opc.Ua.ObjectTypeIds.ConditionType || subType.SuperTypeId == Opc.Ua.ObjectTypeIds.ConditionType)
{
eventType = OpcRcw.Ae.Constants.CONDITION_EVENT;
}
else if (subType.NodeId == Opc.Ua.ObjectTypeIds.AuditEventType || subType.SuperTypeId == Opc.Ua.ObjectTypeIds.AuditEventType)
{
eventType = OpcRcw.Ae.Constants.TRACKING_EVENT;
}
else if (subType.NodeId == Opc.Ua.ObjectTypeIds.BaseEventType || subType.SuperTypeId == Opc.Ua.ObjectTypeIds.BaseEventType)
{
eventType = OpcRcw.Ae.Constants.SIMPLE_EVENT;
}
// found an event, collect the attribute and index it.
if (eventType != 0)
{
List<AeEventAttribute> declarations = new List<AeEventAttribute>();
Dictionary<string, AeEventAttribute> map = new Dictionary<string, AeEventAttribute>();
ComAeUtils.CollectInstanceDeclarations(
m_session,
this,
type,
null,
declarations,
map);
AeEventCategory declaration = new AeEventCategory();
declaration.TypeId = type.NodeId;
declaration.SuperTypeId = type.SuperTypeId;
declaration.EventType = eventType;
declaration.Description = (LocalizedText.IsNullOrEmpty(type.DisplayName))?type.BrowseName.Name:type.DisplayName.Text;
declaration.Attributes = declarations;
m_eventTypes[declaration.TypeId] = declaration;
break;
}
// follow the tree to the parent.
if (!types.TryGetValue(subType.SuperTypeId, out superType))
{
break;
}
subType = superType;
}
}
// hide the built in attributes.
AeEventCategory category = GetCategory(Opc.Ua.ObjectTypeIds.BaseEventType);
if (category != null)
{
for (int ii = 0; ii < category.Attributes.Count; ii++)
{
switch (category.Attributes[ii].BrowsePathDisplayText)
{
case Opc.Ua.BrowseNames.Message:
case Opc.Ua.BrowseNames.Severity:
case Opc.Ua.BrowseNames.SourceName:
case Opc.Ua.BrowseNames.Time:
case Opc.Ua.BrowseNames.ReceiveTime:
case Opc.Ua.BrowseNames.LocalTime:
{
category.Attributes[ii].Hidden = true;
break;
}
}
}
}
}