| // 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 |