// Copyright 2013 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 STORAGE_COMMON_DATA_ELEMENT_H_ #define STORAGE_COMMON_DATA_ELEMENT_H_ #include #include #include #include #include #include #include "base/files/file_path.h" #include "base/gtest_prod_util.h" #include "base/logging.h" #include "base/time/time.h" #include "storage/common/storage_common_export.h" #include "url/gurl.h" namespace storage { // Represents a base Web data element. This could be either one of // bytes, file or blob data. class STORAGE_COMMON_EXPORT DataElement { public: enum Type { TYPE_UNKNOWN = -1, TYPE_BYTES, // Only used with BlobStorageMsg_StartBuildingBlob TYPE_BYTES_DESCRIPTION, TYPE_FILE, TYPE_BLOB, TYPE_FILE_FILESYSTEM, TYPE_DISK_CACHE_ENTRY, }; DataElement(); ~DataElement(); Type type() const { return type_; } const char* bytes() const { return bytes_ ? bytes_ : &buf_[0]; } const base::FilePath& path() const { return path_; } const GURL& filesystem_url() const { return filesystem_url_; } const std::string& blob_uuid() const { return blob_uuid_; } uint64_t offset() const { return offset_; } uint64_t length() const { return length_; } const base::Time& expected_modification_time() const { return expected_modification_time_; } // For use with SetToAllocatedBytes. Should only be used after calling // SetToAllocatedBytes. char* mutable_bytes() { return &buf_[0]; } // Sets TYPE_BYTES data. This copies the given data into the element. void SetToBytes(const char* bytes, int bytes_len) { type_ = TYPE_BYTES; bytes_ = nullptr; buf_.assign(bytes, bytes + bytes_len); length_ = buf_.size(); } // Sets TYPE_BYTES data, and clears the internal bytes buffer. // For use with AppendBytes. void SetToEmptyBytes() { type_ = TYPE_BYTES; buf_.clear(); length_ = 0; bytes_ = nullptr; } // Copies and appends the given data into the element. SetToEmptyBytes or // SetToBytes must be called before this method. void AppendBytes(const char* bytes, int bytes_len) { DCHECK_EQ(type_, TYPE_BYTES); DCHECK_NE(length_, std::numeric_limits::max()); DCHECK(!bytes_); buf_.insert(buf_.end(), bytes, bytes + bytes_len); length_ = buf_.size(); } void SetToBytesDescription(size_t bytes_len) { type_ = TYPE_BYTES_DESCRIPTION; bytes_ = nullptr; length_ = bytes_len; } // Sets TYPE_BYTES data. This does NOT copy the given data and the caller // should make sure the data is alive when this element is accessed. // You cannot use AppendBytes with this method. void SetToSharedBytes(const char* bytes, int bytes_len) { type_ = TYPE_BYTES; bytes_ = bytes; length_ = bytes_len; } // Sets TYPE_BYTES data. This allocates the space for the bytes in the // internal vector but does not populate it with anything. The caller can // then use the bytes() method to access this buffer and populate it. void SetToAllocatedBytes(size_t bytes_len) { type_ = TYPE_BYTES; bytes_ = nullptr; buf_.resize(bytes_len); length_ = bytes_len; } // Sets TYPE_FILE data. void SetToFilePath(const base::FilePath& path) { SetToFilePathRange(path, 0, std::numeric_limits::max(), base::Time()); } // Sets TYPE_BLOB data. void SetToBlob(const std::string& uuid) { SetToBlobRange(uuid, 0, std::numeric_limits::max()); } // Sets TYPE_FILE data with range. void SetToFilePathRange(const base::FilePath& path, uint64_t offset, uint64_t length, const base::Time& expected_modification_time); // Sets TYPE_BLOB data with range. void SetToBlobRange(const std::string& blob_uuid, uint64_t offset, uint64_t length); // Sets TYPE_FILE_FILESYSTEM with range. void SetToFileSystemUrlRange(const GURL& filesystem_url, uint64_t offset, uint64_t length, const base::Time& expected_modification_time); // Sets to TYPE_DISK_CACHE_ENTRY with range. void SetToDiskCacheEntryRange(uint64_t offset, uint64_t length); private: FRIEND_TEST_ALL_PREFIXES(BlobAsyncTransportStrategyTest, TestInvalidParams); friend STORAGE_COMMON_EXPORT void PrintTo(const DataElement& x, ::std::ostream* os); Type type_; std::vector buf_; // For TYPE_BYTES. const char* bytes_; // For TYPE_BYTES. base::FilePath path_; // For TYPE_FILE. GURL filesystem_url_; // For TYPE_FILE_FILESYSTEM. std::string blob_uuid_; uint64_t offset_; uint64_t length_; base::Time expected_modification_time_; }; STORAGE_COMMON_EXPORT bool operator==(const DataElement& a, const DataElement& b); STORAGE_COMMON_EXPORT bool operator!=(const DataElement& a, const DataElement& b); } // namespace storage #endif // STORAGE_COMMON_DATA_ELEMENT_H_