Home | History | Annotate | Download | only in spdy
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_SPDY_SPDY_PINNABLE_BUFFER_PIECE_H_
      6 #define NET_SPDY_SPDY_PINNABLE_BUFFER_PIECE_H_
      7 
      8 #include <memory>
      9 
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/strings/string_piece.h"
     12 #include "net/base/net_export.h"
     13 
     14 namespace net {
     15 
     16 class SpdyPrefixedBufferReader;
     17 
     18 // Helper class of SpdyPrefixedBufferReader.
     19 // Represents a piece of consumed buffer which may (or may not) own its
     20 // underlying storage. Users may "pin" the buffer at a later time to ensure
     21 // a SpdyPinnableBufferPiece owns and retains storage of the buffer.
     22 struct NET_EXPORT_PRIVATE SpdyPinnableBufferPiece {
     23  public:
     24   SpdyPinnableBufferPiece();
     25   ~SpdyPinnableBufferPiece();
     26 
     27   const char * buffer() const {
     28     return buffer_;
     29   }
     30 
     31   size_t length() const {
     32     return length_;
     33   }
     34 
     35   operator base::StringPiece() const {
     36     return base::StringPiece(buffer_, length_);
     37   }
     38 
     39   // Allocates and copies the buffer to internal storage.
     40   void Pin();
     41 
     42   bool IsPinned() const {
     43     return storage_.get() != NULL;
     44   }
     45 
     46   // Swaps buffers, including internal storage, with |other|.
     47   void Swap(SpdyPinnableBufferPiece* other);
     48 
     49  private:
     50   friend class SpdyPrefixedBufferReader;
     51 
     52   const char * buffer_;
     53   size_t length_;
     54   // Null iff |buffer_| isn't pinned.
     55   scoped_ptr<char[]> storage_;
     56 };
     57 
     58 }  // namespace net
     59 
     60 #endif  // NET_SPDY_SPDY_PINNABLE_BUFFER_PIECE_H_
     61