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