private void AssignSubscriptionToRequest(QueuedSubscription subscription)
{
// find a request.
for (LinkedListNode<QueuedRequest> node = m_queuedRequests.First; node != null; node = node.Next)
{
QueuedRequest request = node.Value;
StatusCode error = StatusCodes.Good;
// check if expired.
if (request.Deadline < DateTime.MaxValue && request.Deadline.AddMilliseconds(500) < DateTime.UtcNow)
{
error = StatusCodes.BadTimeout;
}
// check secure channel.
else if (!m_session.IsSecureChannelValid(request.SecureChannelId))
{
error = StatusCodes.BadSecureChannelIdInvalid;
Utils.Trace("Publish abandoned because the secure channel changed.");
}
if (StatusCode.IsBad(error))
{
// remove request.
LinkedListNode<QueuedRequest> next = node.Next;
m_queuedRequests.Remove(node);
node = next;
// wake up thread with error.
request.Error = error;
request.Set();
if (node == null)
{
break;
}
continue;
}
// remove request.
m_queuedRequests.Remove(node);
// Utils.Trace("PUBLISH: #000 Assigned To Subscription({0}).", subscription.Subscription.Id);
request.Error = StatusCodes.Good;
request.Subscription = subscription;
request.Subscription.Publishing = true;
request.Set();
return;
}
// mark it as available.
subscription.ReadyToPublish = true;
subscription.Timestamp = DateTime.UtcNow;
}
#endregion