#ifndef SERVICES_NETWORK_WEB_BUNDLE_WEB_BUNDLE_CHUNKED_BUFFER_H_
#define SERVICES_NETWORK_WEB_BUNDLE_WEB_BUNDLE_CHUNKED_BUFFER_H_
#include <vector>
#include "base/compiler_specific.h"
#include "base/component_export.h"
#include "base/containers/span.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "mojo/public/cpp/system/data_pipe_producer.h"
namespace network {
class COMPONENT_EXPORT(NETWORK_SERVICE) WebBundleChunkedBuffer {
public:
WebBundleChunkedBuffer();
~WebBundleChunkedBuffer();
WebBundleChunkedBuffer(const WebBundleChunkedBuffer&) = delete;
WebBundleChunkedBuffer& operator=(const WebBundleChunkedBuffer&) = delete;
void Append(base::span<const uint8_t> data);
uint64_t GetAvailableLength(uint64_t offset, uint64_t max_length) const;
bool ContainsAll(uint64_t offset, uint64_t length) const;
[[nodiscard]] uint64_t ReadData(uint64_t offset,
base::span<uint8_t> out) const;
std::unique_ptr<mojo::DataPipeProducer::DataSource> CreateDataSource(
uint64_t offset,
uint64_t max_length) const;
uint64_t size() const;
private:
friend class WebBundleChunkedBufferTest;
FRIEND_TEST_ALL_PREFIXES(WebBundleChunkedBufferTest, EmptyBuffer);
FRIEND_TEST_ALL_PREFIXES(WebBundleChunkedBufferTest, PartialBuffer);
FRIEND_TEST_ALL_PREFIXES(WebBundleChunkedBufferTest, FindChunk);
class COMPONENT_EXPORT(NETWORK_SERVICE) Chunk {
public:
Chunk(uint64_t start_pos, scoped_refptr<const base::RefCountedBytes> bytes);
~Chunk();
Chunk(const Chunk&);
Chunk(Chunk&&);
Chunk& operator=(const Chunk&) = default;
Chunk& operator=(Chunk&&) = default;
uint64_t start_pos() const { return start_pos_; }
uint64_t end_pos() const { return start_pos_ + bytes_->size(); }
size_t size() const { return bytes_->size(); }
auto begin() const { return bytes_->begin(); }
auto end() const { return bytes_->end(); }
private:
uint64_t start_pos_;
scoped_refptr<const base::RefCountedBytes> bytes_;
};
using ChunkVector = std::vector<Chunk>;
explicit WebBundleChunkedBuffer(ChunkVector chunks);
bool empty() const;
uint64_t start_pos() const;
uint64_t end_pos() const;
ChunkVector::const_iterator FindChunk(uint64_t pos) const;
std::unique_ptr<const WebBundleChunkedBuffer> CreatePartialBuffer(
uint64_t offset,
uint64_t length) const;
ChunkVector chunks_;
};
}
#endif