Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(182)

Side by Side Diff: net/filter/filter_source_stream.cc

Issue 2251853002: Add net::SourceStream and net::FilterSourceStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Have an explict Pull() method Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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/filter/filter_source_stream.h"
6
7 #include "base/bind.h"
8 #include "base/callback_helpers.h"
9 #include "base/logging.h"
10 #include "base/metrics/histogram_macros.h"
11 #include "base/numerics/safe_conversions.h"
12 #include "base/strings/string_util.h"
13 #include "net/base/io_buffer.h"
14 #include "net/base/net_errors.h"
15
16 namespace net {
17
18 namespace {
19
20 const size_t kBufferSize = 32 * 1024;
21
22 } // namespace
23
24 FilterSourceStream::FilterSourceStream(SourceType type,
25 std::unique_ptr<SourceStream> upstream)
26 : SourceStream(type),
27 upstream_(std::move(upstream)),
28 upstream_end_reached_(false) {
29 DCHECK(upstream_);
30 }
31
32 FilterSourceStream::~FilterSourceStream() {}
33
34 int FilterSourceStream::Read(IOBuffer* read_buffer,
35 int read_buffer_size,
36 const CompletionCallback& callback) {
37 DCHECK(read_buffer);
38 DCHECK_LT(0, read_buffer_size);
39
40 return ReadInternal(read_buffer, read_buffer_size, callback);
41 }
42
43 std::string FilterSourceStream::Description() const {
44 std::string next_type_string = upstream_->Description();
45 if (next_type_string.empty())
46 return GetTypeAsString();
47 return next_type_string + "," + GetTypeAsString();
48 }
49
50 int FilterSourceStream::Pull(const CompletionCallback& callback) {
51 DCHECK(nullptr == drainable_input_buffer_ ||
52 0 == drainable_input_buffer_->BytesRemaining());
53 DCHECK(pull_callback_.is_null());
54
55 // Allocate a BlockBuffer during first Read().
56 if (!input_buffer_)
57 input_buffer_ = new IOBufferWithSize(kBufferSize);
58
59 // Use base::Unretained here is safe because |this| owns |upstream_|.
60 int rv = upstream_->Read(
61 input_buffer_.get(), kBufferSize,
62 base::Bind(&FilterSourceStream::OnIOComplete, base::Unretained(this)));
63
64 if (rv == ERR_IO_PENDING)
65 pull_callback_ = callback;
66
67 MaybeFillDrainableInputBuffer(rv);
68 return rv;
69 }
70
71 void FilterSourceStream::OnIOComplete(int result) {
72 DCHECK(!pull_callback_.is_null());
73 DCHECK_NE(ERR_IO_PENDING, result);
74
75 MaybeFillDrainableInputBuffer(result);
76 base::ResetAndReturn(&pull_callback_).Run(result);
77 }
78
79 void FilterSourceStream::MaybeFillDrainableInputBuffer(int bytes_read) {
80 if (bytes_read == ERR_IO_PENDING)
81 return;
82 if (bytes_read <= 0)
83 upstream_end_reached_ = true;
84 if (bytes_read < 0)
85 return;
86 drainable_input_buffer_ =
87 new DrainableIOBuffer(input_buffer_.get(), bytes_read);
88 }
89
90 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698