#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "storage/browser/blob/blob_reader.h"
#include <stddef.h>
#include <stdint.h>
#include <algorithm>
#include <limits>
#include <memory>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/ptr_util.h"
#include "base/task/thread_pool.h"
#include "base/trace_event/trace_event.h"
#include "components/file_access/scoped_file_access_delegate.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "storage/browser/blob/blob_data_handle.h"
#include "storage/browser/blob/blob_data_snapshot.h"
#include "storage/browser/file_system/file_stream_reader.h"
#include "storage/browser/file_system/file_system_backend.h"
#include "storage/browser/file_system/file_system_context.h"
#include "storage/browser/file_system/file_system_url.h"
#include "third_party/blink/public/common/blob/blob_utils.h"
namespace storage {
namespace {
bool IsFileType(BlobDataItem::Type type) { … }
int ConvertBlobErrorToNetError(BlobStatus reason) { … }
}
BlobReader::FileStreamReaderProvider::~FileStreamReaderProvider() = default;
BlobReader::BlobReader(const BlobDataHandle* blob_handle)
: … { … }
BlobReader::~BlobReader() = default;
BlobReader::Status BlobReader::CalculateSize(net::CompletionOnceCallback done) { … }
bool BlobReader::has_side_data() const { … }
void BlobReader::ReadSideData(StatusCallback done) { … }
std::optional<mojo_base::BigBuffer> BlobReader::TakeSideData() { … }
void BlobReader::DidReadSideData(StatusCallback done,
int expected_size,
int result,
mojo_base::BigBuffer data) { … }
BlobReader::Status BlobReader::SetReadRange(uint64_t offset, uint64_t length) { … }
BlobReader::Status BlobReader::Read(net::IOBuffer* buffer,
size_t dest_size,
int* bytes_read,
net::CompletionOnceCallback done) { … }
bool BlobReader::IsSingleMojoDataItem() const { … }
void BlobReader::ReadSingleMojoDataItem(
mojo::ScopedDataPipeProducerHandle producer,
net::CompletionOnceCallback done) { … }
void BlobReader::Kill() { … }
bool BlobReader::IsInMemory() const { … }
void BlobReader::InvalidateCallbacksAndDone(int net_error,
net::CompletionOnceCallback done) { … }
BlobReader::Status BlobReader::ReportError(int net_error) { … }
void BlobReader::AsyncCalculateSize(net::CompletionOnceCallback done,
BlobStatus status) { … }
BlobReader::Status BlobReader::CalculateSizeImpl(
net::CompletionOnceCallback* done) { … }
bool BlobReader::AddItemLength(size_t index, uint64_t item_length) { … }
bool BlobReader::ResolveFileItemLength(const BlobDataItem& item,
int64_t total_length,
uint64_t* output_length) { … }
void BlobReader::DidGetFileItemLength(size_t index, int64_t result) { … }
void BlobReader::DidCountSize() { … }
BlobReader::Status BlobReader::ReadLoop(int* bytes_read) { … }
BlobReader::Status BlobReader::ReadItem() { … }
void BlobReader::AdvanceItem() { … }
void BlobReader::AdvanceBytesRead(int result) { … }
void BlobReader::ReadBytesItem(const BlobDataItem& item, int bytes_to_read) { … }
BlobReader::Status BlobReader::ReadFileItem(
FileStreamReader* reader,
int bytes_to_read,
file_access::ScopedFileAccessDelegate::RequestFilesAccessIOCallback
file_access) { … }
void BlobReader::DidReadFile(int result) { … }
void BlobReader::ContinueAsyncReadLoop() { … }
void BlobReader::DeleteItemReaders() { … }
BlobReader::Status BlobReader::ReadReadableDataHandle(const BlobDataItem& item,
int bytes_to_read) { … }
void BlobReader::DidReadReadableDataHandle(int result) { … }
void BlobReader::DidReadItem(int result) { … }
int BlobReader::BytesReadCompleted() { … }
int BlobReader::ComputeBytesToRead() const { … }
FileStreamReader* BlobReader::GetOrCreateFileReaderAtIndex(size_t index) { … }
std::unique_ptr<FileStreamReader> BlobReader::CreateFileStreamReader(
const BlobDataItem& item,
uint64_t additional_offset) { … }
void BlobReader::SetFileReaderAtIndex(
size_t index,
std::unique_ptr<FileStreamReader> reader) { … }
network::DataPipeToSourceStream* BlobReader::GetOrCreateDataPipeAtIndex(
size_t index) { … }
void BlobReader::SetDataPipeAtIndex(
size_t index,
std::unique_ptr<network::DataPipeToSourceStream> pipe) { … }
std::unique_ptr<network::DataPipeToSourceStream> BlobReader::CreateDataPipe(
const BlobDataItem& item,
uint64_t additional_offset) { … }
void BlobReader::RecordBytesReadFromDataHandle(int item_index, int result) { … }
}