xref: /aosp_15_r20/external/cronet/net/spdy/spdy_buffer.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SPDY_SPDY_BUFFER_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SPDY_SPDY_BUFFER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <cstddef>
9*6777b538SAndroid Build Coastguard Worker #include <memory>
10*6777b538SAndroid Build Coastguard Worker #include <vector>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace spdy {
17*6777b538SAndroid Build Coastguard Worker class SpdySerializedFrame;
18*6777b538SAndroid Build Coastguard Worker }  // namespace spdy
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace net {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker class IOBuffer;
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker // SpdyBuffer is a class to hold data read from or to be written to a
25*6777b538SAndroid Build Coastguard Worker // SPDY connection. It is similar to a DrainableIOBuffer but is not
26*6777b538SAndroid Build Coastguard Worker // ref-counted and will include a way to get notified when Consume()
27*6777b538SAndroid Build Coastguard Worker // is called.
28*6777b538SAndroid Build Coastguard Worker //
29*6777b538SAndroid Build Coastguard Worker // NOTE(akalin): This explicitly does not inherit from IOBuffer to
30*6777b538SAndroid Build Coastguard Worker // avoid the needless ref-counting and to avoid working around the
31*6777b538SAndroid Build Coastguard Worker // fact that IOBuffer member functions are not virtual.
32*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SpdyBuffer {
33*6777b538SAndroid Build Coastguard Worker  public:
34*6777b538SAndroid Build Coastguard Worker   // The source of a call to a ConsumeCallback.
35*6777b538SAndroid Build Coastguard Worker   enum ConsumeSource {
36*6777b538SAndroid Build Coastguard Worker     // Called via a call to Consume().
37*6777b538SAndroid Build Coastguard Worker     CONSUME,
38*6777b538SAndroid Build Coastguard Worker     // Called via the SpdyBuffer being destroyed.
39*6777b538SAndroid Build Coastguard Worker     DISCARD
40*6777b538SAndroid Build Coastguard Worker   };
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   // A Callback that gets called when bytes are consumed with the
43*6777b538SAndroid Build Coastguard Worker   // (non-zero) number of bytes consumed and the source of the
44*6777b538SAndroid Build Coastguard Worker   // consume. May be called any number of times with CONSUME as the
45*6777b538SAndroid Build Coastguard Worker   // source followed by at most one call with DISCARD as the
46*6777b538SAndroid Build Coastguard Worker   // source. The sum of the number of bytes consumed equals the total
47*6777b538SAndroid Build Coastguard Worker   // size of the buffer.
48*6777b538SAndroid Build Coastguard Worker   typedef base::RepeatingCallback<void(size_t, ConsumeSource)> ConsumeCallback;
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   // Construct with the data in the given frame. Assumes that data is
51*6777b538SAndroid Build Coastguard Worker   // owned by |frame| or outlives it.
52*6777b538SAndroid Build Coastguard Worker   explicit SpdyBuffer(std::unique_ptr<spdy::SpdySerializedFrame> frame);
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   // Construct with a copy of the given raw data. |data| must be
55*6777b538SAndroid Build Coastguard Worker   // non-NULL and |size| must be non-zero.
56*6777b538SAndroid Build Coastguard Worker   SpdyBuffer(const char* data, size_t size);
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   SpdyBuffer(const SpdyBuffer&) = delete;
59*6777b538SAndroid Build Coastguard Worker   SpdyBuffer& operator=(const SpdyBuffer&) = delete;
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker   // If there are bytes remaining in the buffer, triggers a call to
62*6777b538SAndroid Build Coastguard Worker   // any consume callbacks with a DISCARD source.
63*6777b538SAndroid Build Coastguard Worker   ~SpdyBuffer();
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   // Returns the remaining (unconsumed) data.
66*6777b538SAndroid Build Coastguard Worker   const char* GetRemainingData() const;
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker   // Returns the number of remaining (unconsumed) bytes.
69*6777b538SAndroid Build Coastguard Worker   size_t GetRemainingSize() const;
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   // Add a callback to be called when bytes are consumed. The
72*6777b538SAndroid Build Coastguard Worker   // ConsumeCallback should not do anything complicated; ideally it
73*6777b538SAndroid Build Coastguard Worker   // should only update a counter. In particular, it must *not* cause
74*6777b538SAndroid Build Coastguard Worker   // the SpdyBuffer itself to be destroyed.
75*6777b538SAndroid Build Coastguard Worker   void AddConsumeCallback(const ConsumeCallback& consume_callback);
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   // Consume the given number of bytes, which must be positive but not
78*6777b538SAndroid Build Coastguard Worker   // greater than GetRemainingSize().
79*6777b538SAndroid Build Coastguard Worker   void Consume(size_t consume_size);
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   // Returns an IOBuffer pointing to the data starting at
82*6777b538SAndroid Build Coastguard Worker   // GetRemainingData(). Use with care; the returned IOBuffer is not
83*6777b538SAndroid Build Coastguard Worker   // updated when Consume() is called. However, it may still be used
84*6777b538SAndroid Build Coastguard Worker   // past the lifetime of this object.
85*6777b538SAndroid Build Coastguard Worker   //
86*6777b538SAndroid Build Coastguard Worker   // This is used with Socket::Write(), which takes an IOBuffer* that
87*6777b538SAndroid Build Coastguard Worker   // may be written to even after the socket itself is destroyed. (See
88*6777b538SAndroid Build Coastguard Worker   // http://crbug.com/249725 .)
89*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBuffer> GetIOBufferForRemainingData();
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker  private:
92*6777b538SAndroid Build Coastguard Worker   void ConsumeHelper(size_t consume_size, ConsumeSource consume_source);
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   // Ref-count the passed-in spdy::SpdySerializedFrame to support the semantics
95*6777b538SAndroid Build Coastguard Worker   // of |GetIOBufferForRemainingData()|.
96*6777b538SAndroid Build Coastguard Worker   typedef base::RefCountedData<std::unique_ptr<spdy::SpdySerializedFrame>>
97*6777b538SAndroid Build Coastguard Worker       SharedFrame;
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker   class SharedFrameIOBuffer;
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   const scoped_refptr<SharedFrame> shared_frame_;
102*6777b538SAndroid Build Coastguard Worker   std::vector<ConsumeCallback> consume_callbacks_;
103*6777b538SAndroid Build Coastguard Worker   size_t offset_ = 0;
104*6777b538SAndroid Build Coastguard Worker };
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker }  // namespace net
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker #endif  // NET_SPDY_SPDY_BUFFER_H_
109