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

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

Issue 12212031: Add support for redirecting ResourceHandlers to a blob: URL (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Code review fixes Created 7 years, 10 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 = 2 * 32768;
17 }
18
19 namespace content {
20
21 Stream::Stream(StreamRegistry* registry, const GURL& security_origin)
22 : bytes_read_(0),
23 complete_(false),
24 can_add_data_(true),
25 security_origin_(security_origin),
26 data_length_(0),
27 registry_(registry) {
28 CreateByteStream(base::MessageLoopProxy::current(),
29 base::MessageLoopProxy::current(),
30 kDeferSizeThreshold,
31 &writer_,
32 &reader_);
33
34 // Setup callback for writing.
35 writer_->RegisterCallback(base::Bind(&Stream::SpaceAvailable, this));
36 reader_->RegisterCallback(base::Bind(&Stream::DataAvailable, this));
37
38 registry_->RegisterStream(this);
39 }
40
41 Stream::~Stream() {
42 }
43
44 void Stream::AddReadObserver(StreamReadObserver* observer) {
45 read_observers_.AddObserver(observer);
46 }
47
48 void Stream::RemoveReadObserver(StreamReadObserver* observer) {
49 read_observers_.RemoveObserver(observer);
50 }
51
52 void Stream::AddWriteObserver(StreamWriteObserver* observer) {
53 write_observers_.AddObserver(observer);
54 }
55
56 void Stream::RemoveWriteObserver(StreamWriteObserver* observer) {
57 write_observers_.RemoveObserver(observer);
58 }
59
60 void Stream::AddData(scoped_refptr<net::IOBuffer> buffer, size_t size) {
61 can_add_data_ = writer_->Write(buffer, size);
62 }
63
64 void Stream::MarkComplete() {
65 complete_ = true;
66 writer_->Close(DOWNLOAD_INTERRUPT_REASON_NONE);
67 writer_.reset(NULL);
68
69 MaybeNotifyComplete();
70 }
71
72 bool Stream::ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) {
73 if (!data_) {
74 data_length_ = 0;
75 bytes_read_ = 0;
76 ByteStreamReader::StreamState state = reader_->Read(&data_, &data_length_);
77 switch (state) {
78 case ByteStreamReader::STREAM_HAS_DATA:
79 break;
80 case ByteStreamReader::STREAM_COMPLETE:
81 return true;
82 case ByteStreamReader::STREAM_EMPTY:
83 return false;
84 }
85 }
86
87 size_t remaining_bytes = data_length_ - bytes_read_;
88 size_t to_read =
89 (size_t)buf_size < remaining_bytes ? buf_size : remaining_bytes;
90 memcpy(buf->data(), data_->data() + bytes_read_, to_read);
91 bytes_read_ += to_read;
92 if (bytes_read_ >= data_length_) {
93 data_ = NULL;
94 }
95
96 *bytes_read = to_read;
97 MaybeNotifyComplete();
98 return true;
99 }
100
101 void Stream::MaybeNotifyComplete() {
102 if (complete_ && !data_) {
103 FOR_EACH_OBSERVER(StreamReadObserver,
104 read_observers_,
105 OnStreamConsumed(this));
106 registry_->OnStreamConsumed(this);
107 }
108 }
109
110 void Stream::SpaceAvailable() {
111 can_add_data_ = true;
112 FOR_EACH_OBSERVER(StreamWriteObserver,
113 write_observers_,
114 OnSpaceAvailable(this));
115 }
116
117 void Stream::DataAvailable() {
118 FOR_EACH_OBSERVER(StreamReadObserver,
119 read_observers_,
120 OnDataAvailable(this));
121 }
122
123 } // namespace content
124
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