summaryrefslogtreecommitdiffstats
path: root/content/browser/streams
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/streams')
-rw-r--r--content/browser/streams/stream.cc27
-rw-r--r--content/browser/streams/stream.h11
-rw-r--r--content/browser/streams/stream_handle_impl.cc39
-rw-r--r--content/browser/streams/stream_handle_impl.h40
-rw-r--r--content/browser/streams/stream_unittest.cc3
-rw-r--r--content/browser/streams/stream_write_observer.h3
6 files changed, 122 insertions, 1 deletions
diff --git a/content/browser/streams/stream.cc b/content/browser/streams/stream.cc
index 590452b..3fe192a 100644
--- a/content/browser/streams/stream.cc
+++ b/content/browser/streams/stream.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/message_loop_proxy.h"
+#include "content/browser/streams/stream_handle_impl.h"
#include "content/browser/streams/stream_read_observer.h"
#include "content/browser/streams/stream_registry.h"
#include "content/browser/streams/stream_write_observer.h"
@@ -30,6 +31,7 @@ Stream::Stream(StreamRegistry* registry,
registry_(registry),
read_observer_(NULL),
write_observer_(write_observer),
+ stream_handle_(NULL),
weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
CreateByteStream(base::MessageLoopProxy::current(),
base::MessageLoopProxy::current(),
@@ -61,6 +63,11 @@ void Stream::RemoveReadObserver(StreamReadObserver* observer) {
read_observer_ = NULL;
}
+void Stream::RemoveWriteObserver(StreamWriteObserver* observer) {
+ DCHECK(observer == write_observer_);
+ write_observer_ = NULL;
+}
+
void Stream::AddData(scoped_refptr<net::IOBuffer> buffer, size_t size) {
can_add_data_ = writer_->Write(buffer, size);
}
@@ -103,9 +110,27 @@ Stream::StreamState Stream::ReadRawData(net::IOBuffer* buf,
return STREAM_HAS_DATA;
}
+scoped_ptr<StreamHandle> Stream::CreateHandle(const GURL& original_url,
+ const std::string& mime_type) {
+ CHECK(!stream_handle_);
+ stream_handle_ = new StreamHandleImpl(weak_ptr_factory_.GetWeakPtr(),
+ original_url,
+ mime_type);
+ return scoped_ptr<StreamHandle>(stream_handle_).Pass();
+}
+
+void Stream::CloseHandle() {
+ CHECK(stream_handle_);
+ stream_handle_ = NULL;
+ registry_->UnregisterStream(url());
+ if (write_observer_)
+ write_observer_->OnClose(this);
+}
+
void Stream::OnSpaceAvailable() {
can_add_data_ = true;
- write_observer_->OnSpaceAvailable(this);
+ if (write_observer_)
+ write_observer_->OnSpaceAvailable(this);
}
void Stream::OnDataAvailable() {
diff --git a/content/browser/streams/stream.h b/content/browser/streams/stream.h
index 3aa389c..d6cd3b8 100644
--- a/content/browser/streams/stream.h
+++ b/content/browser/streams/stream.h
@@ -18,6 +18,8 @@ class IOBuffer;
namespace content {
+class StreamHandle;
+class StreamHandleImpl;
class StreamReadObserver;
class StreamRegistry;
class StreamWriteObserver;
@@ -49,6 +51,9 @@ class CONTENT_EXPORT Stream : public base::RefCountedThreadSafe<Stream> {
// Removes the read observer. |observer| must be the current observer.
void RemoveReadObserver(StreamReadObserver* observer);
+ // Removes the write observer. |observer| must be the current observer.
+ void RemoveWriteObserver(StreamWriteObserver* observer);
+
// Adds the data in |buffer| to the stream. Takes ownership of |buffer|.
void AddData(scoped_refptr<net::IOBuffer> buffer, size_t size);
@@ -61,6 +66,10 @@ class CONTENT_EXPORT Stream : public base::RefCountedThreadSafe<Stream> {
// and STREAM_COMPLETE if the stream is finalized and all data has been read.
StreamState ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read);
+ scoped_ptr<StreamHandle> CreateHandle(const GURL& original_url,
+ const std::string& mime_type);
+ void CloseHandle();
+
// Indicates whether there is space in the buffer to add more data.
bool can_add_data() const { return can_add_data_; }
@@ -92,6 +101,8 @@ class CONTENT_EXPORT Stream : public base::RefCountedThreadSafe<Stream> {
StreamReadObserver* read_observer_;
StreamWriteObserver* write_observer_;
+ StreamHandleImpl* stream_handle_;
+
base::WeakPtrFactory<Stream> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(Stream);
};
diff --git a/content/browser/streams/stream_handle_impl.cc b/content/browser/streams/stream_handle_impl.cc
new file mode 100644
index 0000000..11f6959
--- /dev/null
+++ b/content/browser/streams/stream_handle_impl.cc
@@ -0,0 +1,39 @@
+// 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/stream_handle_impl.h"
+
+#include "content/browser/streams/stream.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace content {
+
+StreamHandleImpl::StreamHandleImpl(const base::WeakPtr<Stream>& stream,
+ const GURL& original_url,
+ const std::string& mime_type)
+ : stream_(stream),
+ url_(stream->url()),
+ original_url_(original_url),
+ mime_type_(mime_type),
+ stream_message_loop_(base::MessageLoopProxy::current()) {
+}
+
+StreamHandleImpl::~StreamHandleImpl() {
+ stream_message_loop_->PostTask(FROM_HERE,
+ base::Bind(&Stream::CloseHandle, stream_));
+}
+
+const GURL& StreamHandleImpl::GetURL() {
+ return url_;
+}
+
+const GURL& StreamHandleImpl::GetOriginalURL() {
+ return original_url_;
+}
+
+const std::string& StreamHandleImpl::GetMimeType() {
+ return mime_type_;
+}
+
+} // namespace content
diff --git a/content/browser/streams/stream_handle_impl.h b/content/browser/streams/stream_handle_impl.h
new file mode 100644
index 0000000..31bfbee
--- /dev/null
+++ b/content/browser/streams/stream_handle_impl.h
@@ -0,0 +1,40 @@
+// 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.
+
+#ifndef CONTENT_BROWSER_STREAMS_STREAM_HANDLE_IMPL_H_
+#define CONTENT_BROWSER_STREAMS_STREAM_HANDLE_IMPL_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/message_loop_proxy.h"
+#include "base/synchronization/lock.h"
+#include "content/public/browser/stream_handle.h"
+
+namespace content {
+
+class Stream;
+
+class StreamHandleImpl : public StreamHandle {
+ public:
+ StreamHandleImpl(const base::WeakPtr<Stream>& stream,
+ const GURL& original_url,
+ const std::string& mime_type);
+ virtual ~StreamHandleImpl();
+
+ private:
+ // StreamHandle overrides
+ virtual const GURL& GetURL() OVERRIDE;
+ virtual const GURL& GetOriginalURL() OVERRIDE;
+ virtual const std::string& GetMimeType() OVERRIDE;
+
+ base::WeakPtr<Stream> stream_;
+ GURL url_;
+ GURL original_url_;
+ std::string mime_type_;
+ base::MessageLoopProxy* stream_message_loop_;
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_STREAMS_STREAM_HANDLE_IMPL_H_
+
diff --git a/content/browser/streams/stream_unittest.cc b/content/browser/streams/stream_unittest.cc
index 62f3e3e..2c9f34c 100644
--- a/content/browser/streams/stream_unittest.cc
+++ b/content/browser/streams/stream_unittest.cc
@@ -82,6 +82,9 @@ class TestStreamWriter : public StreamWriteObserver {
virtual void OnSpaceAvailable(Stream* stream) OVERRIDE {
}
+
+ virtual void OnClose(Stream* stream) OVERRIDE {
+ }
};
TEST_F(StreamTest, SetReadObserver) {
diff --git a/content/browser/streams/stream_write_observer.h b/content/browser/streams/stream_write_observer.h
index 31d84cd..deab7ad 100644
--- a/content/browser/streams/stream_write_observer.h
+++ b/content/browser/streams/stream_write_observer.h
@@ -15,6 +15,9 @@ class StreamWriteObserver {
// resume writing.
virtual void OnSpaceAvailable(Stream* stream) = 0;
+ // Sent when the stream is closed, and the writer should stop sending data.
+ virtual void OnClose(Stream* stream) = 0;
+
protected:
virtual ~StreamWriteObserver() {}
};