• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #include "net/base/io_buffer.h"
6 
7 #include "base/logging.h"
8 
9 namespace net {
10 
IOBuffer()11 IOBuffer::IOBuffer()
12     : data_(NULL) {
13 }
14 
IOBuffer(int buffer_size)15 IOBuffer::IOBuffer(int buffer_size) {
16   DCHECK(buffer_size > 0);
17   data_ = new char[buffer_size];
18 }
19 
IOBuffer(char * data)20 IOBuffer::IOBuffer(char* data)
21     : data_(data) {
22 }
23 
~IOBuffer()24 IOBuffer::~IOBuffer() {
25   delete[] data_;
26   data_ = NULL;
27 }
28 
IOBufferWithSize(int size)29 IOBufferWithSize::IOBufferWithSize(int size)
30     : IOBuffer(size),
31       size_(size) {
32 }
33 
~IOBufferWithSize()34 IOBufferWithSize::~IOBufferWithSize() {
35 }
36 
StringIOBuffer(const std::string & s)37 StringIOBuffer::StringIOBuffer(const std::string& s)
38     : IOBuffer(static_cast<char*>(NULL)),
39       string_data_(s) {
40   data_ = const_cast<char*>(string_data_.data());
41 }
42 
~StringIOBuffer()43 StringIOBuffer::~StringIOBuffer() {
44   // We haven't allocated the buffer, so remove it before the base class
45   // destructor tries to delete[] it.
46   data_ = NULL;
47 }
48 
DrainableIOBuffer(IOBuffer * base,int size)49 DrainableIOBuffer::DrainableIOBuffer(IOBuffer* base, int size)
50     : IOBuffer(base->data()),
51       base_(base),
52       size_(size),
53       used_(0) {
54 }
55 
DidConsume(int bytes)56 void DrainableIOBuffer::DidConsume(int bytes) {
57   SetOffset(used_ + bytes);
58 }
59 
BytesRemaining() const60 int DrainableIOBuffer::BytesRemaining() const {
61   return size_ - used_;
62 }
63 
64 // Returns the number of consumed bytes.
BytesConsumed() const65 int DrainableIOBuffer::BytesConsumed() const {
66   return used_;
67 }
68 
SetOffset(int bytes)69 void DrainableIOBuffer::SetOffset(int bytes) {
70   DCHECK(bytes >= 0 && bytes <= size_);
71   used_ = bytes;
72   data_ = base_->data() + used_;
73 }
74 
~DrainableIOBuffer()75 DrainableIOBuffer::~DrainableIOBuffer() {
76   // The buffer is owned by the |base_| instance.
77   data_ = NULL;
78 }
79 
GrowableIOBuffer()80 GrowableIOBuffer::GrowableIOBuffer()
81     : IOBuffer(),
82       capacity_(0),
83       offset_(0) {
84 }
85 
SetCapacity(int capacity)86 void GrowableIOBuffer::SetCapacity(int capacity) {
87   DCHECK(capacity >= 0);
88   // realloc will crash if it fails.
89   real_data_.reset(static_cast<char*>(realloc(real_data_.release(), capacity)));
90   capacity_ = capacity;
91   if (offset_ > capacity)
92     set_offset(capacity);
93   else
94     set_offset(offset_);  // The pointer may have changed.
95 }
96 
set_offset(int offset)97 void GrowableIOBuffer::set_offset(int offset) {
98   DCHECK(offset >= 0 && offset <= capacity_);
99   offset_ = offset;
100   data_ = real_data_.get() + offset;
101 }
102 
RemainingCapacity()103 int GrowableIOBuffer::RemainingCapacity() {
104   return capacity_ - offset_;
105 }
106 
StartOfBuffer()107 char* GrowableIOBuffer::StartOfBuffer() {
108   return real_data_.get();
109 }
110 
~GrowableIOBuffer()111 GrowableIOBuffer::~GrowableIOBuffer() {
112   data_ = NULL;
113 }
114 
PickledIOBuffer()115 PickledIOBuffer::PickledIOBuffer() : IOBuffer() {}
116 
Done()117 void PickledIOBuffer::Done() {
118   data_ = const_cast<char*>(static_cast<const char*>(pickle_.data()));
119 }
120 
~PickledIOBuffer()121 PickledIOBuffer::~PickledIOBuffer() { data_ = NULL; }
122 
WrappedIOBuffer(const char * data)123 WrappedIOBuffer::WrappedIOBuffer(const char* data)
124     : IOBuffer(const_cast<char*>(data)) {
125 }
126 
~WrappedIOBuffer()127 WrappedIOBuffer::~WrappedIOBuffer() {
128   data_ = NULL;
129 }
130 
131 }  // namespace net
132