blob: a10955d8c22ecb597fb1a63f6a8671327fa0bf15 [file] [log] [blame]
Avi Drissman64595482022-09-14 20:52:291// Copyright 2012 The Chromium Authors
mmenkecbc2b712014-10-09 20:29:072// 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
Lei Zhang58a1082452022-11-08 04:23:2014#include "base/memory/scoped_refptr.h"
mmenkecbc2b712014-10-09 20:29:0715#include "base/memory/weak_ptr.h"
Tsuyoshi Horoe0235ed62022-06-09 01:42:3016#include "net/base/net_errors.h"
mmenkecbc2b712014-10-09 20:29:0717#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
David Bienvenua03ac8c2020-11-06 15:55:3933 ElementsUploadDataStream(const ElementsUploadDataStream&) = delete;
34 ElementsUploadDataStream& operator=(const ElementsUploadDataStream&) = delete;
35
dchengb03027d2014-10-21 12:00:2036 ~ElementsUploadDataStream() override;
mmenkecbc2b712014-10-09 20:29:0737
38 // Creates an ElementsUploadDataStream with a single reader. Returns a
danakj7f767e62016-04-16 23:20:2339 // std::unique_ptr<UploadDataStream> for ease of use.
40 static std::unique_ptr<UploadDataStream> CreateWithReader(
41 std::unique_ptr<UploadElementReader> reader,
wtc69f8ea82015-06-04 00:08:1342 int64_t identifier);
mmenkecbc2b712014-10-09 20:29:0743
44 private:
45 // UploadDataStream implementation.
dchengb03027d2014-10-21 12:00:2046 bool IsInMemory() const override;
danakj7f767e62016-04-16 23:20:2347 const std::vector<std::unique_ptr<UploadElementReader>>* GetElementReaders()
olli.raula6df48b2a2015-11-26 07:40:2248 const override;
tfarina42834112016-09-22 13:38:2049 int InitInternal(const NetLogWithSource& net_log) override;
dchengb03027d2014-10-21 12:00:2050 int ReadInternal(IOBuffer* buf, int buf_len) override;
51 void ResetInternal() override;
mmenkecbc2b712014-10-09 20:29:0752
53 // Runs Init() for all element readers.
54 // This method is used to implement InitInternal().
55 int InitElements(size_t start_index);
56
57 // Called when the |index| element finishes initialization. If it succeeded,
58 // continues with the |index + 1| element. Calls OnInitCompleted on error or
59 // when all elements have been initialized.
60 void OnInitElementCompleted(size_t index, int result);
61
62 // Reads data from the element readers.
63 // This method is used to implement Read().
64 int ReadElements(const scoped_refptr<DrainableIOBuffer>& buf);
65
66 // Resumes pending read and calls OnReadCompleted with a result when
67 // necessary.
68 void OnReadElementCompleted(const scoped_refptr<DrainableIOBuffer>& buf,
69 int result);
70
71 // Processes result of UploadElementReader::Read(). If |result| indicates
72 // success, updates |buf|'s offset. Otherwise, sets |read_failed_| to true.
73 void ProcessReadResult(const scoped_refptr<DrainableIOBuffer>& buf,
74 int result);
75
danakj7f767e62016-04-16 23:20:2376 std::vector<std::unique_ptr<UploadElementReader>> element_readers_;
mmenkecbc2b712014-10-09 20:29:0777
78 // Index of the current upload element (i.e. the element currently being
79 // read). The index is used as a cursor to iterate over elements in
80 // |upload_data_|.
Tsuyoshi Horoe0235ed62022-06-09 01:42:3081 size_t element_index_ = 0;
mmenkecbc2b712014-10-09 20:29:0782
maksim.sisove869bf52016-06-23 17:11:5283 // Set to actual error if read fails, otherwise set to net::OK.
Tsuyoshi Horoe0235ed62022-06-09 01:42:3084 int read_error_ = OK;
mmenkecbc2b712014-10-09 20:29:0785
Jeremy Romand54000b22019-07-08 18:40:1686 base::WeakPtrFactory<ElementsUploadDataStream> weak_ptr_factory_{this};
mmenkecbc2b712014-10-09 20:29:0787};
88
89} // namespace net
90
91#endif // NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_