public void ConditionRefresh()
{
ServerSystemContext systemContext = m_server.DefaultSystemContext.Copy(m_session);
List<IEventMonitoredItem> monitoredItems = new List<IEventMonitoredItem>();
lock (m_lock)
{
// generate start event.
RefreshStartEventState e = new RefreshStartEventState(null);
TranslationInfo message = new TranslationInfo(
"RefreshStartEvent",
"en-US",
"Condition refresh started for subscription {0}.",
m_id);
e.Initialize(
systemContext,
null,
EventSeverity.Low,
new LocalizedText(message));
e.SetChildValue(systemContext, BrowseNames.SourceNode, m_diagnosticsId, false);
e.SetChildValue(systemContext, BrowseNames.SourceName, Utils.Format("Subscription/{0}", m_id), false);
e.SetChildValue(systemContext, BrowseNames.ReceiveTime, DateTime.UtcNow, false);
// build list of items to refresh.
foreach (LinkedListNode<IMonitoredItem> monitoredItem in m_monitoredItems.Values)
{
MonitoredItem eventMonitoredItem = monitoredItem.Value as MonitoredItem;
if (eventMonitoredItem.EventFilter != null)
{
// queue start refresh event.
eventMonitoredItem.QueueEvent(e, true);
// add to list that gets reported to the NodeManagers.
monitoredItems.Add(eventMonitoredItem);
}
}
// nothing to do if no event subscriptions.
if (monitoredItems.Count == 0)
{
return;
}
}
// tell the NodeManagers to report the current state of the conditions.
try
{
m_refreshInProgress = true;
OperationContext operationContext = new OperationContext(m_session, DiagnosticsMasks.None);
m_server.NodeManager.ConditionRefresh(operationContext, monitoredItems);
}
finally
{
m_refreshInProgress = false;
}
lock (m_lock)
{
// generate start event.
RefreshEndEventState e = new RefreshEndEventState(null);
TranslationInfo message = new TranslationInfo(
"RefreshEndEvent",
"en-US",
"Condition refresh completed for subscription {0}.",
m_id);
e.Initialize(
systemContext,
null,
EventSeverity.Low,
new LocalizedText(message));
e.SetChildValue(systemContext, BrowseNames.SourceNode, m_diagnosticsId, false);
e.SetChildValue(systemContext, BrowseNames.SourceName, Utils.Format("Subscription/{0}", m_id), false);
e.SetChildValue(systemContext, BrowseNames.ReceiveTime, DateTime.UtcNow, false);
// send refresh end event.
for (int ii = 0; ii < monitoredItems.Count; ii++)
{
MonitoredItem monitoredItem = monitoredItems[ii] as MonitoredItem;
if (monitoredItem.EventFilter != null)
{
monitoredItem.QueueEvent(e, true);
}
}
// TraceState("CONDITION REFRESH");
}
}