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