Index: content/browser/streams/chrome_stream.cc |
diff --git a/content/browser/streams/chrome_stream.cc b/content/browser/streams/chrome_stream.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9bc468ac825a29e95280e65bdf11f8408c1cb24f |
--- /dev/null |
+++ b/content/browser/streams/chrome_stream.cc |
@@ -0,0 +1,95 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/streams/chrome_stream.h" |
+ |
+#include "net/base/io_buffer.h" |
+ |
+namespace { |
+// Start throttling the connection at about 1MB |
+const size_t kDeferSizeThreshold = 40 * 32768; |
+} |
+ |
+namespace content { |
+ |
+ChromeStream::ChromeStream(const GURL& security_origin) |
+ : current_size_(0), |
+ bytes_read_(0), |
+ complete_(false), |
+ should_defer_(false), |
+ security_origin_(security_origin) { |
+} |
+ |
+ChromeStream::~ChromeStream() { |
+} |
+ |
+void ChromeStream::AddObserver(ChromeStreamObserver* observer) { |
+ observers_.AddObserver(observer); |
+} |
+ |
+void ChromeStream::RemoveObserver(ChromeStreamObserver* observer) { |
+ observers_.RemoveObserver(observer); |
+} |
+ |
+void ChromeStream::AddData(scoped_refptr<net::IOBuffer> buffer, size_t size) { |
+ buffer_.push_back(std::make_pair(buffer, size)); |
+ current_size_ += size; |
+ if (current_size_ > kDeferSizeThreshold) { |
+ should_defer_ = true; |
+ } |
+ |
+ FOR_EACH_OBSERVER(ChromeStreamObserver, observers_, OnDataAvailable(this)); |
+} |
+ |
+void ChromeStream::MarkComplete() { |
+ complete_ = true; |
+ |
+ MaybeNotifyComplete(); |
+} |
+ |
+bool ChromeStream::ReadRawData(net::IOBuffer* buf, |
+ 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.
|
+ int* bytes_read) { |
+ if (buffer_.empty()) { |
+ return complete_; |
+ } |
+ |
+ size_t current_buffer_size = buffer_.front().second; |
+ size_t remaining_bytes = current_buffer_size - bytes_read_; |
+ size_t to_read = |
+ (size_t)buf_size < remaining_bytes ? buf_size : remaining_bytes; |
+ scoped_refptr<net::IOBuffer> source = buffer_.front().first; |
+ |
+ memcpy(buf->data(), source->data() + bytes_read_, to_read); |
+ |
+ bytes_read_ += to_read; |
+ |
+ if (bytes_read_ >= current_buffer_size) { |
+ current_size_ -= current_buffer_size; |
+ bytes_read_ = 0; |
+ buffer_.pop_front(); |
+ |
+ if (should_defer_ && current_size_ < kDeferSizeThreshold) { |
+ should_defer_ = false; |
+ FOR_EACH_OBSERVER(ChromeStreamObserver, |
+ observers_, |
+ OnBufferAvailable(this)); |
+ } |
+ } |
+ |
+ *bytes_read = to_read; |
+ |
+ MaybeNotifyComplete(); |
+ |
+ return true; |
+} |
+ |
+void ChromeStream::MaybeNotifyComplete() { |
+ if (complete_ && buffer_.empty()) { |
+ FOR_EACH_OBSERVER(ChromeStreamObserver, observers_, OnStreamComplete(this)); |
+ } |
+} |
+ |
+} // namespace content |
+ |