Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / components / pairing / message_buffer.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/pairing/message_buffer.h"
6
7 #include "net/base/io_buffer.h"
8
9 namespace pairing_chromeos {
10
11 MessageBuffer::MessageBuffer()
12     : buffer_offset_(0),
13       total_buffer_size_(0) {
14 }
15
16 MessageBuffer::~MessageBuffer() {}
17
18 int MessageBuffer::AvailableBytes() {
19   return total_buffer_size_ - buffer_offset_;
20 }
21
22 void MessageBuffer::ReadBytes(char* buffer, int size) {
23   CHECK_LE(size, AvailableBytes());
24
25   int offset = 0;
26   while (offset < size) {
27     scoped_refptr<net::IOBuffer> io_buffer = pending_data_.front().first;
28     int io_buffer_size = pending_data_.front().second;
29
30     CHECK_GT(io_buffer_size, buffer_offset_);
31     int copy_size = std::min(size - offset, io_buffer_size - buffer_offset_);
32     memcpy(&buffer[offset], &io_buffer->data()[buffer_offset_], copy_size);
33
34     offset += copy_size;
35     buffer_offset_ += copy_size;
36
37     CHECK_LE(buffer_offset_, io_buffer_size);
38     if (buffer_offset_ == io_buffer_size) {
39       CHECK_GE(total_buffer_size_, io_buffer_size);
40       total_buffer_size_ -= io_buffer_size;
41       pending_data_.pop_front();
42       buffer_offset_ = 0;
43     }
44   }
45   CHECK_EQ(offset, size);
46 }
47
48 void MessageBuffer::AddIOBuffer(scoped_refptr<net::IOBuffer> io_buffer,
49                                 int size) {
50   if (size == 0)
51     return;
52   pending_data_.push_back(std::make_pair(io_buffer, size));
53   total_buffer_size_ += size;
54 }
55
56 }  // namespace pairing_chromeos