#ifndef NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_
#define NET_BASE_ELEMENTS_UPLOAD_DATA_STREAM_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "net/base/net_errors.h"
#include "net/base/net_export.h"
#include "net/base/upload_data_stream.h"
namespace net {
class DrainableIOBuffer;
class IOBuffer;
class UploadElementReader;
class NET_EXPORT ElementsUploadDataStream : public UploadDataStream {
public:
ElementsUploadDataStream(
std::vector<std::unique_ptr<UploadElementReader>> element_readers,
int64_t identifier);
ElementsUploadDataStream(const ElementsUploadDataStream&) = delete;
ElementsUploadDataStream& operator=(const ElementsUploadDataStream&) = delete;
~ElementsUploadDataStream() override;
static std::unique_ptr<UploadDataStream> CreateWithReader(
std::unique_ptr<UploadElementReader> reader);
private:
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;
int InitElements(size_t start_index);
void OnInitElementCompleted(size_t index, int result);
int ReadElements(const scoped_refptr<DrainableIOBuffer>& buf);
void OnReadElementCompleted(const scoped_refptr<DrainableIOBuffer>& buf,
int result);
void ProcessReadResult(const scoped_refptr<DrainableIOBuffer>& buf,
int result);
std::vector<std::unique_ptr<UploadElementReader>> element_readers_;
size_t element_index_ = 0;
int read_error_ = OK;
base::WeakPtrFactory<ElementsUploadDataStream> weak_ptr_factory_{this};
};
}
#endif