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 WorkerSpdyReadQueue::~SpdyReadQueue() { 18*6777b538SAndroid Build Coastguard Worker Clear(); 19*6777b538SAndroid Build Coastguard Worker } 20*6777b538SAndroid Build Coastguard Worker IsEmpty() const21*6777b538SAndroid Build Coastguard Workerbool 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 Workersize_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 Workervoid 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 Workersize_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 Workervoid 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