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 if (reader) |
666 if (found != index_to_reader_.end()) { | 664 index_to_reader_[index] = std::move(reader); |
667 if (found->second) { | 665 else |
668 delete found->second; | 666 index_to_reader_.erase(index); |
669 } | |
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 } | 667 } |
679 | 668 |
680 } // namespace storage | 669 } // namespace storage |
OLD | NEW |