Opc.Ua.Server.SessionPublishQueue.AssignSubscriptionToRequest C# (CSharp) Method

AssignSubscriptionToRequest() private method

Checks the state of the subscriptions.
private AssignSubscriptionToRequest ( QueuedSubscription subscription ) : void
subscription QueuedSubscription
return void
        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