xref: /aosp_15_r20/external/cronet/net/spdy/spdy_read_queue.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/spdy/spdy_read_queue.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <algorithm>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
11*6777b538SAndroid Build Coastguard Worker #include "net/spdy/spdy_buffer.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace net {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker SpdyReadQueue::SpdyReadQueue() = default;
16*6777b538SAndroid Build Coastguard Worker 
~SpdyReadQueue()17*6777b538SAndroid Build Coastguard Worker SpdyReadQueue::~SpdyReadQueue() {
18*6777b538SAndroid Build Coastguard Worker   Clear();
19*6777b538SAndroid Build Coastguard Worker }
20*6777b538SAndroid Build Coastguard Worker 
IsEmpty() const21*6777b538SAndroid Build Coastguard Worker bool SpdyReadQueue::IsEmpty() const {
22*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(queue_.empty(), total_size_ == 0);
23*6777b538SAndroid Build Coastguard Worker   return queue_.empty();
24*6777b538SAndroid Build Coastguard Worker }
25*6777b538SAndroid Build Coastguard Worker 
GetTotalSize() const26*6777b538SAndroid Build Coastguard Worker size_t SpdyReadQueue::GetTotalSize() const {
27*6777b538SAndroid Build Coastguard Worker   return total_size_;
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker 
Enqueue(std::unique_ptr<SpdyBuffer> buffer)30*6777b538SAndroid Build Coastguard Worker void SpdyReadQueue::Enqueue(std::unique_ptr<SpdyBuffer> buffer) {
31*6777b538SAndroid Build Coastguard Worker   DCHECK_GT(buffer->GetRemainingSize(), 0u);
32*6777b538SAndroid Build Coastguard Worker   total_size_ += buffer->GetRemainingSize();
33*6777b538SAndroid Build Coastguard Worker   queue_.push_back(std::move(buffer));
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker 
Dequeue(char * out,size_t len)36*6777b538SAndroid Build Coastguard Worker size_t SpdyReadQueue::Dequeue(char* out, size_t len) {
37*6777b538SAndroid Build Coastguard Worker   DCHECK_GT(len, 0u);
38*6777b538SAndroid Build Coastguard Worker   size_t bytes_copied = 0;
39*6777b538SAndroid Build Coastguard Worker   while (!queue_.empty() && bytes_copied < len) {
40*6777b538SAndroid Build Coastguard Worker     SpdyBuffer* buffer = queue_.front().get();
41*6777b538SAndroid Build Coastguard Worker     size_t bytes_to_copy =
42*6777b538SAndroid Build Coastguard Worker         std::min(len - bytes_copied, buffer->GetRemainingSize());
43*6777b538SAndroid Build Coastguard Worker     memcpy(out + bytes_copied, buffer->GetRemainingData(), bytes_to_copy);
44*6777b538SAndroid Build Coastguard Worker     bytes_copied += bytes_to_copy;
45*6777b538SAndroid Build Coastguard Worker     if (bytes_to_copy == buffer->GetRemainingSize())
46*6777b538SAndroid Build Coastguard Worker       queue_.pop_front();
47*6777b538SAndroid Build Coastguard Worker     else
48*6777b538SAndroid Build Coastguard Worker       buffer->Consume(bytes_to_copy);
49*6777b538SAndroid Build Coastguard Worker   }
50*6777b538SAndroid Build Coastguard Worker   total_size_ -= bytes_copied;
51*6777b538SAndroid Build Coastguard Worker   return bytes_copied;
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker 
Clear()54*6777b538SAndroid Build Coastguard Worker void SpdyReadQueue::Clear() {
55*6777b538SAndroid Build Coastguard Worker   queue_.clear();
56*6777b538SAndroid Build Coastguard Worker   total_size_ = 0;
57*6777b538SAndroid Build Coastguard Worker }
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker }  // namespace net
60