| 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 "chrome/browser/chromeos/gdata/gdata_cache.h" | 5 #include "chrome/browser/chromeos/gdata/gdata_cache.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/chromeos/chromeos_version.h" | 9 #include "base/chromeos/chromeos_version.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 875 stale_filenames_pattern = dest_path.ReplaceExtension(util::kWildCard); | 875 stale_filenames_pattern = dest_path.ReplaceExtension(util::kWildCard); |
| 876 } | 876 } |
| 877 | 877 |
| 878 // Delete files that match |stale_filenames_pattern| except for |dest_path|. | 878 // Delete files that match |stale_filenames_pattern| except for |dest_path|. |
| 879 DeleteFilesSelectively(stale_filenames_pattern, dest_path); | 879 DeleteFilesSelectively(stale_filenames_pattern, dest_path); |
| 880 | 880 |
| 881 if (*error == base::PLATFORM_FILE_OK) { | 881 if (*error == base::PLATFORM_FILE_OK) { |
| 882 // Now that file operations have completed, update cache map. | 882 // Now that file operations have completed, update cache map. |
| 883 new_cache_entry.SetPresent(true); | 883 new_cache_entry.SetPresent(true); |
| 884 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); | 884 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); |
| 885 metadata_->UpdateCache(resource_id, new_cache_entry); | 885 metadata_->AddOrUpdateCacheEntry(resource_id, new_cache_entry); |
| 886 } | 886 } |
| 887 } | 887 } |
| 888 | 888 |
| 889 void GDataCache::Pin(const std::string& resource_id, | 889 void GDataCache::Pin(const std::string& resource_id, |
| 890 const std::string& md5, | 890 const std::string& md5, |
| 891 FileOperationType file_operation_type, | 891 FileOperationType file_operation_type, |
| 892 base::PlatformFileError* error) { | 892 base::PlatformFileError* error) { |
| 893 AssertOnSequencedWorkerPool(); | 893 AssertOnSequencedWorkerPool(); |
| 894 DCHECK(error); | 894 DCHECK(error); |
| 895 | 895 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 964 *error = ModifyCacheState(source_path, | 964 *error = ModifyCacheState(source_path, |
| 965 dest_path, | 965 dest_path, |
| 966 file_operation_type, | 966 file_operation_type, |
| 967 symlink_path, | 967 symlink_path, |
| 968 create_symlink); | 968 create_symlink); |
| 969 | 969 |
| 970 if (*error == base::PLATFORM_FILE_OK) { | 970 if (*error == base::PLATFORM_FILE_OK) { |
| 971 // Now that file operations have completed, update cache map. | 971 // Now that file operations have completed, update cache map. |
| 972 new_cache_entry.SetPinned(true); | 972 new_cache_entry.SetPinned(true); |
| 973 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); | 973 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); |
| 974 metadata_->UpdateCache(resource_id, new_cache_entry); | 974 metadata_->AddOrUpdateCacheEntry(resource_id, new_cache_entry); |
| 975 } | 975 } |
| 976 } | 976 } |
| 977 | 977 |
| 978 void GDataCache::Unpin(const std::string& resource_id, | 978 void GDataCache::Unpin(const std::string& resource_id, |
| 979 const std::string& md5, | 979 const std::string& md5, |
| 980 FileOperationType file_operation_type, | 980 FileOperationType file_operation_type, |
| 981 base::PlatformFileError* error) { | 981 base::PlatformFileError* error) { |
| 982 AssertOnSequencedWorkerPool(); | 982 AssertOnSequencedWorkerPool(); |
| 983 DCHECK(error); | 983 DCHECK(error); |
| 984 | 984 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1042 | 1042 |
| 1043 *error = ModifyCacheState( | 1043 *error = ModifyCacheState( |
| 1044 source_path, | 1044 source_path, |
| 1045 dest_path, | 1045 dest_path, |
| 1046 file_operation_type, | 1046 file_operation_type, |
| 1047 symlink_path, // This will be deleted if it exists. | 1047 symlink_path, // This will be deleted if it exists. |
| 1048 false /* don't create symlink*/); | 1048 false /* don't create symlink*/); |
| 1049 | 1049 |
| 1050 if (*error == base::PLATFORM_FILE_OK) { | 1050 if (*error == base::PLATFORM_FILE_OK) { |
| 1051 // Now that file operations have completed, update cache map. | 1051 // Now that file operations have completed, update cache map. |
| 1052 GDataCacheEntry new_cache_entry(md5, cache_entry->cache_state()); | 1052 if (cache_entry->IsPresent()) { |
| 1053 new_cache_entry.SetPinned(false); | 1053 GDataCacheEntry new_cache_entry(md5, cache_entry->cache_state()); |
| 1054 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); | 1054 new_cache_entry.SetPinned(false); |
| 1055 metadata_->UpdateCache(resource_id, new_cache_entry); | 1055 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); |
| 1056 metadata_->AddOrUpdateCacheEntry(resource_id, new_cache_entry); |
| 1057 } else { |
| 1058 // Remove the existing entry if we are unpinning a non-present file. |
| 1059 metadata_->RemoveCacheEntry(resource_id); |
| 1060 } |
| 1056 } | 1061 } |
| 1057 } | 1062 } |
| 1058 | 1063 |
| 1059 void GDataCache::SetMountedState(const FilePath& file_path, | 1064 void GDataCache::SetMountedState(const FilePath& file_path, |
| 1060 bool to_mount, | 1065 bool to_mount, |
| 1061 base::PlatformFileError *error, | 1066 base::PlatformFileError *error, |
| 1062 FilePath* cache_file_path) { | 1067 FilePath* cache_file_path) { |
| 1063 AssertOnSequencedWorkerPool(); | 1068 AssertOnSequencedWorkerPool(); |
| 1064 DCHECK(error); | 1069 DCHECK(error); |
| 1065 DCHECK(cache_file_path); | 1070 DCHECK(cache_file_path); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1110 dest_subdir = unmounted_subdir; | 1115 dest_subdir = unmounted_subdir; |
| 1111 new_cache_entry.SetMounted(false); | 1116 new_cache_entry.SetMounted(false); |
| 1112 } | 1117 } |
| 1113 | 1118 |
| 1114 // Move cache blob from source path to destination path. | 1119 // Move cache blob from source path to destination path. |
| 1115 *error = ModifyCacheState(source_path, *cache_file_path, | 1120 *error = ModifyCacheState(source_path, *cache_file_path, |
| 1116 FILE_OPERATION_MOVE, FilePath(), false); | 1121 FILE_OPERATION_MOVE, FilePath(), false); |
| 1117 if (*error == base::PLATFORM_FILE_OK) { | 1122 if (*error == base::PLATFORM_FILE_OK) { |
| 1118 // Now that cache operation is complete, update cache map | 1123 // Now that cache operation is complete, update cache map |
| 1119 new_cache_entry.SetPersistent(dest_subdir == CACHE_TYPE_PERSISTENT); | 1124 new_cache_entry.SetPersistent(dest_subdir == CACHE_TYPE_PERSISTENT); |
| 1120 metadata_->UpdateCache(resource_id, new_cache_entry); | 1125 metadata_->AddOrUpdateCacheEntry(resource_id, new_cache_entry); |
| 1121 } | 1126 } |
| 1122 } | 1127 } |
| 1123 | 1128 |
| 1124 void GDataCache::MarkDirty(const std::string& resource_id, | 1129 void GDataCache::MarkDirty(const std::string& resource_id, |
| 1125 const std::string& md5, | 1130 const std::string& md5, |
| 1126 FileOperationType file_operation_type, | 1131 FileOperationType file_operation_type, |
| 1127 base::PlatformFileError* error, | 1132 base::PlatformFileError* error, |
| 1128 FilePath* cache_file_path) { | 1133 FilePath* cache_file_path) { |
| 1129 AssertOnSequencedWorkerPool(); | 1134 AssertOnSequencedWorkerPool(); |
| 1130 DCHECK(error); | 1135 DCHECK(error); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1215 *cache_file_path, | 1220 *cache_file_path, |
| 1216 file_operation_type, | 1221 file_operation_type, |
| 1217 symlink_path, | 1222 symlink_path, |
| 1218 !symlink_path.empty() /* create symlink */); | 1223 !symlink_path.empty() /* create symlink */); |
| 1219 | 1224 |
| 1220 if (*error == base::PLATFORM_FILE_OK) { | 1225 if (*error == base::PLATFORM_FILE_OK) { |
| 1221 // Now that file operations have completed, update cache map. | 1226 // Now that file operations have completed, update cache map. |
| 1222 GDataCacheEntry new_cache_entry(md5, cache_entry->cache_state()); | 1227 GDataCacheEntry new_cache_entry(md5, cache_entry->cache_state()); |
| 1223 new_cache_entry.SetDirty(true); | 1228 new_cache_entry.SetDirty(true); |
| 1224 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); | 1229 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); |
| 1225 metadata_->UpdateCache(resource_id, new_cache_entry); | 1230 metadata_->AddOrUpdateCacheEntry(resource_id, new_cache_entry); |
| 1226 } | 1231 } |
| 1227 } | 1232 } |
| 1228 | 1233 |
| 1229 void GDataCache::CommitDirty(const std::string& resource_id, | 1234 void GDataCache::CommitDirty(const std::string& resource_id, |
| 1230 const std::string& md5, | 1235 const std::string& md5, |
| 1231 FileOperationType file_operation_type, | 1236 FileOperationType file_operation_type, |
| 1232 base::PlatformFileError* error) { | 1237 base::PlatformFileError* error) { |
| 1233 AssertOnSequencedWorkerPool(); | 1238 AssertOnSequencedWorkerPool(); |
| 1234 DCHECK(error); | 1239 DCHECK(error); |
| 1235 | 1240 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1363 file_operation_type, | 1368 file_operation_type, |
| 1364 symlink_path, | 1369 symlink_path, |
| 1365 true /* create symlink */); | 1370 true /* create symlink */); |
| 1366 } | 1371 } |
| 1367 | 1372 |
| 1368 if (*error == base::PLATFORM_FILE_OK) { | 1373 if (*error == base::PLATFORM_FILE_OK) { |
| 1369 // Now that file operations have completed, update cache map. | 1374 // Now that file operations have completed, update cache map. |
| 1370 GDataCacheEntry new_cache_entry(md5, cache_entry->cache_state()); | 1375 GDataCacheEntry new_cache_entry(md5, cache_entry->cache_state()); |
| 1371 new_cache_entry.SetDirty(false); | 1376 new_cache_entry.SetDirty(false); |
| 1372 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); | 1377 new_cache_entry.SetPersistent(sub_dir_type == CACHE_TYPE_PERSISTENT); |
| 1373 metadata_->UpdateCache(resource_id, new_cache_entry); | 1378 metadata_->AddOrUpdateCacheEntry(resource_id, new_cache_entry); |
| 1374 } | 1379 } |
| 1375 } | 1380 } |
| 1376 | 1381 |
| 1377 void GDataCache::Remove(const std::string& resource_id, | 1382 void GDataCache::Remove(const std::string& resource_id, |
| 1378 base::PlatformFileError* error) { | 1383 base::PlatformFileError* error) { |
| 1379 AssertOnSequencedWorkerPool(); | 1384 AssertOnSequencedWorkerPool(); |
| 1380 DCHECK(error); | 1385 DCHECK(error); |
| 1381 | 1386 |
| 1382 // MD5 is not passed into RemoveFromCache and hence | 1387 // MD5 is not passed into RemoveCacheEntry because we would delete all |
| 1383 // RemoveFromCacheOnBlockingPool, because we would delete all cache files | 1388 // cache files corresponding to <resource_id> regardless of the md5. |
| 1384 // corresponding to <resource_id> regardless of the md5. | |
| 1385 // So, search for entry in cache without taking md5 into account. | 1389 // So, search for entry in cache without taking md5 into account. |
| 1386 scoped_ptr<GDataCacheEntry> cache_entry = | 1390 scoped_ptr<GDataCacheEntry> cache_entry = |
| 1387 GetCacheEntry(resource_id, std::string()); | 1391 GetCacheEntry(resource_id, std::string()); |
| 1388 | 1392 |
| 1389 // If entry doesn't exist or is dirty or mounted in cache, nothing to do. | 1393 // If entry doesn't exist or is dirty or mounted in cache, nothing to do. |
| 1390 if (!cache_entry.get() || | 1394 if (!cache_entry.get() || |
| 1391 cache_entry->IsDirty() || | 1395 cache_entry->IsDirty() || |
| 1392 cache_entry->IsMounted()) { | 1396 cache_entry->IsMounted()) { |
| 1393 DVLOG(1) << "Entry is " | 1397 DVLOG(1) << "Entry is " |
| 1394 << (cache_entry.get() ? | 1398 << (cache_entry.get() ? |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1427 FilePath path_to_keep = GetCacheFilePath(resource_id, | 1431 FilePath path_to_keep = GetCacheFilePath(resource_id, |
| 1428 std::string(), | 1432 std::string(), |
| 1429 CACHE_TYPE_PERSISTENT, | 1433 CACHE_TYPE_PERSISTENT, |
| 1430 CACHED_FILE_LOCALLY_MODIFIED); | 1434 CACHED_FILE_LOCALLY_MODIFIED); |
| 1431 | 1435 |
| 1432 for (size_t i = 0; i < paths_to_delete.size(); ++i) { | 1436 for (size_t i = 0; i < paths_to_delete.size(); ++i) { |
| 1433 DeleteFilesSelectively(paths_to_delete[i], path_to_keep); | 1437 DeleteFilesSelectively(paths_to_delete[i], path_to_keep); |
| 1434 } | 1438 } |
| 1435 | 1439 |
| 1436 // Now that all file operations have completed, remove from cache map. | 1440 // Now that all file operations have completed, remove from cache map. |
| 1437 metadata_->RemoveFromCache(resource_id); | 1441 metadata_->RemoveCacheEntry(resource_id); |
| 1438 | 1442 |
| 1439 *error = base::PLATFORM_FILE_OK; | 1443 *error = base::PLATFORM_FILE_OK; |
| 1440 } | 1444 } |
| 1441 | 1445 |
| 1442 void GDataCache::OnPinned(base::PlatformFileError* error, | 1446 void GDataCache::OnPinned(base::PlatformFileError* error, |
| 1443 const std::string& resource_id, | 1447 const std::string& resource_id, |
| 1444 const std::string& md5, | 1448 const std::string& md5, |
| 1445 const CacheOperationCallback& callback) { | 1449 const CacheOperationCallback& callback) { |
| 1446 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1450 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1447 DCHECK(error); | 1451 DCHECK(error); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1554 const GDataCacheEntry& cache_entry) { | 1558 const GDataCacheEntry& cache_entry) { |
| 1555 return cache_entry.IsPersistent() ? CACHE_TYPE_PERSISTENT : CACHE_TYPE_TMP; | 1559 return cache_entry.IsPersistent() ? CACHE_TYPE_PERSISTENT : CACHE_TYPE_TMP; |
| 1556 } | 1560 } |
| 1557 | 1561 |
| 1558 void SetFreeDiskSpaceGetterForTesting(FreeDiskSpaceGetterInterface* getter) { | 1562 void SetFreeDiskSpaceGetterForTesting(FreeDiskSpaceGetterInterface* getter) { |
| 1559 delete global_free_disk_getter_for_testing; // Safe to delete NULL; | 1563 delete global_free_disk_getter_for_testing; // Safe to delete NULL; |
| 1560 global_free_disk_getter_for_testing = getter; | 1564 global_free_disk_getter_for_testing = getter; |
| 1561 } | 1565 } |
| 1562 | 1566 |
| 1563 } // namespace gdata | 1567 } // namespace gdata |
| OLD | NEW |