| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 | 9 |
| 10 #include "base/numerics/safe_math.h" | 10 #include "base/numerics/safe_math.h" |
| 11 #include "base/strings/string_number_conversions.h" |
| 11 #include "storage/browser/blob/blob_async_transport_request_builder.h" | 12 #include "storage/browser/blob/blob_async_transport_request_builder.h" |
| 12 #include "storage/common/blob_storage/blob_storage_constants.h" | 13 #include "storage/common/blob_storage/blob_storage_constants.h" |
| 13 | 14 |
| 14 namespace storage { | 15 namespace storage { |
| 15 namespace { | 16 namespace { |
| 16 bool IsBytes(DataElement::Type type) { | 17 bool IsBytes(DataElement::Type type) { |
| 17 return type == DataElement::TYPE_BYTES || | 18 return type == DataElement::TYPE_BYTES || |
| 18 type == DataElement::TYPE_BYTES_DESCRIPTION; | 19 type == DataElement::TYPE_BYTES_DESCRIPTION; |
| 19 } | 20 } |
| 20 | 21 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 request.browser_item_offset = 0; | 55 request.browser_item_offset = 0; |
| 55 request.message.request_number = requests->size(); | 56 request.message.request_number = requests->size(); |
| 56 request.message.transport_strategy = IPCBlobItemRequestStrategy::FILE; | 57 request.message.transport_strategy = IPCBlobItemRequestStrategy::FILE; |
| 57 request.message.renderer_item_index = element_index; | 58 request.message.renderer_item_index = element_index; |
| 58 request.message.renderer_item_offset = element_offset; | 59 request.message.renderer_item_offset = element_offset; |
| 59 request.message.size = size; | 60 request.message.size = size; |
| 60 request.message.handle_index = segment_index; | 61 request.message.handle_index = segment_index; |
| 61 request.message.handle_offset = segment_offset; | 62 request.message.handle_offset = segment_offset; |
| 62 | 63 |
| 63 requests->push_back(request); | 64 requests->push_back(request); |
| 64 builder->AppendFutureFile(segment_offset, size); | 65 builder->AppendFutureFile(segment_offset, size, |
| 66 base::SizeTToString(segment_index)); |
| 65 current_item_index++; | 67 current_item_index++; |
| 66 } | 68 } |
| 67 | 69 |
| 68 void VisitNonBytesSegment(const DataElement& element, size_t element_index) { | 70 void VisitNonBytesSegment(const DataElement& element, size_t element_index) { |
| 69 builder->AppendIPCDataElement(element); | 71 builder->AppendIPCDataElement(element); |
| 70 current_item_index++; | 72 current_item_index++; |
| 71 } | 73 } |
| 72 | 74 |
| 73 void Done() {} | 75 void Done() {} |
| 74 | 76 |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 request.message.transport_strategy = IPCBlobItemRequestStrategy::IPC; | 256 request.message.transport_strategy = IPCBlobItemRequestStrategy::IPC; |
| 255 request.message.renderer_item_index = i; | 257 request.message.renderer_item_index = i; |
| 256 request.message.renderer_item_offset = 0; | 258 request.message.renderer_item_offset = 0; |
| 257 request.message.size = info.length(); | 259 request.message.size = info.length(); |
| 258 requests_.push_back(request); | 260 requests_.push_back(request); |
| 259 builder->AppendFutureData(info.length()); | 261 builder->AppendFutureData(info.length()); |
| 260 } | 262 } |
| 261 } | 263 } |
| 262 | 264 |
| 263 /* static */ | 265 /* static */ |
| 264 bool BlobAsyncTransportRequestBuilder::ShouldBeShortcut( | |
| 265 const std::vector<DataElement>& elements, | |
| 266 size_t memory_available) { | |
| 267 base::CheckedNumeric<size_t> shortcut_bytes = 0; | |
| 268 for (const auto& element : elements) { | |
| 269 DataElement::Type type = element.type(); | |
| 270 if (type == DataElement::TYPE_BYTES_DESCRIPTION) { | |
| 271 return false; | |
| 272 } | |
| 273 if (type == DataElement::TYPE_BYTES) { | |
| 274 shortcut_bytes += element.length(); | |
| 275 if (!shortcut_bytes.IsValid()) { | |
| 276 return false; | |
| 277 } | |
| 278 } | |
| 279 } | |
| 280 return shortcut_bytes.ValueOrDie() <= memory_available; | |
| 281 } | |
| 282 | |
| 283 /* static */ | |
| 284 void BlobAsyncTransportRequestBuilder::ComputeHandleSizes( | 266 void BlobAsyncTransportRequestBuilder::ComputeHandleSizes( |
| 285 uint64_t total_memory_size, | 267 uint64_t total_memory_size, |
| 286 size_t max_segment_size, | 268 size_t max_segment_size, |
| 287 std::vector<size_t>* segment_sizes) { | 269 std::vector<size_t>* segment_sizes) { |
| 288 size_t total_max_segments = | 270 size_t total_max_segments = |
| 289 static_cast<size_t>(total_memory_size / max_segment_size); | 271 static_cast<size_t>(total_memory_size / max_segment_size); |
| 290 bool has_extra_segment = (total_memory_size % max_segment_size) > 0; | 272 bool has_extra_segment = (total_memory_size % max_segment_size) > 0; |
| 291 segment_sizes->reserve(total_max_segments + (has_extra_segment ? 1 : 0)); | 273 segment_sizes->reserve(total_max_segments + (has_extra_segment ? 1 : 0)); |
| 292 segment_sizes->insert(segment_sizes->begin(), total_max_segments, | 274 segment_sizes->insert(segment_sizes->begin(), total_max_segments, |
| 293 max_segment_size); | 275 max_segment_size); |
| 294 if (has_extra_segment) { | 276 if (has_extra_segment) { |
| 295 segment_sizes->push_back(total_memory_size % max_segment_size); | 277 segment_sizes->push_back(total_memory_size % max_segment_size); |
| 296 } | 278 } |
| 297 } | 279 } |
| 298 | 280 |
| 299 } // namespace storage | 281 } // namespace storage |
| OLD | NEW |