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