OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #ifndef WEBKIT_BLOB_BLOB_DATA_H_ | 5 #ifndef WEBKIT_BLOB_BLOB_DATA_H_ |
6 #define WEBKIT_BLOB_BLOB_DATA_H_ | 6 #define WEBKIT_BLOB_BLOB_DATA_H_ |
7 | 7 |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 namespace webkit_blob { | 21 namespace webkit_blob { |
22 | 22 |
23 class BlobData : public base::RefCounted<BlobData> { | 23 class BlobData : public base::RefCounted<BlobData> { |
24 public: | 24 public: |
25 enum Type { | 25 enum Type { |
26 TYPE_DATA, | 26 TYPE_DATA, |
27 TYPE_FILE, | 27 TYPE_FILE, |
28 TYPE_BLOB | 28 TYPE_BLOB |
29 }; | 29 }; |
30 | 30 |
31 class Item { | 31 struct Item { |
32 public: | |
33 Item(); | 32 Item(); |
34 ~Item(); | 33 ~Item(); |
35 | 34 |
36 Type type() const { return type_; } | |
37 const std::string& data() const { return data_; } | |
38 const FilePath& file_path() const { return file_path_; } | |
39 const GURL& blob_url() const { return blob_url_; } | |
40 uint64 offset() const { return offset_; } | |
41 uint64 length() const { return length_; } | |
42 const base::Time& expected_modification_time() const { | |
43 return expected_modification_time_; | |
44 } | |
45 | |
46 void SetToData(const std::string& data) { | 35 void SetToData(const std::string& data) { |
47 SetToData(data, 0, static_cast<uint32>(data.size())); | 36 SetToData(data, 0, static_cast<uint32>(data.size())); |
48 } | 37 } |
49 | 38 |
50 void SetToData(const std::string& data, uint32 offset, uint32 length) { | 39 void SetToData(const std::string& data, uint32 offset, uint32 length) { |
51 // TODO(jianli): Need to implement ref-counting vector storage. | 40 // TODO(jianli): Need to implement ref-counting vector storage. |
52 type_ = TYPE_DATA; | 41 type = TYPE_DATA; |
53 data_ = data; | 42 this->data = data; |
54 offset_ = offset; | 43 this->offset = offset; |
55 length_ = length; | 44 this->length = length; |
| 45 } |
| 46 |
| 47 void SetToData(const char* data, size_t length) { |
| 48 type = TYPE_DATA; |
| 49 this->data.assign(data, length); |
| 50 this->offset = 0; |
| 51 this->length = length; |
56 } | 52 } |
57 | 53 |
58 void SetToFile(const FilePath& file_path, uint64 offset, uint64 length, | 54 void SetToFile(const FilePath& file_path, uint64 offset, uint64 length, |
59 const base::Time& expected_modification_time) { | 55 const base::Time& expected_modification_time) { |
60 type_ = TYPE_FILE; | 56 type = TYPE_FILE; |
61 file_path_ = file_path; | 57 this->file_path = file_path; |
62 offset_ = offset; | 58 this->offset = offset; |
63 length_ = length; | 59 this->length = length; |
64 expected_modification_time_ = expected_modification_time; | 60 this->expected_modification_time = expected_modification_time; |
65 } | 61 } |
66 | 62 |
67 void SetToBlob(const GURL& blob_url, uint64 offset, uint64 length) { | 63 void SetToBlob(const GURL& blob_url, uint64 offset, uint64 length) { |
68 type_ = TYPE_BLOB; | 64 type = TYPE_BLOB; |
69 blob_url_ = blob_url; | 65 this->blob_url = blob_url; |
70 offset_ = offset; | 66 this->offset = offset; |
71 length_ = length; | 67 this->length = length; |
72 } | 68 } |
73 | 69 |
74 private: | 70 Type type; |
75 Type type_; | 71 std::string data; // For Data type. |
76 | 72 GURL blob_url; // For Blob type. |
77 // For Data type. | 73 FilePath file_path; // For File type. |
78 std::string data_; | 74 base::Time expected_modification_time; // Also for File type. |
79 | 75 uint64 offset; |
80 // For File type. | 76 uint64 length; |
81 FilePath file_path_; | |
82 | |
83 // For Blob typ. | |
84 GURL blob_url_; | |
85 | |
86 uint64 offset_; | |
87 uint64 length_; | |
88 base::Time expected_modification_time_; | |
89 }; | 77 }; |
90 | 78 |
91 BlobData(); | 79 BlobData(); |
92 explicit BlobData(const WebKit::WebBlobData& data); | 80 explicit BlobData(const WebKit::WebBlobData& data); |
93 | 81 |
| 82 void AppendItem(const Item& item) { |
| 83 items_.push_back(item); |
| 84 } |
| 85 |
94 void AppendData(const std::string& data) { | 86 void AppendData(const std::string& data) { |
95 // TODO(jianli): Consider writing the big data to the disk. | 87 // TODO(jianli): Consider writing the big data to the disk. |
96 AppendData(data, 0, static_cast<uint32>(data.size())); | 88 AppendData(data, 0, static_cast<uint32>(data.size())); |
97 } | 89 } |
98 | 90 |
99 void AppendData(const std::string& data, uint32 offset, uint32 length) { | 91 void AppendData(const std::string& data, uint32 offset, uint32 length) { |
100 if (length > 0) { | 92 if (length > 0) { |
101 items_.push_back(Item()); | 93 items_.push_back(Item()); |
102 items_.back().SetToData(data, offset, length); | 94 items_.back().SetToData(data, offset, length); |
103 } | 95 } |
(...skipping 22 matching lines...) Expand all Loading... |
126 content_type_ = content_type; | 118 content_type_ = content_type; |
127 } | 119 } |
128 | 120 |
129 const std::string& content_disposition() const { | 121 const std::string& content_disposition() const { |
130 return content_disposition_; | 122 return content_disposition_; |
131 } | 123 } |
132 void set_content_disposition(const std::string& content_disposition) { | 124 void set_content_disposition(const std::string& content_disposition) { |
133 content_disposition_ = content_disposition; | 125 content_disposition_ = content_disposition; |
134 } | 126 } |
135 | 127 |
136 // Should only be called by the IPC ParamTraits for this class. | 128 int64 GetMemoryUsage() const { |
137 void swap_items(std::vector<Item>* items) { | 129 int64 memory = 0; |
138 items_.swap(*items); | 130 for (std::vector<Item>::const_iterator iter = items_.begin(); |
| 131 iter != items_.end(); ++iter) { |
| 132 if (iter->type == TYPE_DATA) |
| 133 memory += iter->data.size(); |
| 134 } |
| 135 return memory; |
139 } | 136 } |
140 | 137 |
141 private: | 138 private: |
142 friend class base::RefCounted<BlobData>; | 139 friend class base::RefCounted<BlobData>; |
143 | 140 |
144 virtual ~BlobData(); | 141 virtual ~BlobData(); |
145 | 142 |
146 std::string content_type_; | 143 std::string content_type_; |
147 std::string content_disposition_; | 144 std::string content_disposition_; |
148 std::vector<Item> items_; | 145 std::vector<Item> items_; |
149 std::vector<scoped_refptr<DeletableFileReference> > deletable_files_; | 146 std::vector<scoped_refptr<DeletableFileReference> > deletable_files_; |
150 | 147 |
151 DISALLOW_COPY_AND_ASSIGN(BlobData); | 148 DISALLOW_COPY_AND_ASSIGN(BlobData); |
152 }; | 149 }; |
153 | 150 |
154 #if defined(UNIT_TEST) | 151 #if defined(UNIT_TEST) |
155 inline bool operator==(const BlobData::Item& a, const BlobData::Item& b) { | 152 inline bool operator==(const BlobData::Item& a, const BlobData::Item& b) { |
156 if (a.type() != b.type()) | 153 if (a.type != b.type) |
157 return false; | 154 return false; |
158 if (a.type() == BlobData::TYPE_DATA) { | 155 if (a.type == BlobData::TYPE_DATA) { |
159 return a.data() == b.data() && | 156 return a.data == b.data && |
160 a.offset() == b.offset() && | 157 a.offset == b.offset && |
161 a.length() == b.length(); | 158 a.length == b.length; |
162 } | 159 } |
163 if (a.type() == BlobData::TYPE_FILE) { | 160 if (a.type == BlobData::TYPE_FILE) { |
164 return a.file_path() == b.file_path() && | 161 return a.file_path == b.file_path && |
165 a.offset() == b.offset() && | 162 a.offset == b.offset && |
166 a.length() == b.length() && | 163 a.length == b.length && |
167 a.expected_modification_time() == b.expected_modification_time(); | 164 a.expected_modification_time == b.expected_modification_time; |
168 } | 165 } |
169 if (a.type() == BlobData::TYPE_BLOB) { | 166 if (a.type == BlobData::TYPE_BLOB) { |
170 return a.blob_url() == b.blob_url() && | 167 return a.blob_url == b.blob_url && |
171 a.offset() == b.offset() && | 168 a.offset == b.offset && |
172 a.length() == b.length(); | 169 a.length == b.length; |
173 } | 170 } |
174 return false; | 171 return false; |
175 } | 172 } |
176 | 173 |
177 inline bool operator!=(const BlobData::Item& a, const BlobData::Item& b) { | 174 inline bool operator!=(const BlobData::Item& a, const BlobData::Item& b) { |
178 return !(a == b); | 175 return !(a == b); |
179 } | 176 } |
180 | 177 |
181 inline bool operator==(const BlobData& a, const BlobData& b) { | 178 inline bool operator==(const BlobData& a, const BlobData& b) { |
182 if (a.content_type() != b.content_type()) | 179 if (a.content_type() != b.content_type()) |
(...skipping 10 matching lines...) Expand all Loading... |
193 } | 190 } |
194 | 191 |
195 inline bool operator!=(const BlobData& a, const BlobData& b) { | 192 inline bool operator!=(const BlobData& a, const BlobData& b) { |
196 return !(a == b); | 193 return !(a == b); |
197 } | 194 } |
198 #endif // defined(UNIT_TEST) | 195 #endif // defined(UNIT_TEST) |
199 | 196 |
200 } // namespace webkit_blob | 197 } // namespace webkit_blob |
201 | 198 |
202 #endif // WEBKIT_BLOB_BLOB_DATA_H_ | 199 #endif // WEBKIT_BLOB_BLOB_DATA_H_ |
OLD | NEW |