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

Side by Side Diff: content/browser/streams/stream.cc

Issue 12637006: Reland r187230: Implement the Stream registry in content (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 7 years, 9 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
« no previous file with comments | « content/browser/streams/stream.h ('k') | content/browser/streams/stream_context.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 "content/browser/streams/stream.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop_proxy.h"
9 #include "content/browser/streams/stream_read_observer.h"
10 #include "content/browser/streams/stream_registry.h"
11 #include "content/browser/streams/stream_write_observer.h"
12 #include "net/base/io_buffer.h"
13
14 namespace {
15 // Start throttling the connection at about 1MB.
16 const size_t kDeferSizeThreshold = 40 * 32768;
17 }
18
19 namespace content {
20
21 Stream::Stream(StreamRegistry* registry,
22 StreamWriteObserver* write_observer,
23 const GURL& security_origin,
24 const GURL& url)
25 : bytes_read_(0),
26 can_add_data_(true),
27 security_origin_(security_origin),
28 url_(url),
29 data_length_(0),
30 registry_(registry),
31 read_observer_(NULL),
32 write_observer_(write_observer),
33 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
34 CreateByteStream(base::MessageLoopProxy::current(),
35 base::MessageLoopProxy::current(),
36 kDeferSizeThreshold,
37 &writer_,
38 &reader_);
39
40 // Setup callback for writing.
41 writer_->RegisterCallback(base::Bind(&Stream::OnSpaceAvailable,
42 weak_ptr_factory_.GetWeakPtr()));
43 reader_->RegisterCallback(base::Bind(&Stream::OnDataAvailable,
44 weak_ptr_factory_.GetWeakPtr()));
45
46 registry_->RegisterStream(this);
47 }
48
49 Stream::~Stream() {
50 }
51
52 bool Stream::SetReadObserver(StreamReadObserver* observer) {
53 if (read_observer_)
54 return false;
55 read_observer_ = observer;
56 return true;
57 }
58
59 void Stream::RemoveReadObserver(StreamReadObserver* observer) {
60 DCHECK(observer == read_observer_);
61 read_observer_ = NULL;
62 }
63
64 void Stream::AddData(scoped_refptr<net::IOBuffer> buffer, size_t size) {
65 can_add_data_ = writer_->Write(buffer, size);
66 }
67
68 void Stream::Finalize() {
69 writer_->Close(DOWNLOAD_INTERRUPT_REASON_NONE);
70 writer_.reset(NULL);
71
72 OnDataAvailable();
73 }
74
75 Stream::StreamState Stream::ReadRawData(net::IOBuffer* buf,
76 int buf_size,
77 int* bytes_read) {
78 if (!data_) {
79 data_length_ = 0;
80 bytes_read_ = 0;
81 ByteStreamReader::StreamState state = reader_->Read(&data_, &data_length_);
82 switch (state) {
83 case ByteStreamReader::STREAM_HAS_DATA:
84 break;
85 case ByteStreamReader::STREAM_COMPLETE:
86 registry_->UnregisterStream(url());
87 return STREAM_COMPLETE;
88 case ByteStreamReader::STREAM_EMPTY:
89 return STREAM_EMPTY;
90 }
91 }
92
93 size_t remaining_bytes = data_length_ - bytes_read_;
94 size_t to_read =
95 static_cast<size_t>(buf_size) < remaining_bytes ?
96 buf_size : remaining_bytes;
97 memcpy(buf->data(), data_->data() + bytes_read_, to_read);
98 bytes_read_ += to_read;
99 if (bytes_read_ >= data_length_)
100 data_ = NULL;
101
102 *bytes_read = to_read;
103 return STREAM_HAS_DATA;
104 }
105
106 void Stream::OnSpaceAvailable() {
107 can_add_data_ = true;
108 write_observer_->OnSpaceAvailable(this);
109 }
110
111 void Stream::OnDataAvailable() {
112 read_observer_->OnDataAvailable(this);
113 }
114
115 } // namespace content
116
OLDNEW
« no previous file with comments | « content/browser/streams/stream.h ('k') | content/browser/streams/stream_context.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698