blob: 0635aeb1322b551d1af123f37e017b068a84e2e7 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/base/upload_disk_cache_entry_element_reader.h"
#include <algorithm>
#include "base/bind.h"
#include "base/logging.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/disk_cache/disk_cache.h"
namespace net {
UploadDiskCacheEntryElementReader::UploadDiskCacheEntryElementReader(
disk_cache::Entry* disk_cache_entry,
int disk_cache_stream_index,
int range_offset,
int range_length)
: disk_cache_entry_(disk_cache_entry),
disk_cache_stream_index_(disk_cache_stream_index),
range_begin_offset_(range_offset),
range_end_offset_(range_offset + range_length),
current_read_offset_(range_offset),
weak_factory_(this) {
DCHECK_LE(0, range_offset);
DCHECK_LT(0, range_length);
DCHECK_LE(range_offset + range_length,
disk_cache_entry_->GetDataSize(disk_cache_stream_index_));
}
UploadDiskCacheEntryElementReader::~UploadDiskCacheEntryElementReader() {
}
const UploadDiskCacheEntryElementReader*
UploadDiskCacheEntryElementReader::AsDiskCacheEntryReaderForTests() const {
return this;
}
int UploadDiskCacheEntryElementReader::Init(
const CompletionCallback& callback) {
weak_factory_.InvalidateWeakPtrs();
current_read_offset_ = range_begin_offset_;
return OK;
}
uint64_t UploadDiskCacheEntryElementReader::GetContentLength() const {
return range_end_offset_ - range_begin_offset_;
}
uint64_t UploadDiskCacheEntryElementReader::BytesRemaining() const {
return range_end_offset_ - current_read_offset_;
}
bool UploadDiskCacheEntryElementReader::IsInMemory() const {
return false;
}
int UploadDiskCacheEntryElementReader::Read(
IOBuffer* buf,
int buf_length,
const CompletionCallback& callback) {
DCHECK(!callback.is_null());
int bytes_to_read = std::min(buf_length, static_cast<int>(BytesRemaining()));
CompletionCallback new_callback =
base::Bind(&UploadDiskCacheEntryElementReader::OnReadCompleted,
weak_factory_.GetWeakPtr(), callback);
int result = disk_cache_entry_->ReadData(disk_cache_stream_index_,
current_read_offset_, buf,
bytes_to_read, new_callback);
if (result == ERR_IO_PENDING)
return ERR_IO_PENDING;
if (result > 0)
current_read_offset_ += result;
return result;
}
void UploadDiskCacheEntryElementReader::OnReadCompleted(
const CompletionCallback& callback,
int result) {
if (result > 0)
current_read_offset_ += result;
callback.Run(result);
}
} // namespace net