/// <summary>
        /// Return all items in the queue for the given socket, and remove them from the queue.
        /// Return null if there are no enqueued items for this socket.
        /// </summary>
        /// <param name="socket"></param>
        /// <returns></returns>
        public SocketSendParameters[] DequeueAll(Socket socket, Guid currentSlide)
        {
            lock (this) {
                if (m_QueueList.ContainsKey(socket))
                {
                    SocketQueue          sq  = ((SocketQueue)m_QueueList[socket]);
                    ArrayList            l   = new ArrayList();
                    SocketSendParameters ssp = null;
                    while (true)
                    {
                        ssp = sq.Dequeue(currentSlide);
                        if (ssp == null)
                        {
                            break;
                        }
                        l.Add(ssp);
                    }
                    if (l.Count == 0)
                    {
                        return(null);
                    }

                    return((SocketSendParameters[])l.ToArray(typeof(SocketSendParameters)));
                }
            }
            return(null);
        }
 /// <summary>
 /// Get the next item from the queue which is not in the provided exclusion list.
 /// Return null if the queue is empty or if there are no qualifying items.
 /// </summary>
 /// <returns></returns>
 public SocketSendParameters Dequeue(Hashtable exclusionList, Guid currentSlide)
 {
     lock (this) {
         SocketQueue          bestSocketQueue = null;
         SocketSendParameters bestMessage     = null;
         foreach (SocketQueue sq in m_QueueList.Values)
         {
             if (((exclusionList.ContainsKey(sq.Socket)) && (((ReferenceCounter)exclusionList[sq.Socket]).IsZero)) ||
                 (!exclusionList.ContainsKey(sq.Socket)))
             {
                 SocketSendParameters thisSp = sq.Peek(currentSlide);
                 if (thisSp != null)
                 {
                     if (thisSp.CompareTo(bestMessage, currentSlide) < 0)
                     {
                         bestMessage     = thisSp;
                         bestSocketQueue = sq;
                     }
                 }
             }
         }
         if (bestSocketQueue != null)
         {
             //Trace.WriteLine("Dequeue: best message tag: " + bestMessage.Tags.SlideID.ToString() +
             //    "; current slide=" + currentSlide.ToString() +
             //    "; seq number=" + bestMessage.SequenceNumber.ToString(), this.GetType().ToString());
             return(bestSocketQueue.Dequeue(currentSlide));
         }
     }
     return(null);
 }
            public void Enqueue(SocketSendParameters sp)
            {
                lock (this) {
                    LinkedListNode <SocketSendParameters> node = new LinkedListNode <SocketSendParameters>(sp);
                    m_List.AddLast(node);
                    if (!m_SlideQueues.ContainsKey(sp.Tags.SlideID))
                    {
                        m_SlideQueues.Add(sp.Tags.SlideID, new SlideQueue());
                    }

                    ((SlideQueue)m_SlideQueues[sp.Tags.SlideID]).Enqueue(node);
                }
            }
        /// <summary>
        /// Set the SequenceNumber property for the specified item, then enqueue it.
        /// </summary>
        /// <param name="sp"></param>
        public void Enqueue(SocketSendParameters sp)
        {
            lock (this) {
                sp.SequenceNumber = m_NextSequenceNumber;
                m_NextSequenceNumber++;

                if (m_QueueList.ContainsKey(sp.Socket))
                {
                    ((SocketQueue)m_QueueList[sp.Socket]).Enqueue(sp);
                }
                else
                {
                    SocketQueue sq = new SocketQueue(sp.Socket);
                    sq.Enqueue(sp);
                    m_QueueList.Add(sp.Socket, sq);
                }
                //Trace.WriteLine("Enqueue guid=" + sp.Tags.SlideID.ToString() + "; seq =" + sp.SequenceNumber.ToString(), this.GetType().ToString());
            }
        }
            public void Enqueue(SocketSendParameters sp)
            {
                lock (this) {
                    LinkedListNode<SocketSendParameters> node = new LinkedListNode<SocketSendParameters>(sp);
                    m_List.AddLast(node);
                    if (!m_SlideQueues.ContainsKey(sp.Tags.SlideID))
                        m_SlideQueues.Add(sp.Tags.SlideID, new SlideQueue());

                    ((SlideQueue)m_SlideQueues[sp.Tags.SlideID]).Enqueue(node);
                }
            }
        /// <summary>
        /// Set the SequenceNumber property for the specified item, then enqueue it.
        /// </summary>
        /// <param name="sp"></param>
        public void Enqueue(SocketSendParameters sp)
        {
            lock (this) {
                sp.SequenceNumber = m_NextSequenceNumber;
                m_NextSequenceNumber++;

                if (m_QueueList.ContainsKey(sp.Socket)) {
                    ((SocketQueue)m_QueueList[sp.Socket]).Enqueue(sp);
                }
                else {
                    SocketQueue sq = new SocketQueue(sp.Socket);
                    sq.Enqueue(sp);
                    m_QueueList.Add(sp.Socket, sq);
                }
                //Trace.WriteLine("Enqueue guid=" + sp.Tags.SlideID.ToString() + "; seq =" + sp.SequenceNumber.ToString(), this.GetType().ToString());
            }
        }