summaryrefslogtreecommitdiffstats
path: root/components/pairing/message_buffer.cc
blob: 3cfe95ddac2a74b0f52d4d0615e5f55d45513428 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 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<net::IOBuffer> 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<net::IOBuffer> 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