blob: ba8f9457e7c642b136fce625b2ff03406b6b6274 [file] [log] [blame]
mmenkecbc2b712014-10-09 20:29:071// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_
6#define NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_
7
Avi Drissman13fc8932015-12-20 04:40:468#include <stddef.h>
9#include <stdint.h>
10
danakj7f767e62016-04-16 23:20:2311#include <memory>
olli.raula6df48b2a2015-11-26 07:40:2212#include <vector>
13
mmenkecbc2b712014-10-09 20:29:0714#include "base/macros.h"
15#include "base/memory/ref_counted.h"
mmenkecbc2b712014-10-09 20:29:0716#include "base/memory/weak_ptr.h"
17#include "net/base/net_export.h"
18#include "net/base/upload_data_stream.h"
19
20namespace net {
21
22class DrainableIOBuffer;
23class IOBuffer;
24class UploadElementReader;
25
26// A non-chunked UploadDataStream consisting of one or more UploadElements.
27class NET_EXPORT ElementsUploadDataStream : public UploadDataStream {
28 public:
olli.raula6df48b2a2015-11-26 07:40:2229 ElementsUploadDataStream(
danakj7f767e62016-04-16 23:20:2330 std::vector<std::unique_ptr<UploadElementReader>> element_readers,
olli.raula6df48b2a2015-11-26 07:40:2231 int64_t identifier);
mmenkecbc2b712014-10-09 20:29:0732
dchengb03027d2014-10-21 12:00:2033 ~ElementsUploadDataStream() override;
mmenkecbc2b712014-10-09 20:29:0734
35 // Creates an ElementsUploadDataStream with a single reader. Returns a
danakj7f767e62016-04-16 23:20:2336 // std::unique_ptr<UploadDataStream> for ease of use.
37 static std::unique_ptr<UploadDataStream> CreateWithReader(
38 std::unique_ptr<UploadElementReader> reader,
wtc69f8ea82015-06-04 00:08:1339 int64_t identifier);
mmenkecbc2b712014-10-09 20:29:0740
41 private:
42 // UploadDataStream implementation.
dchengb03027d2014-10-21 12:00:2043 bool IsInMemory() const override;
danakj7f767e62016-04-16 23:20:2344 const std::vector<std::unique_ptr<UploadElementReader>>* GetElementReaders()
olli.raula6df48b2a2015-11-26 07:40:2245 const override;
tfarina428341112016-09-22 13:38:2046 int InitInternal(const NetLogWithSource& net_log) override;
dchengb03027d2014-10-21 12:00:2047 int ReadInternal(IOBuffer* buf, int buf_len) override;
48 void ResetInternal() override;
mmenkecbc2b712014-10-09 20:29:0749
50 // Runs Init() for all element readers.
51 // This method is used to implement InitInternal().
52 int InitElements(size_t start_index);
53
54 // Called when the |index| element finishes initialization. If it succeeded,
55 // continues with the |index + 1| element. Calls OnInitCompleted on error or
56 // when all elements have been initialized.
57 void OnInitElementCompleted(size_t index, int result);
58
59 // Reads data from the element readers.
60 // This method is used to implement Read().
61 int ReadElements(const scoped_refptr<DrainableIOBuffer>& buf);
62
63 // Resumes pending read and calls OnReadCompleted with a result when
64 // necessary.
65 void OnReadElementCompleted(const scoped_refptr<DrainableIOBuffer>& buf,
66 int result);
67
68 // Processes result of UploadElementReader::Read(). If |result| indicates
69 // success, updates |buf|'s offset. Otherwise, sets |read_failed_| to true.
70 void ProcessReadResult(const scoped_refptr<DrainableIOBuffer>& buf,
71 int result);
72
danakj7f767e62016-04-16 23:20:2373 std::vector<std::unique_ptr<UploadElementReader>> element_readers_;
mmenkecbc2b712014-10-09 20:29:0774
75 // Index of the current upload element (i.e. the element currently being
76 // read). The index is used as a cursor to iterate over elements in
77 // |upload_data_|.
78 size_t element_index_;
79
maksim.sisove869bf52016-06-23 17:11:5280 // Set to actual error if read fails, otherwise set to net::OK.
81 int read_error_;
mmenkecbc2b712014-10-09 20:29:0782
Jeremy Romand54000b22019-07-08 18:40:1683 base::WeakPtrFactory<ElementsUploadDataStream> weak_ptr_factory_{this};
mmenkecbc2b712014-10-09 20:29:0784
85 DISALLOW_COPY_AND_ASSIGN(ElementsUploadDataStream);
86};
87
88} // namespace net
89
90#endif // NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_