| Index: remoting/base/multiple_array_input_stream.cc
|
| ===================================================================
|
| --- remoting/base/multiple_array_input_stream.cc (revision 0)
|
| +++ remoting/base/multiple_array_input_stream.cc (revision 0)
|
| @@ -0,0 +1,96 @@
|
| +// Copyright (c) 2010 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 <functional>
|
| +
|
| +#include "base/logging.h"
|
| +#include "remoting/base/multiple_array_input_stream.h"
|
| +
|
| +namespace remoting {
|
| +
|
| +MultipleArrayInputStream::MultipleArrayInputStream(int count)
|
| + : buffer_count_(count),
|
| + current_buffer_(0),
|
| + current_buffer_offset_(0),
|
| + position_(0),
|
| + last_returned_size_(0) {
|
| + DCHECK_GT(buffer_count_, 0);
|
| + buffers_.reset(new const uint8*[buffer_count_]);
|
| + buffer_sizes_.reset(new int[buffer_count_]);
|
| +}
|
| +
|
| +MultipleArrayInputStream::~MultipleArrayInputStream() {
|
| +}
|
| +
|
| +bool MultipleArrayInputStream::Next(const void** data, int* size) {
|
| + if (current_buffer_ < buffer_count_) {
|
| + // Also reply with that is remaining in the current buffer.
|
| + last_returned_size_ =
|
| + buffer_sizes_[current_buffer_] - current_buffer_offset_;
|
| + *data = buffers_[current_buffer_] + current_buffer_offset_;
|
| + *size = last_returned_size_;
|
| +
|
| + // After reading the current buffer then advance to the next buffer.
|
| + current_buffer_offset_ = 0;
|
| + ++current_buffer_;
|
| + position_ += last_returned_size_;
|
| + return true;
|
| + }
|
| +
|
| + // We've reached the end of the stream. So reset |last_returned_size_|
|
| + // to zero to prevent any backup request.
|
| + // This is the same as in ArrayInputStream.
|
| + // See google/protobuf/io/zero_copy_stream_impl_lite.cc.
|
| + last_returned_size_ = 0;
|
| + return false;
|
| +}
|
| +
|
| +void MultipleArrayInputStream::BackUp(int count) {
|
| + DCHECK_LE(count, last_returned_size_);
|
| + DCHECK_EQ(0, current_buffer_offset_);
|
| + DCHECK_GT(current_buffer_, 0);
|
| +
|
| + // Rewind one buffer.
|
| + --current_buffer_;
|
| + current_buffer_offset_ = buffer_sizes_[current_buffer_] - count;
|
| + position_ -= count;
|
| + DCHECK_GE(current_buffer_offset_, 0);
|
| + DCHECK_GE(position_, 0);
|
| +}
|
| +
|
| +bool MultipleArrayInputStream::Skip(int count) {
|
| + DCHECK_GE(count, 0);
|
| + last_returned_size_ = 0;
|
| +
|
| + while (count && current_buffer_ < buffer_count_) {
|
| + int read = std::min(
|
| + count,
|
| + buffer_sizes_[current_buffer_] - current_buffer_offset_);
|
| +
|
| + // Advance the current buffer offset and position.
|
| + current_buffer_offset_ += read;
|
| + position_ += read;
|
| + count -= read;
|
| +
|
| + // If the current buffer is fully read, then advance to the next buffer.
|
| + if (current_buffer_offset_ == buffer_sizes_[current_buffer_]) {
|
| + ++current_buffer_;
|
| + current_buffer_offset_ = 0;
|
| + }
|
| + }
|
| + return count == 0;
|
| +}
|
| +
|
| +int64 MultipleArrayInputStream::ByteCount() const {
|
| + return position_;
|
| +}
|
| +
|
| +void MultipleArrayInputStream::SetBuffer(
|
| + int n, const uint8* buffer, int size) {
|
| + CHECK(n < buffer_count_);
|
| + buffers_[n] = buffer;
|
| + buffer_sizes_[n] = size;
|
| +}
|
| +
|
| +} // namespace remoting
|
|
|
| Property changes on: remoting/base/multiple_array_input_stream.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|