Index: content/child/blob_storage/blob_consolidation.h |
diff --git a/content/child/blob_storage/blob_consolidation.h b/content/child/blob_storage/blob_consolidation.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b47352217402dea0fa0b4354d082d8253d95505a |
--- /dev/null |
+++ b/content/child/blob_storage/blob_consolidation.h |
@@ -0,0 +1,104 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CONTENT_CHILD_BLOB_STORAGE_BLOB_CONSOLIDATION_H_ |
+#define CONTENT_CHILD_BLOB_STORAGE_BLOB_CONSOLIDATION_H_ |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/logging.h" |
+#include "base/macros.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "content/common/content_export.h" |
+#include "storage/common/data_element.h" |
+#include "third_party/WebKit/public/platform/WebThreadSafeData.h" |
+ |
+namespace content { |
+ |
+// This class facilitates the consolidation of memory items in blobs. No memory |
+// is copied to store items in this object. Instead, the memory is copied into |
+// the external char* array given to the ReadMemory method. |
+// Features: |
+// * Add_Item methods for building the blob. |
+// * consolidated_items for getting the consolidated items. This is |
+// used to describe the blob to the browser. |
+// * total_memory to get the total memory size of the blob. |
+// * ReadMemory for reading arbitrary memory from any consolidated item. |
+// |
+// NOTE: this class does not do memory accounting or garbage collecting. The |
+// memory for the blob sticks around until this class is destructed. |
+class CONTENT_EXPORT BlobConsolidation { |
+ public: |
+ enum class ReadStatus { |
+ ERROR_UNKNOWN, |
+ ERROR_WRONG_TYPE, |
+ ERROR_OUT_OF_BOUNDS, |
+ OK |
+ }; |
+ struct ConsolidatedItem { |
+ ConsolidatedItem(); |
+ ConsolidatedItem(storage::DataElement::Type type, |
+ uint64_t offset, |
+ uint64_t length); |
+ ~ConsolidatedItem(); |
+ |
+ storage::DataElement::Type type; |
+ uint64_t offset; |
+ uint64_t length; |
+ |
+ base::FilePath path; // For TYPE_FILE. |
+ GURL filesystem_url; // For TYPE_FILE_FILESYSTEM. |
+ double expected_modification_time; // For TYPE_FILE, TYPE_FILE_FILESYSTEM. |
+ std::string blob_uuid; // For TYPE_BLOB. |
+ // Only populated if len(items) > 1. Used for binary search. |
+ // Since the offset of the first item is always 0, we exclude this. |
+ std::vector<size_t> offsets; // For TYPE_BYTES. |
+ std::vector<blink::WebThreadSafeData> data; // For TYPE_BYTES. |
+ }; |
+ |
+ BlobConsolidation(); |
+ ~BlobConsolidation(); |
+ |
+ void AddDataItem(const blink::WebThreadSafeData& data); |
+ void AddFileItem(const base::FilePath& path, |
+ uint64_t offset, |
+ uint64_t length, |
+ double expected_modification_time); |
+ void AddBlobItem(const std::string& uuid, uint64_t offset, uint64_t length); |
+ void AddFileSystemItem(const GURL& url, |
+ uint64_t offset, |
+ uint64_t length, |
+ double expected_modification_time); |
+ |
+ // These are the resulting consolidated items, constructed from the Add* |
+ // methods. This configuration is used to describe the data to the browser, |
+ // even though one consolidated memory items can contain multiple data parts. |
+ const std::vector<ConsolidatedItem>& consolidated_items() const { |
+ return consolidated_items_; |
+ } |
+ |
+ size_t total_memory() const { return total_memory_; } |
+ |
+ // Reads memory from the given item into the given buffer. Returns: |
+ // * ReadStatus::ERROR if the state or arguments are invalid (see error log), |
+ // * ReadStatus::ERROR_WRONG_TYPE if the item at the index isn't memory, |
+ // * ReadStatus::ERROR_OUT_OF_BOUNDS if index, offset, or size are invalid, |
+ // * ReadStatus::DONE if the memory has been successfully read. |
+ // Precondition: memory_out must be a valid pointer to memory with a size of |
+ // at least consolidated_size. |
+ ReadStatus ReadMemory(size_t consolidated_item_index, |
+ size_t consolidated_offset, |
+ size_t consolidated_size, |
+ void* memory_out); |
+ |
+ private: |
+ size_t total_memory_; |
+ std::vector<ConsolidatedItem> consolidated_items_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BlobConsolidation); |
+}; |
+ |
+} // namespace content |
+#endif // CONTENT_CHILD_BLOB_STORAGE_BLOB_CONSOLIDATION_H_ |