Chromium Code Reviews| Index: net/base/chunked_upload_data_stream.h |
| diff --git a/net/base/chunked_upload_data_stream.h b/net/base/chunked_upload_data_stream.h |
| index 7b5e2dfecb618393d8a8bc50f05f4739cde5ea08..19ac0a6fe86f3990004e2dc2080771cb787b9154 100644 |
| --- a/net/base/chunked_upload_data_stream.h |
| +++ b/net/base/chunked_upload_data_stream.h |
| @@ -12,6 +12,8 @@ |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "base/memory/weak_ptr.h" |
| #include "net/base/completion_callback.h" |
| #include "net/base/net_export.h" |
| #include "net/base/upload_data_stream.h" |
| @@ -25,14 +27,53 @@ class IOBuffer; |
| // seekable data, due to this buffering behavior. |
| class NET_EXPORT ChunkedUploadDataStream : public UploadDataStream { |
| public: |
| + // Utility class that allows writing data to a particular |
| + // ChunkedUploadDataStream. It's needed because URLRequest owns the |
|
eroman
2016/03/26 00:55:16
Before jumping into the "why" it's needed, I sugge
mmenke
2016/03/28 17:33:11
Done.
|
| + // ChunkedUploadDataStream and manages its lifetime (And can delete it without |
| + // warning, if failures are intercepted and then redirected), but higher level |
| + // code is responsible for writing to the ChunkedUploadDataStream. |
| + // |
| + // The writer may only be used on the ChunkedUploadDataStream's thread. |
| + class NET_EXPORT Writer { |
| + public: |
| + ~Writer(); |
| + |
| + // Adds data to the stream. |is_done| should be true if this is the last |
| + // data to be appended. |data_len| must not be 0 unless |is_done| is true. |
| + // Once called with |is_done| being true, must never be called again. |
| + // Returns true if write was passed successfully on to the next layer, |
| + // though the data may not actually have been written to the underlying |
| + // URLRequest. Returns false if unable to write the data failed because the |
| + // underlying ChunkedUploadDataStream was destroyed. |
| + bool AppendData(const char* data, int data_len, bool is_done); |
| + |
| + private: |
| + friend class ChunkedUploadDataStream; |
| + |
| + explicit Writer(base::WeakPtr<ChunkedUploadDataStream> upload_data_stream); |
| + |
| + const base::WeakPtr<ChunkedUploadDataStream> upload_data_stream_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(Writer); |
| + }; |
| + |
| explicit ChunkedUploadDataStream(int64_t identifier); |
| ~ChunkedUploadDataStream() override; |
| + // Creates a Writer for appending data to |this|. It's generally expected |
| + // that only one writer is created per stream, though multiple writers are |
| + // allowed. All writers write to the same stream, and once one of them |
| + // appends data with |is_done| being true, no other writers may be used to |
| + // append data. |
| + scoped_ptr<Writer> CreateWriter(); |
| + |
| // Adds data to the stream. |is_done| should be true if this is the last |
| // data to be appended. |data_len| must not be 0 unless |is_done| is true. |
| // Once called with |is_done| being true, must never be called again. |
| // TODO(mmenke): Consider using IOBuffers instead, to reduce data copies. |
| + // TODO(mmenke): Consider making private, and having all consumers use |
| + // Writers. |
| void AppendData(const char* data, int data_len, bool is_done); |
| private: |
| @@ -57,6 +98,8 @@ class NET_EXPORT ChunkedUploadDataStream : public UploadDataStream { |
| scoped_refptr<IOBuffer> read_buffer_; |
| int read_buffer_len_; |
| + base::WeakPtrFactory<ChunkedUploadDataStream> weak_factory_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(ChunkedUploadDataStream); |
| }; |