public void ModifySubscription(
OperationContext context,
uint subscriptionId,
double requestedPublishingInterval,
uint requestedLifetimeCount,
uint requestedMaxKeepAliveCount,
uint maxNotificationsPerPublish,
byte priority,
out double revisedPublishingInterval,
out uint revisedLifetimeCount,
out uint revisedMaxKeepAliveCount)
{
revisedPublishingInterval = requestedPublishingInterval;
revisedLifetimeCount = requestedLifetimeCount;
revisedMaxKeepAliveCount = requestedMaxKeepAliveCount;
uint publishingIntervalCount = 0;
// find subscription.
Subscription subscription = null;
lock (m_lock)
{
if (!m_subscriptions.TryGetValue(subscriptionId, out subscription))
{
throw new ServiceResultException(StatusCodes.BadSubscriptionIdInvalid);
}
}
double publishingInterval = subscription.PublishingInterval;
// calculate publishing interval.
revisedPublishingInterval = CalculatePublishingInterval(requestedPublishingInterval);
// calculate the keep alive count.
revisedMaxKeepAliveCount = CalculateKeepAliveCount(revisedPublishingInterval, requestedMaxKeepAliveCount);
// calculate the lifetime count.
revisedLifetimeCount = CalculateLifetimeCount(revisedPublishingInterval, revisedMaxKeepAliveCount, requestedLifetimeCount);
// calculate the max notification count.
maxNotificationsPerPublish = CalculateMaxNotificationsPerPublish(maxNotificationsPerPublish);
// update the subscription.
subscription.Modify(
context,
revisedPublishingInterval,
revisedLifetimeCount,
revisedMaxKeepAliveCount,
maxNotificationsPerPublish,
priority);
// get the count for the diagnostics.
publishingIntervalCount = GetPublishingIntervalCount();
lock (m_server.DiagnosticsLock)
{
ServerDiagnosticsSummaryDataType diagnostics = m_server.ServerDiagnostics;
diagnostics.PublishingIntervalCount = publishingIntervalCount;
}
}