public NotificationMessage Publish(
OperationContext context,
SubscriptionAcknowledgementCollection subscriptionAcknowledgements,
AsyncPublishOperation operation,
out uint subscriptionId,
out UInt32Collection availableSequenceNumbers,
out bool moreNotifications,
out StatusCodeCollection acknowledgeResults,
out DiagnosticInfoCollection acknowledgeDiagnosticInfos)
{
availableSequenceNumbers = null;
moreNotifications = false;
// get publish queue for session.
SessionPublishQueue queue = null;
lock (m_lock)
{
if (!m_publishQueues.TryGetValue(context.Session.Id, out queue))
{
if (m_subscriptions.Count == 0)
{
throw new ServiceResultException(StatusCodes.BadNoSubscription);
}
throw new ServiceResultException(StatusCodes.BadSessionClosed);
}
}
// acknowlege previous messages.
queue.Acknowledge(
context,
subscriptionAcknowledgements,
out acknowledgeResults,
out acknowledgeDiagnosticInfos);
// update diagnostics.
if (context.Session != null)
{
lock (context.Session.DiagnosticsLock)
{
SessionDiagnosticsDataType diagnostics = context.Session.SessionDiagnostics;
diagnostics.CurrentPublishRequestsInQueue++;
}
}
// save results for asynchrounous operation.
if (operation != null)
{
operation.Response.Results = acknowledgeResults;
operation.Response.DiagnosticInfos = acknowledgeDiagnosticInfos;
}
// gets the next message that is ready to publish.
NotificationMessage message = GetNextMessage(
context,
queue,
operation,
out subscriptionId,
out availableSequenceNumbers,
out moreNotifications);
// if no message and no async operation then a timeout occurred.
if (message == null && operation == null)
{
throw new ServiceResultException(StatusCodes.BadTimeout);
}
// return message.
return message;
}