summaryrefslogtreecommitdiffstats
path: root/content/browser/loader/stream_writer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/loader/stream_writer.cc')
-rw-r--r--content/browser/loader/stream_writer.cc82
1 files changed, 82 insertions, 0 deletions
diff --git a/content/browser/loader/stream_writer.cc b/content/browser/loader/stream_writer.cc
new file mode 100644
index 0000000..99b5ee1
--- /dev/null
+++ b/content/browser/loader/stream_writer.cc
@@ -0,0 +1,82 @@
+// Copyright 2014 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/loader/stream_writer.h"
+
+#include "base/guid.h"
+#include "content/browser/streams/stream.h"
+#include "content/browser/streams/stream_registry.h"
+#include "content/public/browser/resource_controller.h"
+#include "net/base/io_buffer.h"
+#include "url/gurl.h"
+#include "url/url_constants.h"
+
+namespace content {
+
+StreamWriter::StreamWriter() : controller_(nullptr) {
+}
+
+StreamWriter::~StreamWriter() {
+ if (stream_.get())
+ Finalize();
+}
+
+void StreamWriter::InitializeStream(StreamRegistry* registry,
+ const GURL& origin) {
+ DCHECK(!stream_.get());
+
+ // TODO(tyoshino): Find a way to share this with the blob URL creation in
+ // WebKit.
+ GURL url(std::string(url::kBlobScheme) + ":" + origin.spec() +
+ base::GenerateGUID());
+ stream_ = new Stream(registry, this, url);
+}
+
+void StreamWriter::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
+ int* buf_size,
+ int min_size) {
+ static const int kReadBufSize = 32768;
+
+ DCHECK(buf);
+ DCHECK(buf_size);
+ DCHECK_LE(min_size, kReadBufSize);
+ if (!read_buffer_.get())
+ read_buffer_ = new net::IOBuffer(kReadBufSize);
+ *buf = read_buffer_.get();
+ *buf_size = kReadBufSize;
+}
+
+void StreamWriter::OnReadCompleted(int bytes_read, bool* defer) {
+ if (!bytes_read)
+ return;
+
+ // We have more data to read.
+ DCHECK(read_buffer_.get());
+
+ // Release the ownership of the buffer, and store a reference
+ // to it. A new one will be allocated in OnWillRead().
+ scoped_refptr<net::IOBuffer> buffer;
+ read_buffer_.swap(buffer);
+ stream_->AddData(buffer, bytes_read);
+
+ if (!stream_->can_add_data())
+ *defer = true;
+}
+
+void StreamWriter::Finalize() {
+ DCHECK(stream_.get());
+ stream_->Finalize();
+ stream_->RemoveWriteObserver(this);
+ stream_ = nullptr;
+}
+
+void StreamWriter::OnSpaceAvailable(Stream* stream) {
+ controller_->Resume();
+}
+
+void StreamWriter::OnClose(Stream* stream) {
+ controller_->Cancel();
+}
+
+} // namespace content