protected override ServiceResult SubscribeToEvents(
ServerSystemContext context,
NodeState source,
IEventMonitoredItem monitoredItem,
bool unsubscribe)
{
ComAeClientManager system = (ComAeClientManager)this.SystemContext.SystemHandle;
ComAeClient client = (ComAeClient)system.SelectClient(context, false);
// need to wait until the cache is refreshed for the first time.
if (!WaitForTypeCache())
{
return StatusCodes.BadOutOfService;
}
lock (Lock)
{
SubscriptionIndex index = new SubscriptionIndex();
index.NodeId = source.NodeId;
index.LocaleId = client.LocaleId;
if (unsubscribe)
{
ComAeSubscriptionClient subscription = null;
if (!m_monitoredItems.TryGetValue(monitoredItem.Id, out subscription))
{
return ServiceResult.Good;
}
m_monitoredItems.Remove(monitoredItem.Id);
// Utils.Trace("REMOVED ITEM {0}", monitoredItem.Id);
if (subscription.RemoveItem(monitoredItem as MonitoredItem) == 0)
{
subscription.Delete();
m_subscriptions.Remove(index);
// Utils.Trace("DELETED SUBSCRIPTION {0}", index.NodeId);
}
}
else
{
ComAeSubscriptionClient subscription = null;
if (!m_subscriptions.TryGetValue(index, out subscription))
{
subscription = new ComAeSubscriptionClient(context, m_configuration, m_typeCache, NamespaceIndex, system, monitoredItem as MonitoredItem);
m_subscriptions.Add(index, subscription);
subscription.Create();
// Utils.Trace("ADDED NEW SUBSCRIPTION {0}", index.NodeId);
}
else
{
subscription.AddItem(monitoredItem as MonitoredItem);
}
m_monitoredItems[monitoredItem.Id] = subscription;
// Utils.Trace("ADDED NEW ITEM {0}", monitoredItem.Id);
}
}
// all done.
return ServiceResult.Good;
}