| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "webkit/blob/blob_storage_controller.h" | 5 #include "webkit/blob/blob_storage_controller.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "googleurl/src/gurl.h" | 8 #include "googleurl/src/gurl.h" |
| 9 #include "webkit/blob/blob_data.h" | 9 #include "webkit/blob/blob_data.h" |
| 10 | 10 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 BlobData* target_blob_data = found->second; | 57 BlobData* target_blob_data = found->second; |
| 58 DCHECK(target_blob_data); | 58 DCHECK(target_blob_data); |
| 59 | 59 |
| 60 memory_usage_ -= target_blob_data->GetMemoryUsage(); | 60 memory_usage_ -= target_blob_data->GetMemoryUsage(); |
| 61 | 61 |
| 62 // The blob data is stored in the "canonical" way. That is, it only contains a | 62 // The blob data is stored in the "canonical" way. That is, it only contains a |
| 63 // list of Data and File items. | 63 // list of Data and File items. |
| 64 // 1) The Data item is denoted by the raw data and the range. | 64 // 1) The Data item is denoted by the raw data and the range. |
| 65 // 2) The File item is denoted by the file path, the range and the expected | 65 // 2) The File item is denoted by the file path, the range and the expected |
| 66 // modification time. | 66 // modification time. |
| 67 // 3) The FileSystem File item is denoted by the FileSystem URL, the range |
| 68 // and the expected modification time. |
| 67 // All the Blob items in the passing blob data are resolved and expanded into | 69 // All the Blob items in the passing blob data are resolved and expanded into |
| 68 // a set of Data and File items. | 70 // a set of Data and File items. |
| 69 | 71 |
| 70 DCHECK(item.length() > 0); | 72 DCHECK(item.length() > 0); |
| 71 switch (item.type()) { | 73 switch (item.type()) { |
| 72 case BlobData::Item::TYPE_BYTES: | 74 case BlobData::Item::TYPE_BYTES: |
| 73 DCHECK(!item.offset()); | 75 DCHECK(!item.offset()); |
| 74 target_blob_data->AppendData(item.bytes(), item.length()); | 76 target_blob_data->AppendData(item.bytes(), item.length()); |
| 75 break; | 77 break; |
| 76 case BlobData::Item::TYPE_FILE: | 78 case BlobData::Item::TYPE_FILE: |
| 77 AppendFileItem(target_blob_data, | 79 AppendFileItem(target_blob_data, |
| 78 item.path(), | 80 item.path(), |
| 79 item.offset(), | 81 item.offset(), |
| 80 item.length(), | 82 item.length(), |
| 81 item.expected_modification_time()); | 83 item.expected_modification_time()); |
| 82 break; | 84 break; |
| 85 case BlobData::Item::TYPE_FILE_FILESYSTEM: |
| 86 AppendFileSystemFileItem(target_blob_data, |
| 87 item.url(), |
| 88 item.offset(), |
| 89 item.length(), |
| 90 item.expected_modification_time()); |
| 91 break; |
| 83 case BlobData::Item::TYPE_BLOB: { | 92 case BlobData::Item::TYPE_BLOB: { |
| 84 BlobData* src_blob_data = GetBlobDataFromUrl(item.url()); | 93 BlobData* src_blob_data = GetBlobDataFromUrl(item.url()); |
| 85 DCHECK(src_blob_data); | 94 DCHECK(src_blob_data); |
| 86 if (src_blob_data) | 95 if (src_blob_data) |
| 87 AppendStorageItems(target_blob_data, | 96 AppendStorageItems(target_blob_data, |
| 88 src_blob_data, | 97 src_blob_data, |
| 89 item.offset(), | 98 item.offset(), |
| 90 item.length()); | 99 item.length()); |
| 91 break; | 100 break; |
| 92 } | 101 } |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 target_blob_data->AppendFile(file_path, offset, length, | 220 target_blob_data->AppendFile(file_path, offset, length, |
| 212 expected_modification_time); | 221 expected_modification_time); |
| 213 | 222 |
| 214 // It may be a temporary file that should be deleted when no longer needed. | 223 // It may be a temporary file that should be deleted when no longer needed. |
| 215 scoped_refptr<ShareableFileReference> shareable_file = | 224 scoped_refptr<ShareableFileReference> shareable_file = |
| 216 ShareableFileReference::Get(file_path); | 225 ShareableFileReference::Get(file_path); |
| 217 if (shareable_file) | 226 if (shareable_file) |
| 218 target_blob_data->AttachShareableFileReference(shareable_file); | 227 target_blob_data->AttachShareableFileReference(shareable_file); |
| 219 } | 228 } |
| 220 | 229 |
| 230 void BlobStorageController::AppendFileSystemFileItem( |
| 231 BlobData* target_blob_data, |
| 232 const GURL& url, uint64 offset, uint64 length, |
| 233 const base::Time& expected_modification_time) { |
| 234 target_blob_data->AppendFileSystemFile(url, offset, length, |
| 235 expected_modification_time); |
| 236 } |
| 237 |
| 221 void BlobStorageController::IncrementBlobDataUsage(BlobData* blob_data) { | 238 void BlobStorageController::IncrementBlobDataUsage(BlobData* blob_data) { |
| 222 blob_data_usage_count_[blob_data] += 1; | 239 blob_data_usage_count_[blob_data] += 1; |
| 223 } | 240 } |
| 224 | 241 |
| 225 bool BlobStorageController::DecrementBlobDataUsage(BlobData* blob_data) { | 242 bool BlobStorageController::DecrementBlobDataUsage(BlobData* blob_data) { |
| 226 BlobDataUsageMap::iterator found = blob_data_usage_count_.find(blob_data); | 243 BlobDataUsageMap::iterator found = blob_data_usage_count_.find(blob_data); |
| 227 DCHECK(found != blob_data_usage_count_.end()); | 244 DCHECK(found != blob_data_usage_count_.end()); |
| 228 if (--(found->second)) | 245 if (--(found->second)) |
| 229 return false; // Still in use | 246 return false; // Still in use |
| 230 blob_data_usage_count_.erase(found); | 247 blob_data_usage_count_.erase(found); |
| 231 return true; | 248 return true; |
| 232 } | 249 } |
| 233 | 250 |
| 234 } // namespace webkit_blob | 251 } // namespace webkit_blob |
| OLD | NEW |