// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/pairing/message_buffer.h" #include "net/base/io_buffer.h" namespace pairing_chromeos { MessageBuffer::MessageBuffer() : buffer_offset_(0), total_buffer_size_(0) { } MessageBuffer::~MessageBuffer() {} int MessageBuffer::AvailableBytes() { return total_buffer_size_ - buffer_offset_; } void MessageBuffer::ReadBytes(char* buffer, int size) { CHECK_LE(size, AvailableBytes()); int offset = 0; while (offset < size) { scoped_refptr io_buffer = pending_data_.front().first; int io_buffer_size = pending_data_.front().second; CHECK_GT(io_buffer_size, buffer_offset_); int copy_size = std::min(size - offset, io_buffer_size - buffer_offset_); memcpy(&buffer[offset], &io_buffer->data()[buffer_offset_], copy_size); offset += copy_size; buffer_offset_ += copy_size; CHECK_LE(buffer_offset_, io_buffer_size); if (buffer_offset_ == io_buffer_size) { CHECK_GE(total_buffer_size_, io_buffer_size); total_buffer_size_ -= io_buffer_size; pending_data_.pop_front(); buffer_offset_ = 0; } } CHECK_EQ(offset, size); } void MessageBuffer::AddIOBuffer(scoped_refptr io_buffer, int size) { if (size == 0) return; pending_data_.push_back(std::make_pair(io_buffer, size)); total_buffer_size_ += size; } } // namespace pairing_chromeos