Chromium Code Reviews| Index: webkit/blob/blob_url_request_job.cc |
| diff --git a/webkit/blob/blob_url_request_job.cc b/webkit/blob/blob_url_request_job.cc |
| index 07a4fc46c98286fbd16d573e3dbcda17f2fd8f18..d2e21a9c2fad5e41fe92df4fe6796fc9caba6069 100644 |
| --- a/webkit/blob/blob_url_request_job.cc |
| +++ b/webkit/blob/blob_url_request_job.cc |
| @@ -22,6 +22,8 @@ |
| #include "net/url_request/url_request_error_job.h" |
| #include "net/url_request/url_request_status.h" |
| #include "webkit/blob/local_file_stream_reader.h" |
| +#include "webkit/fileapi/file_system_context.h" |
| +#include "webkit/fileapi/file_system_file_stream_reader.h" |
|
kinuko
2012/10/18 11:57:54
not needed?
hashimoto
2012/10/18 13:38:13
Done.
|
| namespace webkit_blob { |
| @@ -44,16 +46,28 @@ const char kHTTPRequestedRangeNotSatisfiableText[] = |
| "Requested Range Not Satisfiable"; |
| const char kHTTPInternalErrorText[] = "Internal Server Error"; |
| +bool IsFileType(BlobData::Item::Type type) { |
| + switch (type) { |
| + case BlobData::Item::TYPE_FILE: |
| + case BlobData::Item::TYPE_FILE_FILESYSTEM: |
| + return true; |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| } // namespace |
| BlobURLRequestJob::BlobURLRequestJob( |
| net::URLRequest* request, |
| net::NetworkDelegate* network_delegate, |
| BlobData* blob_data, |
| + fileapi::FileSystemContext* file_system_context, |
| base::MessageLoopProxy* file_thread_proxy) |
| : net::URLRequestJob(request, network_delegate), |
| ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
| blob_data_(blob_data), |
| + file_system_context_(file_system_context), |
| file_thread_proxy_(file_thread_proxy), |
| total_size_(0), |
| remaining_bytes_(0), |
| @@ -177,7 +191,7 @@ void BlobURLRequestJob::CountSize() { |
| for (size_t i = 0; i < blob_data_->items().size(); ++i) { |
| const BlobData::Item& item = blob_data_->items().at(i); |
| - if (item.type() == BlobData::Item::TYPE_FILE) { |
| + if (IsFileType(item.type())) { |
| ++pending_get_file_info_count_; |
| GetFileStreamReader(i)->GetLength( |
| base::Bind(&BlobURLRequestJob::DidGetFileItemLength, |
| @@ -235,7 +249,7 @@ void BlobURLRequestJob::DidGetFileItemLength(size_t index, int64 result) { |
| DCHECK_LT(index, blob_data_->items().size()); |
| const BlobData::Item& item = blob_data_->items().at(index); |
| - DCHECK(item.type() == BlobData::Item::TYPE_FILE); |
| + DCHECK(IsFileType(item.type())); |
| // If item length is -1, we need to use the file size being resolved |
| // in the real time. |
| @@ -269,7 +283,7 @@ void BlobURLRequestJob::Seek(int64 offset) { |
| // Adjust the offset of the first stream if it is of file type. |
| const BlobData::Item& item = blob_data_->items().at(current_item_index_); |
| - if (item.type() == BlobData::Item::TYPE_FILE) { |
| + if (IsFileType(item.type())) { |
| DeleteCurrentFileReader(); |
| CreateFileStreamReader(current_item_index_, offset); |
| } |
| @@ -301,15 +315,14 @@ bool BlobURLRequestJob::ReadItem() { |
| switch (item.type()) { |
|
kinuko
2012/10/18 11:57:54
In this way there may not be much value to use swi
hashimoto
2012/10/18 13:38:13
Done.
|
| case BlobData::Item::TYPE_BYTES: |
| return ReadBytesItem(item, bytes_to_read); |
| - case BlobData::Item::TYPE_FILE: |
| - return ReadFileItem(GetFileStreamReader(current_item_index_), |
| - bytes_to_read); |
| - case BlobData::Item::TYPE_FILE_FILESYSTEM: |
| - // TODO(kinuko): Support TYPE_FILE_FILESYSTEM case. |
| - // http://crbug.com/141835 |
| default: |
| - DCHECK(false); |
| - return false; |
| + if (IsFileType(item.type())) { |
| + return ReadFileItem(GetFileStreamReader(current_item_index_), |
| + bytes_to_read); |
| + } else { |
| + NOTREACHED(); |
| + return false; |
| + } |
| } |
| } |
| @@ -351,7 +364,7 @@ bool BlobURLRequestJob::ReadBytesItem(const BlobData::Item& item, |
| return true; |
| } |
| -bool BlobURLRequestJob::ReadFileItem(LocalFileStreamReader* reader, |
| +bool BlobURLRequestJob::ReadFileItem(FileStreamReader* reader, |
| int bytes_to_read) { |
| DCHECK_GE(read_buf_->BytesRemaining(), bytes_to_read); |
| DCHECK(reader); |
| @@ -524,10 +537,10 @@ void BlobURLRequestJob::HeadersCompleted(int status_code, |
| NotifyHeadersComplete(); |
| } |
| -LocalFileStreamReader* BlobURLRequestJob::GetFileStreamReader(size_t index) { |
| +FileStreamReader* BlobURLRequestJob::GetFileStreamReader(size_t index) { |
| DCHECK_LT(index, blob_data_->items().size()); |
| const BlobData::Item& item = blob_data_->items().at(index); |
| - if (item.type() != BlobData::Item::TYPE_FILE) |
| + if (!IsFileType(item.type())) |
| return NULL; |
| if (index_to_reader_.find(index) == index_to_reader_.end()) |
| CreateFileStreamReader(index, 0); |
| @@ -539,15 +552,29 @@ void BlobURLRequestJob::CreateFileStreamReader(size_t index, |
| int64 additional_offset) { |
| DCHECK_LT(index, blob_data_->items().size()); |
| const BlobData::Item& item = blob_data_->items().at(index); |
| - DCHECK_EQ(BlobData::Item::TYPE_FILE, item.type()); |
| + DCHECK(IsFileType(item.type())); |
| DCHECK_EQ(0U, index_to_reader_.count(index)); |
| - // TODO(kinuko): Create appropriate FileStreamReader for TYPE_FILE_FILESYSTEM. |
| - // http://crbug.com/141835 |
| - index_to_reader_[index] = new LocalFileStreamReader( |
| - file_thread_proxy_, |
| - item.path(), |
| - item.offset() + additional_offset, |
| - item.expected_modification_time()); |
| + |
| + FileStreamReader* reader = NULL; |
| + switch (item.type()) { |
| + case BlobData::Item::TYPE_FILE: |
| + reader = new LocalFileStreamReader( |
| + file_thread_proxy_, |
| + item.path(), |
| + item.offset() + additional_offset, |
| + item.expected_modification_time()); |
| + break; |
| + case BlobData::Item::TYPE_FILE_FILESYSTEM: |
| + reader = file_system_context_->CreateFileStreamReader( |
| + fileapi::FileSystemURL(item.url()), |
| + item.offset() + additional_offset, |
| + item.expected_modification_time()); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + } |
| + DCHECK(reader); |
| + index_to_reader_[index] = reader; |
| } |
| } // namespace webkit_blob |