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