Index: chrome/browser/chromeos/drive/drive_file_stream_reader.cc |
diff --git a/chrome/browser/chromeos/drive/drive_file_stream_reader.cc b/chrome/browser/chromeos/drive/drive_file_stream_reader.cc |
index 4a5530fed586ac4612851e83dd35f89a310901ba..fd84ec3983b47389ff15ed233ace2a9b03c36960 100644 |
--- a/chrome/browser/chromeos/drive/drive_file_stream_reader.cc |
+++ b/chrome/browser/chromeos/drive/drive_file_stream_reader.cc |
@@ -339,7 +339,7 @@ int DriveFileStreamReader::Read(net::IOBuffer* buffer, int buffer_length, |
} |
void DriveFileStreamReader::InitializeAfterGetFileContentInitialized( |
- const net::HttpByteRange& in_byte_range, |
+ const net::HttpByteRange& byte_range, |
const InitializeCompletionCallback& callback, |
FileError error, |
scoped_ptr<ResourceEntry> entry, |
@@ -353,8 +353,14 @@ void DriveFileStreamReader::InitializeAfterGetFileContentInitialized( |
} |
DCHECK(entry); |
- net::HttpByteRange byte_range = in_byte_range; |
- if (!byte_range.ComputeBounds(entry->file_info().size())) { |
+ // Note: both boundary of |byte_range| are inclusive. |
+ // Convert it to half-exclusive range with missing bounds filled. |
hashimoto
2013/12/19 08:53:40
Is it OK to ignore suffix byte range?
kinaba
2013/12/20 03:57:55
Good catch. Recovered the support for suffix range
|
+ const int64 range_start = byte_range.HasFirstBytePosition() ? |
+ byte_range.first_byte_position() : 0; |
+ const int64 range_end = byte_range.HasLastBytePosition() ? |
+ byte_range.last_byte_position() + 1 : entry->file_info().size(); |
+ |
+ if (range_start > range_end || entry->file_info().size() < range_end) { |
// If |byte_range| is invalid (e.g. out of bounds), return with an error. |
// At the same time, we cancel the in-flight downloading operation if |
// needed and and invalidate weak pointers so that we won't |
@@ -367,17 +373,12 @@ void DriveFileStreamReader::InitializeAfterGetFileContentInitialized( |
return; |
} |
- // Note: both boundary of |byte_range| are inclusive. |
- int64 range_length = |
- byte_range.last_byte_position() - byte_range.first_byte_position() + 1; |
- DCHECK_GE(range_length, 0); |
- |
if (local_cache_file_path.empty()) { |
// The file is not cached, and being downloaded. |
DCHECK(!ui_cancel_download_closure.is_null()); |
reader_proxy_.reset( |
new internal::NetworkReaderProxy( |
- byte_range.first_byte_position(), range_length, |
+ range_start, range_end - range_start, |
base::Bind(&RunTaskOnUIThread, ui_cancel_download_closure))); |
callback.Run(net::OK, entry.Pass()); |
return; |
@@ -389,11 +390,11 @@ void DriveFileStreamReader::InitializeAfterGetFileContentInitialized( |
util::LocalFileReader* file_reader_ptr = file_reader.get(); |
file_reader_ptr->Open( |
local_cache_file_path, |
- byte_range.first_byte_position(), |
+ range_start, |
base::Bind( |
&DriveFileStreamReader::InitializeAfterLocalFileOpen, |
weak_ptr_factory_.GetWeakPtr(), |
- range_length, |
+ range_end - range_start, |
callback, |
base::Passed(&entry), |
base::Passed(&file_reader))); |