Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: storage/browser/blob/blob_data_builder.cc

Issue 1288373002: [BlobAsync] Patch 2: Common Constants (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@async1
Patch Set: comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « storage/browser/blob/blob_data_builder.h ('k') | storage/browser/blob/blob_data_item.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: storage/browser/blob/blob_data_builder.cc
diff --git a/storage/browser/blob/blob_data_builder.cc b/storage/browser/blob/blob_data_builder.cc
index 94fb9e50388633ba5bfcff901338603efc5039b6..2ebfe89e454b094b5bab1b27ca80013021351831 100644
--- a/storage/browser/blob/blob_data_builder.cc
+++ b/storage/browser/blob/blob_data_builder.cc
@@ -4,6 +4,8 @@
#include "storage/browser/blob/blob_data_builder.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/numerics/safe_math.h"
#include "base/time/time.h"
#include "net/disk_cache/disk_cache.h"
#include "storage/browser/blob/shareable_file_reference.h"
@@ -15,6 +17,34 @@ BlobDataBuilder::BlobDataBuilder(const std::string& uuid) : uuid_(uuid) {
BlobDataBuilder::~BlobDataBuilder() {
}
+void BlobDataBuilder::AppendIPCDataElement(const DataElement& ipc_data) {
+ uint64 length = ipc_data.length();
+ switch (ipc_data.type()) {
+ case DataElement::TYPE_BYTES:
+ DCHECK(!ipc_data.offset());
+ AppendData(ipc_data.bytes(), base::checked_cast<size_t, uint64>(length));
+ break;
+ case DataElement::TYPE_FILE:
+ AppendFile(ipc_data.path(), ipc_data.offset(), length,
+ ipc_data.expected_modification_time());
+ break;
+ case DataElement::TYPE_FILE_FILESYSTEM:
+ AppendFileSystemFile(ipc_data.filesystem_url(), ipc_data.offset(), length,
+ ipc_data.expected_modification_time());
+ break;
+ case DataElement::TYPE_BLOB:
+ // This is a temporary item that will be deconstructed later in
+ // BlobStorageContext.
+ AppendBlob(ipc_data.blob_uuid(), ipc_data.offset(), ipc_data.length());
+ break;
+ case DataElement::TYPE_BYTES_DESCRIPTION:
+ case DataElement::TYPE_UNKNOWN:
+ case DataElement::TYPE_DISK_CACHE_ENTRY: // This type can't be sent by IPC.
+ NOTREACHED();
+ break;
+ }
+}
+
void BlobDataBuilder::AppendData(const char* data, size_t length) {
if (!length)
return;
@@ -23,6 +53,46 @@ void BlobDataBuilder::AppendData(const char* data, size_t length) {
items_.push_back(new BlobDataItem(element.Pass()));
}
+size_t BlobDataBuilder::AppendFutureData(size_t length) {
+ CHECK_NE(length, 0u);
+ scoped_ptr<DataElement> element(new DataElement());
+ element->SetToBytesDescription(length);
+ items_.push_back(new BlobDataItem(element.Pass()));
+ return items_.size() - 1;
+}
+
+bool BlobDataBuilder::PopulateFutureData(size_t index,
+ const char* data,
+ size_t offset,
+ size_t length) {
+ DCHECK(data);
+ DataElement* element = items_.at(index)->data_element_ptr();
+
+ // We lazily allocate our data buffer by waiting until the first
+ // PopulateFutureData call.
+ // Why? The reason we have the AppendFutureData method is to create our Blob
+ // record when the Renderer tells us about the blob without actually
+ // allocating the memory yet, as we might not have the quota yet. So we don't
+ // want to allocate the memory until we're actually receiving the data (which
+ // the browser process only does when it has quota).
+ if (element->type() == DataElement::TYPE_BYTES_DESCRIPTION) {
+ element->SetToAllocatedBytes(element->length());
+ // The type of the element is now TYPE_BYTES.
+ }
+ if (element->type() != DataElement::TYPE_BYTES) {
+ DVLOG(1) << "Invalid item type.";
+ return false;
+ }
+ base::CheckedNumeric<size_t> checked_end = offset;
+ checked_end += length;
+ if (!checked_end.IsValid() || checked_end.ValueOrDie() > element->length()) {
+ DVLOG(1) << "Invalid offset or length.";
+ return false;
+ }
+ std::memcpy(element->mutable_bytes() + offset, data, length);
+ return true;
+}
+
void BlobDataBuilder::AppendFile(const base::FilePath& file_path,
uint64_t offset,
uint64_t length,
@@ -54,7 +124,7 @@ void BlobDataBuilder::AppendFileSystemFile(
uint64_t offset,
uint64_t length,
const base::Time& expected_modification_time) {
- DCHECK(length > 0);
+ DCHECK_GT(length, 0ul);
scoped_ptr<DataElement> element(new DataElement());
element->SetToFileSystemUrlRange(url, offset, length,
expected_modification_time);
@@ -73,4 +143,23 @@ void BlobDataBuilder::AppendDiskCacheEntry(
disk_cache_stream_index));
}
+void BlobDataBuilder::Clear() {
+ items_.clear();
+ content_disposition_.clear();
+ content_type_.clear();
+ uuid_.clear();
+}
+
+void PrintTo(const BlobDataBuilder& x, std::ostream* os) {
+ DCHECK(os);
+ *os << "<BlobDataBuilder>{uuid: " << x.uuid()
+ << ", content_type: " << x.content_type_
+ << ", content_disposition: " << x.content_disposition_ << ", items: [";
+ for (const auto& item : x.items_) {
+ PrintTo(*item, os);
+ *os << ", ";
+ }
+ *os << "]}";
+}
+
} // namespace storage
« no previous file with comments | « storage/browser/blob/blob_data_builder.h ('k') | storage/browser/blob/blob_data_item.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698