| #ifndef QUICHE_HTTP2_ADAPTER_WINDOW_MANAGER_H_ | 
 | #define QUICHE_HTTP2_ADAPTER_WINDOW_MANAGER_H_ | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include <functional> | 
 |  | 
 | #include "common/platform/api/quiche_export.h" | 
 |  | 
 | namespace http2 { | 
 | namespace adapter { | 
 |  | 
 | namespace test { | 
 | class WindowManagerPeer; | 
 | } | 
 |  | 
 | // This class keeps track of a HTTP/2 flow control window, notifying a listener | 
 | // when a window update needs to be sent. This class is not thread-safe. | 
 | class QUICHE_EXPORT_PRIVATE WindowManager { | 
 |  public: | 
 |   // A WindowUpdateListener is invoked when it is time to send a window update. | 
 |   typedef std::function<void(size_t)> WindowUpdateListener; | 
 |  | 
 |   WindowManager(size_t window_size_limit, | 
 |                 WindowUpdateListener listener); | 
 |  | 
 |   size_t CurrentWindowSize() const { return window_; } | 
 |   size_t WindowSizeLimit() const { return limit_; } | 
 |  | 
 |   // Called when the window size limit is changed (typically via settings) but | 
 |   // no window update should be sent. | 
 |   void OnWindowSizeLimitChange(size_t new_limit); | 
 |  | 
 |   // Sets the window size limit to |new_limit| and notifies the listener to | 
 |   // update as necessary. | 
 |   void SetWindowSizeLimit(size_t new_limit); | 
 |  | 
 |   // Increments the running total of data bytes buffered. Returns true iff there | 
 |   // is more window remaining. | 
 |   bool MarkDataBuffered(size_t bytes); | 
 |  | 
 |   // Increments the running total of data bytes that have been flushed or | 
 |   // dropped. Invokes the listener if the current window is smaller than some | 
 |   // threshold and there is quota available to send. | 
 |   void MarkDataFlushed(size_t bytes); | 
 |  | 
 |   // Convenience method, used when incoming data is immediately dropped or | 
 |   // ignored. | 
 |   void MarkWindowConsumed(size_t bytes) { | 
 |     MarkDataBuffered(bytes); | 
 |     MarkDataFlushed(bytes); | 
 |   } | 
 |  | 
 |  private: | 
 |   friend class test::WindowManagerPeer; | 
 |  | 
 |   void MaybeNotifyListener(); | 
 |  | 
 |   // The upper bound on the flow control window. The GFE attempts to maintain a | 
 |   // window of this size at the peer as data is proxied through. | 
 |   size_t limit_; | 
 |  | 
 |   // The current flow control window that has not been advertised to the peer | 
 |   // and not yet consumed. The peer can send this many bytes before becoming | 
 |   // blocked. | 
 |   size_t window_; | 
 |  | 
 |   // The amount of data already buffered, which should count against the flow | 
 |   // control window upper bound. | 
 |   size_t buffered_; | 
 |  | 
 |   WindowUpdateListener listener_; | 
 | }; | 
 |  | 
 | }  // namespace adapter | 
 | }  // namespace http2 | 
 |  | 
 | #endif  // QUICHE_HTTP2_ADAPTER_WINDOW_MANAGER_H_ |