public StatusCode DeleteSubscription(OperationContext context, uint subscriptionId)
{
uint publishingIntervalCount = 0;
int monitoredItemCount = 0;
Subscription subscription = null;
lock (m_lock)
{
// remove from publish queue.
if (m_subscriptions.TryGetValue(subscriptionId, out subscription))
{
NodeId sessionId = subscription.SessionId;
if (!NodeId.IsNull(sessionId))
{
// check that the subscrition is the owner.
if (context != null && !Object.ReferenceEquals(context.Session, subscription.Session))
{
throw new ServiceResultException(StatusCodes.BadSessionIdInvalid);
}
SessionPublishQueue queue = null;
if (m_publishQueues.TryGetValue(sessionId, out queue))
{
queue.Remove(subscription);
}
}
}
// check for abandoned subscription.
if (m_abandonedSubscriptions != null)
{
for (int ii = 0; ii < m_abandonedSubscriptions.Count; ii++)
{
if (m_abandonedSubscriptions[ii].Id == subscriptionId)
{
m_abandonedSubscriptions.RemoveAt(ii);
Utils.Trace("Server: Abandoned Subscription '{0}' Deleted.", subscriptionId);
break;
}
}
}
// remove subscription.
m_subscriptions.Remove(subscriptionId);
}
if (subscription != null)
{
monitoredItemCount = subscription.MonitoredItemCount;
// raise subscription event.
RaiseSubscriptionEvent(subscription, true);
// delete subscription.
subscription.Delete(context);
// get the count for the diagnostics.
publishingIntervalCount = GetPublishingIntervalCount();
lock (m_server.DiagnosticsLock)
{
ServerDiagnosticsSummaryDataType diagnostics = m_server.ServerDiagnostics;
diagnostics.CurrentSubscriptionCount--;
diagnostics.PublishingIntervalCount = publishingIntervalCount;
}
if (context != null && context.Session != null)
{
lock (context.Session.DiagnosticsLock)
{
SessionDiagnosticsDataType diagnostics = context.Session.SessionDiagnostics;
diagnostics.CurrentSubscriptionsCount--;
UpdateCurrentMonitoredItemsCount(diagnostics, -monitoredItemCount);
}
}
return StatusCodes.Good;
}
return StatusCodes.BadSubscriptionIdInvalid;
}