1 // Copyright (c) 2017 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 "net/quic/platform/impl/quic_mem_slice_storage_impl.h"
6 #include "net/third_party/quiche/src/quic/core/quic_buffer_allocator.h"
7 #include "net/third_party/quiche/src/quic/core/quic_utils.h"
8 
9 namespace quic {
10 
QuicMemSliceStorageImpl(const struct iovec * iov,int iov_count,QuicBufferAllocator * allocator,const QuicByteCount max_slice_len)11 QuicMemSliceStorageImpl::QuicMemSliceStorageImpl(
12     const struct iovec* iov,
13     int iov_count,
14     QuicBufferAllocator* allocator,
15     const QuicByteCount max_slice_len) {
16   if (iov == nullptr) {
17     return;
18   }
19   QuicByteCount write_len = 0;
20   for (int i = 0; i < iov_count; ++i) {
21     write_len += iov[i].iov_len;
22   }
23   DCHECK_LT(0u, write_len);
24 
25   QuicByteCount iov_offset = 0;
26   while (write_len > 0) {
27     size_t slice_len = std::min(write_len, max_slice_len);
28     auto io_buffer = base::MakeRefCounted<net::IOBuffer>(slice_len);
29     QuicUtils::CopyToBuffer(iov, iov_count, iov_offset, slice_len,
30                             const_cast<char*>(io_buffer->data()));
31     buffers_.push_back(std::move(io_buffer));
32     lengths_.push_back(slice_len);
33     write_len -= slice_len;
34     iov_offset += slice_len;
35   }
36 }
37 
Append(QuicMemSliceImpl mem_slice)38 void QuicMemSliceStorageImpl::Append(QuicMemSliceImpl mem_slice) {
39   buffers_.push_back(*mem_slice.impl());
40   lengths_.push_back(mem_slice.length());
41 }
42 
43 QuicMemSliceStorageImpl::QuicMemSliceStorageImpl(
44     const QuicMemSliceStorageImpl& other) = default;
45 QuicMemSliceStorageImpl::QuicMemSliceStorageImpl(
46     QuicMemSliceStorageImpl&& other) = default;
47 QuicMemSliceStorageImpl& QuicMemSliceStorageImpl::operator=(
48     const QuicMemSliceStorageImpl& other) = default;
49 QuicMemSliceStorageImpl& QuicMemSliceStorageImpl::operator=(
50     QuicMemSliceStorageImpl&& other) = default;
51 QuicMemSliceStorageImpl::~QuicMemSliceStorageImpl() = default;
52 
53 }  // namespace quic
54