// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_SPDY_SPDY_WRITE_QUEUE_H_
#define NET_SPDY_SPDY_WRITE_QUEUE_H_

#include <deque>

#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "net/base/net_export.h"
#include "net/base/request_priority.h"
#include "net/spdy/spdy_protocol.h"

namespace net {

class SpdyBuffer;
class SpdyBufferProducer;
class SpdyStream;

// A queue of SpdyBufferProducers to produce frames to write. Ordered
// by priority, and then FIFO.
class NET_EXPORT_PRIVATE SpdyWriteQueue {
 public:
  SpdyWriteQueue();
  ~SpdyWriteQueue();

  // Returns whether there is anything in the write queue,
  // i.e. whether the next call to Dequeue will return true.
  bool IsEmpty() const;

  // Enqueues the given frame producer of the given type at the given
  // priority associated with the given stream, which may be NULL if
  // the frame producer is not associated with a stream. If |stream|
  // is non-NULL, its priority must be equal to |priority|, and it
  // must remain non-NULL until the write is dequeued or removed.
  void Enqueue(RequestPriority priority,
               SpdyFrameType frame_type,
               scoped_ptr<SpdyBufferProducer> frame_producer,
               const base::WeakPtr<SpdyStream>& stream);

  // Dequeues the frame producer with the highest priority that was
  // enqueued the earliest and its associated stream. Returns true and
  // fills in |frame_type|, |frame_producer|, and |stream| if
  // successful -- otherwise, just returns false.
  bool Dequeue(SpdyFrameType* frame_type,
               scoped_ptr<SpdyBufferProducer>* frame_producer,
               base::WeakPtr<SpdyStream>* stream);

  // Removes all pending writes for the given stream, which must be
  // non-NULL.
  void RemovePendingWritesForStream(const base::WeakPtr<SpdyStream>& stream);

  // Removes all pending writes for streams after |last_good_stream_id|
  // and streams with no stream id.
  void RemovePendingWritesForStreamsAfter(SpdyStreamId last_good_stream_id);

  // Removes all pending writes.
  void Clear();

 private:
  // A struct holding a frame producer and its associated stream.
  struct PendingWrite {
    SpdyFrameType frame_type;
    // This has to be a raw pointer since we store this in an STL
    // container.
    SpdyBufferProducer* frame_producer;
    base::WeakPtr<SpdyStream> stream;
    // Whether |stream| was non-NULL when enqueued.
    bool has_stream;

    PendingWrite();
    PendingWrite(SpdyFrameType frame_type,
                 SpdyBufferProducer* frame_producer,
                 const base::WeakPtr<SpdyStream>& stream);
    ~PendingWrite();
  };

  // The actual write queue, binned by priority.
  std::deque<PendingWrite> queue_[NUM_PRIORITIES];

  DISALLOW_COPY_AND_ASSIGN(SpdyWriteQueue);
};

}  // namespace net

#endif  // NET_SPDY_SPDY_WRITE_QUEUE_H_
