1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/io_buffer.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIOBuffer::IOBuffer()
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : data_(NULL) {
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottIOBuffer::IOBuffer(int buffer_size) {
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(buffer_size > 0);
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  data_ = new char[buffer_size];
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIOBuffer::IOBuffer(char* data)
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : data_(data) {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIOBuffer::~IOBuffer() {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete[] data_;
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  data_ = NULL;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIOBufferWithSize::IOBufferWithSize(int size)
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : IOBuffer(size),
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      size_(size) {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIOBufferWithSize::~IOBufferWithSize() {
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochStringIOBuffer::StringIOBuffer(const std::string& s)
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : IOBuffer(static_cast<char*>(NULL)),
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      string_data_(s) {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data_ = const_cast<char*>(string_data_.data());
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochStringIOBuffer::~StringIOBuffer() {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We haven't allocated the buffer, so remove it before the base class
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // destructor tries to delete[] it.
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data_ = NULL;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDrainableIOBuffer::DrainableIOBuffer(IOBuffer* base, int size)
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : IOBuffer(base->data()),
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      base_(base),
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      size_(size),
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      used_(0) {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DrainableIOBuffer::DidConsume(int bytes) {
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetOffset(used_ + bytes);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DrainableIOBuffer::BytesRemaining() const {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return size_ - used_;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the number of consumed bytes.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DrainableIOBuffer::BytesConsumed() const {
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return used_;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DrainableIOBuffer::SetOffset(int bytes) {
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(bytes >= 0 && bytes <= size_);
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  used_ = bytes;
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  data_ = base_->data() + used_;
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDrainableIOBuffer::~DrainableIOBuffer() {
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The buffer is owned by the |base_| instance.
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  data_ = NULL;
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGrowableIOBuffer::GrowableIOBuffer()
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : IOBuffer(),
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      capacity_(0),
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      offset_(0) {
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid GrowableIOBuffer::SetCapacity(int capacity) {
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(capacity >= 0);
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // realloc will crash if it fails.
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  real_data_.reset(static_cast<char*>(realloc(real_data_.release(), capacity)));
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  capacity_ = capacity;
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (offset_ > capacity)
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    set_offset(capacity);
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  else
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    set_offset(offset_);  // The pointer may have changed.
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid GrowableIOBuffer::set_offset(int offset) {
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK(offset >= 0 && offset <= capacity_);
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  offset_ = offset;
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  data_ = real_data_.get() + offset;
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint GrowableIOBuffer::RemainingCapacity() {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return capacity_ - offset_;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochchar* GrowableIOBuffer::StartOfBuffer() {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return real_data_.get();
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenGrowableIOBuffer::~GrowableIOBuffer() {
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  data_ = NULL;
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPickledIOBuffer::PickledIOBuffer() : IOBuffer() {}
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PickledIOBuffer::Done() {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data_ = const_cast<char*>(static_cast<const char*>(pickle_.data()));
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPickledIOBuffer::~PickledIOBuffer() { data_ = NULL; }
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWrappedIOBuffer::WrappedIOBuffer(const char* data)
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : IOBuffer(const_cast<char*>(data)) {
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWrappedIOBuffer::~WrappedIOBuffer() {
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data_ = NULL;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
132