| // Copyright (c) 2012 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 NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_ |
| #define NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "net/base/net_export.h" |
| #include "net/base/upload_data_stream.h" |
| #include "starboard/types.h" |
| |
| namespace net { |
| |
| class DrainableIOBuffer; |
| class IOBuffer; |
| class UploadElementReader; |
| |
| // A non-chunked UploadDataStream consisting of one or more UploadElements. |
| class NET_EXPORT ElementsUploadDataStream : public UploadDataStream { |
| public: |
| ElementsUploadDataStream( |
| std::vector<std::unique_ptr<UploadElementReader>> element_readers, |
| int64_t identifier); |
| |
| ~ElementsUploadDataStream() override; |
| |
| // Creates an ElementsUploadDataStream with a single reader. Returns a |
| // std::unique_ptr<UploadDataStream> for ease of use. |
| static std::unique_ptr<UploadDataStream> CreateWithReader( |
| std::unique_ptr<UploadElementReader> reader, |
| int64_t identifier); |
| |
| private: |
| // UploadDataStream implementation. |
| bool IsInMemory() const override; |
| const std::vector<std::unique_ptr<UploadElementReader>>* GetElementReaders() |
| const override; |
| int InitInternal(const NetLogWithSource& net_log) override; |
| int ReadInternal(IOBuffer* buf, int buf_len) override; |
| void ResetInternal() override; |
| |
| // Runs Init() for all element readers. |
| // This method is used to implement InitInternal(). |
| int InitElements(size_t start_index); |
| |
| // Called when the |index| element finishes initialization. If it succeeded, |
| // continues with the |index + 1| element. Calls OnInitCompleted on error or |
| // when all elements have been initialized. |
| void OnInitElementCompleted(size_t index, int result); |
| |
| // Reads data from the element readers. |
| // This method is used to implement Read(). |
| int ReadElements(const scoped_refptr<DrainableIOBuffer>& buf); |
| |
| // Resumes pending read and calls OnReadCompleted with a result when |
| // necessary. |
| void OnReadElementCompleted(const scoped_refptr<DrainableIOBuffer>& buf, |
| int result); |
| |
| // Processes result of UploadElementReader::Read(). If |result| indicates |
| // success, updates |buf|'s offset. Otherwise, sets |read_failed_| to true. |
| void ProcessReadResult(const scoped_refptr<DrainableIOBuffer>& buf, |
| int result); |
| |
| std::vector<std::unique_ptr<UploadElementReader>> element_readers_; |
| |
| // Index of the current upload element (i.e. the element currently being |
| // read). The index is used as a cursor to iterate over elements in |
| // |upload_data_|. |
| size_t element_index_; |
| |
| // Set to actual error if read fails, otherwise set to net::OK. |
| int read_error_; |
| |
| base::WeakPtrFactory<ElementsUploadDataStream> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ElementsUploadDataStream); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_ |