Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "storage/browser/blob/blob_reader.h" | 5 #include "storage/browser/blob/blob_reader.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <memory> | 12 #include <memory> |
| 13 #include <utility> | 13 #include <utility> |
| 14 | 14 |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/callback_helpers.h" | 16 #include "base/callback_helpers.h" |
| 17 #include "base/sequenced_task_runner.h" | 17 #include "base/sequenced_task_runner.h" |
| 18 #include "base/stl_util.h" | |
| 19 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 20 #include "base/trace_event/trace_event.h" | 19 #include "base/trace_event/trace_event.h" |
| 21 #include "net/base/io_buffer.h" | 20 #include "net/base/io_buffer.h" |
| 22 #include "net/base/net_errors.h" | 21 #include "net/base/net_errors.h" |
| 23 #include "net/disk_cache/disk_cache.h" | 22 #include "net/disk_cache/disk_cache.h" |
| 24 #include "storage/browser/blob/blob_data_handle.h" | 23 #include "storage/browser/blob/blob_data_handle.h" |
| 25 #include "storage/browser/blob/blob_data_snapshot.h" | 24 #include "storage/browser/blob/blob_data_snapshot.h" |
| 26 #include "storage/browser/fileapi/file_stream_reader.h" | 25 #include "storage/browser/fileapi/file_stream_reader.h" |
| 27 #include "storage/browser/fileapi/file_system_context.h" | 26 #include "storage/browser/fileapi/file_system_context.h" |
| 28 #include "storage/browser/fileapi/file_system_url.h" | 27 #include "storage/browser/fileapi/file_system_url.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 : file_stream_provider_(std::move(file_stream_provider)), | 68 : file_stream_provider_(std::move(file_stream_provider)), |
| 70 file_task_runner_(file_task_runner), | 69 file_task_runner_(file_task_runner), |
| 71 net_error_(net::OK), | 70 net_error_(net::OK), |
| 72 weak_factory_(this) { | 71 weak_factory_(this) { |
| 73 if (blob_handle && !blob_handle->IsBroken()) { | 72 if (blob_handle && !blob_handle->IsBroken()) { |
| 74 blob_handle_.reset(new BlobDataHandle(*blob_handle)); | 73 blob_handle_.reset(new BlobDataHandle(*blob_handle)); |
| 75 } | 74 } |
| 76 } | 75 } |
| 77 | 76 |
| 78 BlobReader::~BlobReader() { | 77 BlobReader::~BlobReader() { |
| 79 base::STLDeleteValues(&index_to_reader_); | |
| 80 } | 78 } |
| 81 | 79 |
| 82 BlobReader::Status BlobReader::CalculateSize( | 80 BlobReader::Status BlobReader::CalculateSize( |
| 83 const net::CompletionCallback& done) { | 81 const net::CompletionCallback& done) { |
| 84 DCHECK(!total_size_calculated_); | 82 DCHECK(!total_size_calculated_); |
| 85 DCHECK(size_callback_.is_null()); | 83 DCHECK(size_callback_.is_null()); |
| 86 if (!blob_handle_.get() || blob_handle_->IsBroken()) { | 84 if (!blob_handle_.get() || blob_handle_->IsBroken()) { |
| 87 return ReportError(net::ERR_FILE_NOT_FOUND); | 85 return ReportError(net::ERR_FILE_NOT_FOUND); |
| 88 } | 86 } |
| 89 if (blob_handle_->IsBeingBuilt()) { | 87 if (blob_handle_->IsBeingBuilt()) { |
| (...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 613 | 611 |
| 614 FileStreamReader* BlobReader::GetOrCreateFileReaderAtIndex(size_t index) { | 612 FileStreamReader* BlobReader::GetOrCreateFileReaderAtIndex(size_t index) { |
| 615 const auto& items = blob_data_->items(); | 613 const auto& items = blob_data_->items(); |
| 616 DCHECK_LT(index, items.size()); | 614 DCHECK_LT(index, items.size()); |
| 617 const BlobDataItem& item = *items.at(index); | 615 const BlobDataItem& item = *items.at(index); |
| 618 if (!IsFileType(item.type())) | 616 if (!IsFileType(item.type())) |
| 619 return nullptr; | 617 return nullptr; |
| 620 auto it = index_to_reader_.find(index); | 618 auto it = index_to_reader_.find(index); |
| 621 if (it != index_to_reader_.end()) { | 619 if (it != index_to_reader_.end()) { |
| 622 DCHECK(it->second); | 620 DCHECK(it->second); |
| 623 return it->second; | 621 return it->second.get(); |
| 624 } | 622 } |
| 625 std::unique_ptr<FileStreamReader> reader = CreateFileStreamReader(item, 0); | 623 std::unique_ptr<FileStreamReader> reader = CreateFileStreamReader(item, 0); |
| 626 FileStreamReader* ret_value = reader.get(); | 624 FileStreamReader* ret_value = reader.get(); |
| 627 if (!ret_value) | 625 if (!ret_value) |
| 628 return nullptr; | 626 return nullptr; |
| 629 index_to_reader_[index] = reader.release(); | 627 index_to_reader_[index] = std::move(reader); |
| 630 return ret_value; | 628 return ret_value; |
| 631 } | 629 } |
| 632 | 630 |
| 633 std::unique_ptr<FileStreamReader> BlobReader::CreateFileStreamReader( | 631 std::unique_ptr<FileStreamReader> BlobReader::CreateFileStreamReader( |
| 634 const BlobDataItem& item, | 632 const BlobDataItem& item, |
| 635 uint64_t additional_offset) { | 633 uint64_t additional_offset) { |
| 636 DCHECK(IsFileType(item.type())); | 634 DCHECK(IsFileType(item.type())); |
| 637 | 635 |
| 638 switch (item.type()) { | 636 switch (item.type()) { |
| 639 case DataElement::TYPE_FILE: | 637 case DataElement::TYPE_FILE: |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 655 break; | 653 break; |
| 656 } | 654 } |
| 657 | 655 |
| 658 NOTREACHED(); | 656 NOTREACHED(); |
| 659 return nullptr; | 657 return nullptr; |
| 660 } | 658 } |
| 661 | 659 |
| 662 void BlobReader::SetFileReaderAtIndex( | 660 void BlobReader::SetFileReaderAtIndex( |
| 663 size_t index, | 661 size_t index, |
| 664 std::unique_ptr<FileStreamReader> reader) { | 662 std::unique_ptr<FileStreamReader> reader) { |
| 665 auto found = index_to_reader_.find(current_item_index_); | 663 DCHECK_EQ(index, current_item_index_); |
|
Avi (use Gerrit)
2016/10/02 00:14:19
OK, what is going on here?
This function says "se
danakj
2016/10/03 22:51:49
Good question. +dmurph who wrote this.
dmurph
2016/10/04 19:23:24
Ah, sorry for this. You can remove the DCHECK, thi
| |
| 666 if (found != index_to_reader_.end()) { | 664 if (reader) |
| 667 if (found->second) { | 665 index_to_reader_[index] = std::move(reader); |
| 668 delete found->second; | 666 else |
| 669 } | 667 index_to_reader_.erase(index); |
| 670 if (!reader.get()) { | |
| 671 index_to_reader_.erase(found); | |
| 672 return; | |
| 673 } | |
| 674 found->second = reader.release(); | |
| 675 } else if (reader.get()) { | |
| 676 index_to_reader_[current_item_index_] = reader.release(); | |
| 677 } | |
| 678 } | 668 } |
| 679 | 669 |
| 680 } // namespace storage | 670 } // namespace storage |
| OLD | NEW |