Project import generated by Copybara.

PiperOrigin-RevId: 237361882
Change-Id: I109a68f44db867b20f8c6a7732b0ce657133e52a
diff --git a/quic/core/uber_quic_stream_id_manager.h b/quic/core/uber_quic_stream_id_manager.h
new file mode 100644
index 0000000..bf5a588
--- /dev/null
+++ b/quic/core/uber_quic_stream_id_manager.h
@@ -0,0 +1,100 @@
+// Copyright (c) 2018 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 QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_
+#define QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_
+
+#include "net/third_party/quiche/src/quic/core/quic_stream_id_manager.h"
+
+namespace quic {
+
+namespace test {
+class QuicSessionPeer;
+}  // namespace test
+
+class QuicSession;
+
+// This class comprises two QuicStreamIdManagers, which manage bidirectional and
+// unidirectional stream IDs, respectively.
+class QUIC_EXPORT_PRIVATE UberQuicStreamIdManager {
+ public:
+  UberQuicStreamIdManager(QuicSession* session,
+                          size_t max_open_outgoing_streams,
+                          size_t max_open_incoming_streams);
+
+  // Called when a stream with |stream_id| is registered as a static stream.
+  void RegisterStaticStream(QuicStreamId id);
+
+  // Initialize the maximum allowed outgoing stream id, number of streams, and
+  // MAX_STREAM_ID advertisement window.
+  void SetMaxOpenOutgoingStreams(size_t max_streams);
+
+  // Initialize the maximum allowed incoming stream id and number of streams.
+  void SetMaxOpenIncomingStreams(size_t max_streams);
+
+  // Returns true if next outgoing bidirectional stream ID can be allocated.
+  bool CanOpenNextOutgoingBidirectionalStream();
+
+  // Returns true if next outgoing unidirectional stream ID can be allocated.
+  bool CanOpenNextOutgoingUnidirectionalStream();
+
+  // Returns the next outgoing bidirectional stream id.
+  QuicStreamId GetNextOutgoingBidirectionalStreamId();
+
+  // Returns the next outgoing unidirectional stream id.
+  QuicStreamId GetNextOutgoingUnidirectionalStreamId();
+
+  // Returns true if allow to open the incoming |id|.
+  bool MaybeIncreaseLargestPeerStreamId(QuicStreamId id);
+
+  // Called when |id| is released.
+  void OnStreamClosed(QuicStreamId id);
+
+  // Called when a MAX_STREAM_ID frame is received.
+  bool OnMaxStreamIdFrame(const QuicMaxStreamIdFrame& frame);
+
+  // Called when a STREAM_ID_BLOCKED frame is received.
+  bool OnStreamIdBlockedFrame(const QuicStreamIdBlockedFrame& frame);
+
+  // Return true if |id| is peer initiated.
+  bool IsIncomingStream(QuicStreamId id) const;
+
+  // Returns true if |id| is still available.
+  bool IsAvailableStream(QuicStreamId id) const;
+
+  size_t GetMaxAllowdIncomingBidirectionalStreams() const;
+
+  size_t GetMaxAllowdIncomingUnidirectionalStreams() const;
+
+  void SetLargestPeerCreatedStreamId(
+      QuicStreamId largest_peer_created_stream_id);
+
+  QuicStreamId next_outgoing_bidirectional_stream_id() const;
+  QuicStreamId next_outgoing_unidirectional_stream_id() const;
+
+  QuicStreamId max_allowed_outgoing_bidirectional_stream_id() const;
+  QuicStreamId max_allowed_outgoing_unidirectional_stream_id() const;
+
+  size_t max_allowed_outgoing_bidirectional_streams() const;
+  size_t max_allowed_outgoing_unidirectional_streams() const;
+
+  QuicStreamId actual_max_allowed_incoming_bidirectional_stream_id() const;
+  QuicStreamId actual_max_allowed_incoming_unidirectional_stream_id() const;
+
+  QuicStreamId advertised_max_allowed_incoming_bidirectional_stream_id() const;
+  QuicStreamId advertised_max_allowed_incoming_unidirectional_stream_id() const;
+
+ private:
+  friend class test::QuicSessionPeer;
+
+  // Manages stream IDs of bidirectional streams.
+  QuicStreamIdManager bidirectional_stream_id_manager_;
+
+  // Manages stream IDs of unidirectional streams.
+  QuicStreamIdManager unidirectional_stream_id_manager_;
+};
+
+}  // namespace quic
+
+#endif  // QUICHE_QUIC_CORE_UBER_QUIC_STREAM_ID_MANAGER_H_