| Index: net/base/upload_disk_cache_entry_element_reader.cc
 | 
| diff --git a/net/base/upload_disk_cache_entry_element_reader.cc b/net/base/upload_disk_cache_entry_element_reader.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..0635aeb1322b551d1af123f37e017b068a84e2e7
 | 
| --- /dev/null
 | 
| +++ b/net/base/upload_disk_cache_entry_element_reader.cc
 | 
| @@ -0,0 +1,90 @@
 | 
| +// 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
 | 
| 
 |