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..ad569ad68361409f9bd7f3f90b02b8ef1e0a93a4 |
--- /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_LE(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 |