xref: /aosp_15_r20/external/cronet/net/base/elements_upload_data_stream.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2012 The Chromium Authors
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 
8 #include <stddef.h>
9 #include <stdint.h>
10 
11 #include <memory>
12 #include <vector>
13 
14 #include "base/memory/scoped_refptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "net/base/net_errors.h"
17 #include "net/base/net_export.h"
18 #include "net/base/upload_data_stream.h"
19 
20 namespace net {
21 
22 class DrainableIOBuffer;
23 class IOBuffer;
24 class UploadElementReader;
25 
26 // A non-chunked UploadDataStream consisting of one or more UploadElements.
27 class NET_EXPORT ElementsUploadDataStream : public UploadDataStream {
28  public:
29   ElementsUploadDataStream(
30       std::vector<std::unique_ptr<UploadElementReader>> element_readers,
31       int64_t identifier);
32 
33   ElementsUploadDataStream(const ElementsUploadDataStream&) = delete;
34   ElementsUploadDataStream& operator=(const ElementsUploadDataStream&) = delete;
35 
36   ~ElementsUploadDataStream() override;
37 
38   // Creates an ElementsUploadDataStream with a single reader.  Returns a
39   // std::unique_ptr<UploadDataStream> for ease of use.
40   static std::unique_ptr<UploadDataStream> CreateWithReader(
41       std::unique_ptr<UploadElementReader> reader,
42       int64_t identifier);
43 
44  private:
45   // UploadDataStream implementation.
46   bool IsInMemory() const override;
47   const std::vector<std::unique_ptr<UploadElementReader>>* GetElementReaders()
48       const override;
49   int InitInternal(const NetLogWithSource& net_log) override;
50   int ReadInternal(IOBuffer* buf, int buf_len) override;
51   void ResetInternal() override;
52 
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 
76   std::vector<std::unique_ptr<UploadElementReader>> element_readers_;
77 
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_|.
81   size_t element_index_ = 0;
82 
83   // Set to actual error if read fails, otherwise set to net::OK.
84   int read_error_ = OK;
85 
86   base::WeakPtrFactory<ElementsUploadDataStream> weak_ptr_factory_{this};
87 };
88 
89 }  // namespace net
90 
91 #endif  // NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_
92