OLD | NEW |
---|---|
(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/chrome_stream.h" | |
6 | |
7 #include "net/base/io_buffer.h" | |
8 | |
9 namespace { | |
10 // Start throttling the connection at about 1MB | |
11 const size_t kDeferSizeThreshold = 40 * 32768; | |
12 } | |
13 | |
14 namespace content { | |
15 | |
16 ChromeStream::ChromeStream(const GURL& security_origin) | |
17 : current_size_(0), | |
18 bytes_read_(0), | |
19 complete_(false), | |
20 should_defer_(false), | |
21 security_origin_(security_origin) { | |
22 } | |
23 | |
24 ChromeStream::~ChromeStream() { | |
25 } | |
26 | |
27 void ChromeStream::AddObserver(ChromeStreamObserver* observer) { | |
28 observers_.AddObserver(observer); | |
29 } | |
30 | |
31 void ChromeStream::RemoveObserver(ChromeStreamObserver* observer) { | |
32 observers_.RemoveObserver(observer); | |
33 } | |
34 | |
35 void ChromeStream::AddData(scoped_refptr<net::IOBuffer> buffer, size_t size) { | |
36 buffer_.push_back(std::make_pair(buffer, size)); | |
37 current_size_ += size; | |
38 if (current_size_ > kDeferSizeThreshold) { | |
39 should_defer_ = true; | |
40 } | |
41 | |
42 FOR_EACH_OBSERVER(ChromeStreamObserver, observers_, OnDataAvailable(this)); | |
43 } | |
44 | |
45 void ChromeStream::MarkComplete() { | |
46 complete_ = true; | |
47 | |
48 MaybeNotifyComplete(); | |
49 } | |
50 | |
51 bool ChromeStream::ReadRawData(net::IOBuffer* buf, | |
52 int buf_size, | |
darin (slow to review)
2013/02/13 09:18:12
it feels like there is some redundancy here with B
Zachary Kuznia
2013/02/13 16:37:14
Modified this class to use ByteStream.
| |
53 int* bytes_read) { | |
54 if (buffer_.empty()) { | |
55 return complete_; | |
56 } | |
57 | |
58 size_t current_buffer_size = buffer_.front().second; | |
59 size_t remaining_bytes = current_buffer_size - bytes_read_; | |
60 size_t to_read = | |
61 (size_t)buf_size < remaining_bytes ? buf_size : remaining_bytes; | |
62 scoped_refptr<net::IOBuffer> source = buffer_.front().first; | |
63 | |
64 memcpy(buf->data(), source->data() + bytes_read_, to_read); | |
65 | |
66 bytes_read_ += to_read; | |
67 | |
68 if (bytes_read_ >= current_buffer_size) { | |
69 current_size_ -= current_buffer_size; | |
70 bytes_read_ = 0; | |
71 buffer_.pop_front(); | |
72 | |
73 if (should_defer_ && current_size_ < kDeferSizeThreshold) { | |
74 should_defer_ = false; | |
75 FOR_EACH_OBSERVER(ChromeStreamObserver, | |
76 observers_, | |
77 OnBufferAvailable(this)); | |
78 } | |
79 } | |
80 | |
81 *bytes_read = to_read; | |
82 | |
83 MaybeNotifyComplete(); | |
84 | |
85 return true; | |
86 } | |
87 | |
88 void ChromeStream::MaybeNotifyComplete() { | |
89 if (complete_ && buffer_.empty()) { | |
90 FOR_EACH_OBSERVER(ChromeStreamObserver, observers_, OnStreamComplete(this)); | |
91 } | |
92 } | |
93 | |
94 } // namespace content | |
95 | |
OLD | NEW |