#ifndef SERVICES_NETWORK_DATA_PIPE_ELEMENT_READER_H_
#define SERVICES_NETWORK_DATA_PIPE_ELEMENT_READER_H_
#include <stdint.h>
#include "base/component_export.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/public/cpp/system/simple_watcher.h"
#include "net/base/completion_once_callback.h"
#include "net/base/upload_element_reader.h"
#include "services/network/public/cpp/resource_request_body.h"
#include "services/network/public/mojom/data_pipe_getter.mojom.h"
namespace net {
class IOBuffer;
}
namespace network {
class COMPONENT_EXPORT(NETWORK_SERVICE) DataPipeElementReader
: public net::UploadElementReader {
public:
DataPipeElementReader(
scoped_refptr<ResourceRequestBody> resource_request_body,
mojo::PendingRemote<mojom::DataPipeGetter> data_pipe_getter);
DataPipeElementReader(const DataPipeElementReader&) = delete;
DataPipeElementReader& operator=(const DataPipeElementReader&) = delete;
~DataPipeElementReader() override;
int Init(net::CompletionOnceCallback callback) override;
uint64_t GetContentLength() const override;
uint64_t BytesRemaining() const override;
int Read(net::IOBuffer* buf,
int buf_length,
net::CompletionOnceCallback callback) override;
private:
void ReadCallback(int32_t status, uint64_t size);
void OnHandleReadable(MojoResult result);
int ReadInternal(net::IOBuffer* buf, int buf_length);
scoped_refptr<ResourceRequestBody> resource_request_body_;
mojo::Remote<mojom::DataPipeGetter> data_pipe_getter_;
mojo::ScopedDataPipeConsumerHandle data_pipe_;
mojo::SimpleWatcher handle_watcher_;
scoped_refptr<net::IOBuffer> buf_;
int buf_length_ = 0;
uint64_t size_ = 0;
uint64_t bytes_read_ = 0;
net::CompletionOnceCallback init_callback_;
net::CompletionOnceCallback read_callback_;
base::WeakPtrFactory<DataPipeElementReader> weak_factory_{this};
};
}
#endif