| Index: storage/browser/blob/blob_url_request_job.cc
|
| diff --git a/storage/browser/blob/blob_url_request_job.cc b/storage/browser/blob/blob_url_request_job.cc
|
| index 41e79429b241a6b89ecb70e76bbe4eb219daf72f..793384624876ec99312ea93cc5dab0c33c8f8857 100644
|
| --- a/storage/browser/blob/blob_url_request_job.cc
|
| +++ b/storage/browser/blob/blob_url_request_job.cc
|
| @@ -34,15 +34,16 @@
|
| #include "storage/browser/blob/file_stream_reader.h"
|
| #include "storage/browser/fileapi/file_system_context.h"
|
| #include "storage/browser/fileapi/file_system_url.h"
|
| +#include "storage/common/data_element.h"
|
|
|
| namespace storage {
|
|
|
| namespace {
|
|
|
| -bool IsFileType(BlobData::Item::Type type) {
|
| +bool IsFileType(DataElement::Type type) {
|
| switch (type) {
|
| - case BlobData::Item::TYPE_FILE:
|
| - case BlobData::Item::TYPE_FILE_FILESYSTEM:
|
| + case DataElement::TYPE_FILE:
|
| + case DataElement::TYPE_FILE_FILESYSTEM:
|
| return true;
|
| default:
|
| return false;
|
| @@ -54,7 +55,7 @@ bool IsFileType(BlobData::Item::Type type) {
|
| BlobURLRequestJob::BlobURLRequestJob(
|
| net::URLRequest* request,
|
| net::NetworkDelegate* network_delegate,
|
| - const scoped_refptr<BlobData>& blob_data,
|
| + const BlobDataSnapshot* blob_data,
|
| storage::FileSystemContext* file_system_context,
|
| base::MessageLoopProxy* file_thread_proxy)
|
| : net::URLRequestJob(request, network_delegate),
|
| @@ -174,7 +175,7 @@ void BlobURLRequestJob::DidStart() {
|
| }
|
|
|
| // If the blob data is not present, bail out.
|
| - if (!blob_data_.get()) {
|
| + if (!blob_data_) {
|
| NotifyFailure(net::ERR_FILE_NOT_FOUND);
|
| return;
|
| }
|
| @@ -198,10 +199,11 @@ bool BlobURLRequestJob::AddItemLength(size_t index, int64 item_length) {
|
| void BlobURLRequestJob::CountSize() {
|
| pending_get_file_info_count_ = 0;
|
| total_size_ = 0;
|
| - item_length_list_.resize(blob_data_->items().size());
|
| + auto& items = blob_data_->items();
|
| + item_length_list_.resize(items.size());
|
|
|
| - for (size_t i = 0; i < blob_data_->items().size(); ++i) {
|
| - const BlobData::Item& item = blob_data_->items().at(i);
|
| + for (size_t i = 0; i < items.size(); ++i) {
|
| + const BlobDataItem& item = *items.at(i);
|
| if (IsFileType(item.type())) {
|
| ++pending_get_file_info_count_;
|
| GetFileStreamReader(i)->GetLength(
|
| @@ -257,8 +259,9 @@ void BlobURLRequestJob::DidGetFileItemLength(size_t index, int64 result) {
|
| return;
|
| }
|
|
|
| - DCHECK_LT(index, blob_data_->items().size());
|
| - const BlobData::Item& item = blob_data_->items().at(index);
|
| + auto& items = blob_data_->items();
|
| + DCHECK_LT(index, items.size());
|
| + const BlobDataItem& item = *items.at(index);
|
| DCHECK(IsFileType(item.type()));
|
|
|
| uint64 file_length = result;
|
| @@ -290,8 +293,9 @@ void BlobURLRequestJob::DidGetFileItemLength(size_t index, int64 result) {
|
|
|
| void BlobURLRequestJob::Seek(int64 offset) {
|
| // Skip the initial items that are not in the range.
|
| + auto& items = blob_data_->items();
|
| for (current_item_index_ = 0;
|
| - current_item_index_ < blob_data_->items().size() &&
|
| + current_item_index_ < items.size() &&
|
| offset >= item_length_list_[current_item_index_];
|
| ++current_item_index_) {
|
| offset -= item_length_list_[current_item_index_];
|
| @@ -304,7 +308,7 @@ void BlobURLRequestJob::Seek(int64 offset) {
|
| return;
|
|
|
| // Adjust the offset of the first stream if it is of file type.
|
| - const BlobData::Item& item = blob_data_->items().at(current_item_index_);
|
| + const BlobDataItem& item = *items.at(current_item_index_);
|
| if (IsFileType(item.type())) {
|
| DeleteCurrentFileReader();
|
| CreateFileStreamReader(current_item_index_, offset);
|
| @@ -316,9 +320,10 @@ bool BlobURLRequestJob::ReadItem() {
|
| if (remaining_bytes_ == 0)
|
| return true;
|
|
|
| + auto& items = blob_data_->items();
|
| // If we get to the last item but still expect something to read, bail out
|
| // since something is wrong.
|
| - if (current_item_index_ >= blob_data_->items().size()) {
|
| + if (current_item_index_ >= items.size()) {
|
| NotifyFailure(net::ERR_FAILED);
|
| return false;
|
| }
|
| @@ -333,8 +338,8 @@ bool BlobURLRequestJob::ReadItem() {
|
| }
|
|
|
| // Do the reading.
|
| - const BlobData::Item& item = blob_data_->items().at(current_item_index_);
|
| - if (item.type() == BlobData::Item::TYPE_BYTES)
|
| + const BlobDataItem& item = *items.at(current_item_index_);
|
| + if (item.type() == DataElement::TYPE_BYTES)
|
| return ReadBytesItem(item, bytes_to_read);
|
| if (IsFileType(item.type())) {
|
| return ReadFileItem(GetFileStreamReader(current_item_index_),
|
| @@ -370,7 +375,7 @@ void BlobURLRequestJob::AdvanceBytesRead(int result) {
|
| DCHECK_GE(read_buf_->BytesRemaining(), 0);
|
| }
|
|
|
| -bool BlobURLRequestJob::ReadBytesItem(const BlobData::Item& item,
|
| +bool BlobURLRequestJob::ReadBytesItem(const BlobDataItem& item,
|
| int bytes_to_read) {
|
| DCHECK_GE(read_buf_->BytesRemaining(), bytes_to_read);
|
|
|
| @@ -533,15 +538,16 @@ void BlobURLRequestJob::HeadersCompleted(net::HttpStatusCode status_code) {
|
| content_range_header.append(base::StringPrintf("%" PRId64, total_size_));
|
| headers->AddHeader(content_range_header);
|
| }
|
| - if (!blob_data_->content_type().empty()) {
|
| + auto* data = blob_data_;
|
| + if (!data->content_type().empty()) {
|
| std::string content_type_header(net::HttpRequestHeaders::kContentType);
|
| content_type_header.append(": ");
|
| - content_type_header.append(blob_data_->content_type());
|
| + content_type_header.append(data->content_type());
|
| headers->AddHeader(content_type_header);
|
| }
|
| - if (!blob_data_->content_disposition().empty()) {
|
| + if (!data->content_disposition().empty()) {
|
| std::string content_disposition_header("Content-Disposition: ");
|
| - content_disposition_header.append(blob_data_->content_disposition());
|
| + content_disposition_header.append(data->content_disposition());
|
| headers->AddHeader(content_disposition_header);
|
| }
|
| }
|
| @@ -555,8 +561,9 @@ void BlobURLRequestJob::HeadersCompleted(net::HttpStatusCode status_code) {
|
| }
|
|
|
| FileStreamReader* BlobURLRequestJob::GetFileStreamReader(size_t index) {
|
| - DCHECK_LT(index, blob_data_->items().size());
|
| - const BlobData::Item& item = blob_data_->items().at(index);
|
| + auto& items = blob_data_->items();
|
| + DCHECK_LT(index, items.size());
|
| + const BlobDataItem& item = *items.at(index);
|
| if (!IsFileType(item.type()))
|
| return NULL;
|
| if (index_to_reader_.find(index) == index_to_reader_.end())
|
| @@ -567,21 +574,22 @@ FileStreamReader* BlobURLRequestJob::GetFileStreamReader(size_t index) {
|
|
|
| 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);
|
| + auto& items = blob_data_->items();
|
| + DCHECK_LT(index, items.size());
|
| + const BlobDataItem& item = *items.at(index);
|
| DCHECK(IsFileType(item.type()));
|
| DCHECK_EQ(0U, index_to_reader_.count(index));
|
|
|
| FileStreamReader* reader = NULL;
|
| switch (item.type()) {
|
| - case BlobData::Item::TYPE_FILE:
|
| + case DataElement::TYPE_FILE:
|
| reader = FileStreamReader::CreateForLocalFile(
|
| file_thread_proxy_.get(),
|
| item.path(),
|
| item.offset() + additional_offset,
|
| item.expected_modification_time());
|
| break;
|
| - case BlobData::Item::TYPE_FILE_FILESYSTEM:
|
| + case DataElement::TYPE_FILE_FILESYSTEM:
|
| reader = file_system_context_
|
| ->CreateFileStreamReader(
|
| storage::FileSystemURL(file_system_context_->CrackURL(
|
|
|