Chromium Code Reviews| Index: content/child/blob_storage/blob_consolidation.cc |
| diff --git a/content/child/blob_storage/blob_consolidation.cc b/content/child/blob_storage/blob_consolidation.cc |
| index c912699d37579d6aefb78fed0320d7f4c54397b2..c07ea0f8ff8b618c8e8dad69672e3faeefa33464 100644 |
| --- a/content/child/blob_storage/blob_consolidation.cc |
| +++ b/content/child/blob_storage/blob_consolidation.cc |
| @@ -10,10 +10,23 @@ |
| #include <limits> |
| #include <string> |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| + |
| using storage::DataElement; |
| using blink::WebThreadSafeData; |
| namespace content { |
| +namespace { |
| +bool WriteMemory(void* memory_out, |
| + size_t* total_read, |
| + const char* memory, |
| + size_t size) { |
| + memcpy(static_cast<char*>(memory_out) + *total_read, memory, size); |
| + *total_read += size; |
| + return true; |
| +} |
| +} // namespace |
| using ReadStatus = BlobConsolidation::ReadStatus; |
| @@ -99,11 +112,12 @@ void BlobConsolidation::AddFileSystemItem(const GURL& url, |
| item.expected_modification_time = expected_modification_time; |
| } |
| -ReadStatus BlobConsolidation::ReadMemory(size_t consolidated_item_index, |
| - size_t consolidated_offset, |
| - size_t consolidated_size, |
| - void* memory_out) { |
| - CHECK(memory_out); |
| +ReadStatus BlobConsolidation::VisitMemory( |
| + size_t consolidated_item_index, |
| + size_t consolidated_offset, |
| + size_t consolidated_size, |
| + base::Callback<bool(const char* /* memory */, size_t /* memory_size */)> |
|
michaeln
2016/04/28 00:16:56
ditto VisitorFunction
dmurph
2016/05/09 19:55:47
Done.
|
| + visitor) const { |
| if (consolidated_item_index >= consolidated_items_.size()) |
| return ReadStatus::ERROR_OUT_OF_BOUNDS; |
| @@ -112,9 +126,6 @@ ReadStatus BlobConsolidation::ReadMemory(size_t consolidated_item_index, |
| return ReadStatus::ERROR_WRONG_TYPE; |
| if (consolidated_size + consolidated_offset > item.length) { |
| - LOG(ERROR) << "Invalid consolidated size " << consolidated_size |
| - << " and offset " << consolidated_offset << " vs item length of " |
| - << item.length; |
| return ReadStatus::ERROR_OUT_OF_BOUNDS; |
| } |
| @@ -155,12 +166,25 @@ ReadStatus BlobConsolidation::ReadMemory(size_t consolidated_item_index, |
| mid < num_items && memory_read < consolidated_size; mid++) { |
| size_t read_size = std::min(item.data[mid].size() - offset_from_mid, |
| consolidated_size - memory_read); |
| - memcpy(static_cast<char*>(memory_out) + memory_read, |
| - item.data[mid].data() + offset_from_mid, read_size); |
| + bool continu = |
| + visitor.Run(item.data[mid].data() + offset_from_mid, read_size); |
| + // If the visitor doesn't want to continue then we return early. |
|
michaeln
2016/04/28 00:16:56
return CANCELLED_BY_VISITOR makes it pretty clear
dmurph
2016/05/09 19:55:47
ok.
|
| + if (!continu) |
| + return ReadStatus::CANCELLED_BY_VISITOR; |
| offset_from_mid = 0; |
| memory_read += read_size; |
| } |
| return ReadStatus::OK; |
| } |
| +ReadStatus BlobConsolidation::ReadMemory(size_t consolidated_item_index, |
| + size_t consolidated_offset, |
| + size_t consolidated_size, |
| + void* memory_out) const { |
| + size_t total_read = 0; |
| + return VisitMemory(consolidated_item_index, consolidated_offset, |
| + consolidated_size, |
| + base::Bind(&WriteMemory, memory_out, &total_read)); |
| +} |
| + |
| } // namespace content |