public void SetDiagnosticsEnabled(ServerSystemContext context, bool enabled)
{
List<NodeState> nodesToDelete = new List<NodeState>();
lock (Lock)
{
if (enabled == m_diagnosticsEnabled)
{
return;
}
m_diagnosticsEnabled = enabled;
if (!enabled)
{
// stop scans.
if (m_diagnosticsScanTimer != null)
{
m_diagnosticsScanTimer.Dispose();
m_diagnosticsScanTimer = null;
}
if (m_sessions != null)
{
for (int ii = 0; ii < m_sessions.Count; ii++)
{
nodesToDelete.Add(m_sessions[ii].Summary);
}
m_sessions.Clear();
}
if (m_subscriptions != null)
{
for (int ii = 0; ii < m_subscriptions.Count; ii++)
{
nodesToDelete.Add(m_sessions[ii].Value.Variable);
}
m_subscriptions.Clear();
}
// set error for main diagnostics node.
if (m_serverDiagnostics != null)
{
m_serverDiagnostics.Value = null;
m_serverDiagnostics.Error = StatusCodes.BadOutOfService;
m_serverDiagnostics.Timestamp = DateTime.UtcNow;
}
// get the node.
ServerDiagnosticsState diagnosticsNode = (ServerDiagnosticsState)FindPredefinedNode(
ObjectIds.Server_ServerDiagnostics,
typeof(ServerDiagnosticsState));
// clear arrays.
if (diagnosticsNode != null)
{
if (diagnosticsNode.SamplingIntervalDiagnosticsArray != null)
{
diagnosticsNode.SamplingIntervalDiagnosticsArray.Value = null;
diagnosticsNode.SamplingIntervalDiagnosticsArray.StatusCode = StatusCodes.BadOutOfService;
diagnosticsNode.SamplingIntervalDiagnosticsArray.Timestamp = DateTime.UtcNow;
}
if (diagnosticsNode.SubscriptionDiagnosticsArray != null)
{
diagnosticsNode.SubscriptionDiagnosticsArray.Value = null;
diagnosticsNode.SubscriptionDiagnosticsArray.StatusCode = StatusCodes.BadOutOfService;
diagnosticsNode.SubscriptionDiagnosticsArray.Timestamp = DateTime.UtcNow;
}
if (diagnosticsNode.SessionsDiagnosticsSummary != null)
{
diagnosticsNode.SessionsDiagnosticsSummary.SessionDiagnosticsArray.Value = null;
diagnosticsNode.SessionsDiagnosticsSummary.SessionDiagnosticsArray.StatusCode = StatusCodes.BadOutOfService;
diagnosticsNode.SessionsDiagnosticsSummary.SessionDiagnosticsArray.Timestamp = DateTime.UtcNow;
}
if (diagnosticsNode.SessionsDiagnosticsSummary != null)
{
diagnosticsNode.SessionsDiagnosticsSummary.SessionSecurityDiagnosticsArray.Value = null;
diagnosticsNode.SessionsDiagnosticsSummary.SessionSecurityDiagnosticsArray.StatusCode = StatusCodes.BadOutOfService;
diagnosticsNode.SessionsDiagnosticsSummary.SessionSecurityDiagnosticsArray.Timestamp = DateTime.UtcNow;
}
}
}
}
for (int ii = 0; ii < nodesToDelete.Count; ii++)
{
DeleteNode(context, nodesToDelete[ii].NodeId);
}
}