diff options
Diffstat (limited to 'content/browser/streams')
-rw-r--r-- | content/browser/streams/stream.cc | 27 | ||||
-rw-r--r-- | content/browser/streams/stream.h | 11 | ||||
-rw-r--r-- | content/browser/streams/stream_handle_impl.cc | 39 | ||||
-rw-r--r-- | content/browser/streams/stream_handle_impl.h | 40 | ||||
-rw-r--r-- | content/browser/streams/stream_unittest.cc | 3 | ||||
-rw-r--r-- | content/browser/streams/stream_write_observer.h | 3 |
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() {} }; |