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
14namespace net {
15
16class 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.
22struct 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