OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/extensions/file_manager/private_api_file_syste
m.h" | 5 #include "chrome/browser/chromeos/extensions/file_manager/private_api_file_syste
m.h" |
6 | 6 |
7 #include <sys/statvfs.h> | 7 #include <sys/statvfs.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <set> | 10 #include <set> |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 uint64_t* total_size, | 76 uint64_t* total_size, |
77 uint64_t* remaining_size) { | 77 uint64_t* remaining_size) { |
78 int64_t size = base::SysInfo::AmountOfTotalDiskSpace(mount_path); | 78 int64_t size = base::SysInfo::AmountOfTotalDiskSpace(mount_path); |
79 if (size >= 0) | 79 if (size >= 0) |
80 *total_size = size; | 80 *total_size = size; |
81 size = base::SysInfo::AmountOfFreeDiskSpace(mount_path); | 81 size = base::SysInfo::AmountOfFreeDiskSpace(mount_path); |
82 if (size >= 0) | 82 if (size >= 0) |
83 *remaining_size = size; | 83 *remaining_size = size; |
84 } | 84 } |
85 | 85 |
86 // Used for OnCalculateEvictableCacheSize. | |
87 using GetSizeStatsCallback = | |
88 base::Callback<void(const uint64_t* total_size, | |
89 const uint64_t* remaining_space)>; | |
90 | |
91 // Calculates the real remaining size of Download volume and pass it to | |
92 // GetSizeStatsCallback. | |
93 void OnCalculateEvictableCacheSize(const GetSizeStatsCallback& callback, | |
94 uint64_t total_size, | |
95 uint64_t remaining_size, | |
96 int64_t evictable_cache_size) { | |
97 // For calculating real remaining size of Download volume | |
98 // - Adds evictable cache size since the space is available if they are | |
99 // evicted. | |
100 // - Subtracts minimum free space of cryptohome since the space is not | |
101 // available for file manager. | |
102 const uint64_t real_remaining_size = | |
103 std::max(static_cast<int64_t>(remaining_size + evictable_cache_size) - | |
104 cryptohome::kMinFreeSpaceInBytes, | |
105 int64_t(0)); | |
106 callback.Run(&total_size, &real_remaining_size); | |
107 } | |
108 | |
109 // Retrieves the maximum file name length of the file system of |path|. | 86 // Retrieves the maximum file name length of the file system of |path|. |
110 // Returns 0 if it could not be queried. | 87 // Returns 0 if it could not be queried. |
111 size_t GetFileNameMaxLengthOnBlockingPool(const std::string& path) { | 88 size_t GetFileNameMaxLengthOnBlockingPool(const std::string& path) { |
112 struct statvfs stat = {}; | 89 struct statvfs stat = {}; |
113 if (HANDLE_EINTR(statvfs(path.c_str(), &stat)) != 0) { | 90 if (HANDLE_EINTR(statvfs(path.c_str(), &stat)) != 0) { |
114 // The filesystem seems not supporting statvfs(). Assume it to be a commonly | 91 // The filesystem seems not supporting statvfs(). Assume it to be a commonly |
115 // used bound 255, and log the failure. | 92 // used bound 255, and log the failure. |
116 LOG(ERROR) << "Cannot statvfs() the name length limit for: " << path; | 93 LOG(ERROR) << "Cannot statvfs() the name length limit for: " << path; |
117 return 255; | 94 return 255; |
118 } | 95 } |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 storage_name, | 442 storage_name, |
466 base::Bind( | 443 base::Bind( |
467 &FileManagerPrivateGetSizeStatsFunction::OnGetMtpAvailableSpace, | 444 &FileManagerPrivateGetSizeStatsFunction::OnGetMtpAvailableSpace, |
468 this)); | 445 this)); |
469 } else { | 446 } else { |
470 uint64_t* total_size = new uint64_t(0); | 447 uint64_t* total_size = new uint64_t(0); |
471 uint64_t* remaining_size = new uint64_t(0); | 448 uint64_t* remaining_size = new uint64_t(0); |
472 BrowserThread::PostBlockingPoolTaskAndReply( | 449 BrowserThread::PostBlockingPoolTaskAndReply( |
473 FROM_HERE, base::Bind(&GetSizeStatsOnBlockingPool, volume->mount_path(), | 450 FROM_HERE, base::Bind(&GetSizeStatsOnBlockingPool, volume->mount_path(), |
474 total_size, remaining_size), | 451 total_size, remaining_size), |
475 base::Bind( | 452 base::Bind(&FileManagerPrivateGetSizeStatsFunction::OnGetSizeStats, |
476 &FileManagerPrivateGetSizeStatsFunction::OnGetLocalSpace, this, | 453 this, base::Owned(total_size), base::Owned(remaining_size))); |
477 base::Owned(total_size), base::Owned(remaining_size), | |
478 volume->type() == file_manager::VOLUME_TYPE_DOWNLOADS_DIRECTORY)); | |
479 } | 454 } |
480 return true; | 455 return true; |
481 } | 456 } |
482 | 457 |
483 void FileManagerPrivateGetSizeStatsFunction::OnGetLocalSpace( | |
484 uint64_t* total_size, | |
485 uint64_t* remaining_size, | |
486 bool is_download) { | |
487 drive::FileSystemInterface* const file_system = | |
488 drive::util::GetFileSystemByProfile(GetProfile()); | |
489 | |
490 if (!is_download || !file_system) { | |
491 OnGetSizeStats(total_size, remaining_size); | |
492 return; | |
493 } | |
494 | |
495 // We need to add evictable cache size to the remaining size of Downloads | |
496 // volume if drive is available. | |
497 file_system->CalculateEvictableCacheSize(base::Bind( | |
498 &OnCalculateEvictableCacheSize, | |
499 base::Bind(&FileManagerPrivateGetSizeStatsFunction::OnGetSizeStats, this), | |
500 *total_size, *remaining_size)); | |
501 } | |
502 | |
503 void FileManagerPrivateGetSizeStatsFunction::OnGetDriveAvailableSpace( | 458 void FileManagerPrivateGetSizeStatsFunction::OnGetDriveAvailableSpace( |
504 drive::FileError error, | 459 drive::FileError error, |
505 int64_t bytes_total, | 460 int64_t bytes_total, |
506 int64_t bytes_used) { | 461 int64_t bytes_used) { |
507 if (error == drive::FILE_ERROR_OK) { | 462 if (error == drive::FILE_ERROR_OK) { |
508 const uint64_t bytes_total_unsigned = bytes_total; | 463 const uint64_t bytes_total_unsigned = bytes_total; |
509 // bytes_used can be larger than bytes_total (over quota). | 464 // bytes_used can be larger than bytes_total (over quota). |
510 const uint64_t bytes_remaining_unsigned = | 465 const uint64_t bytes_remaining_unsigned = |
511 std::max(bytes_total - bytes_used, int64_t(0)); | 466 std::max(bytes_total - bytes_used, int64_t(0)); |
512 OnGetSizeStats(&bytes_total_unsigned, &bytes_remaining_unsigned); | 467 OnGetSizeStats(&bytes_total_unsigned, &bytes_remaining_unsigned); |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
994 return RespondLater(); | 949 return RespondLater(); |
995 } | 950 } |
996 | 951 |
997 void FileManagerPrivateInternalSetEntryTagFunction::OnSetEntryPropertyCompleted( | 952 void FileManagerPrivateInternalSetEntryTagFunction::OnSetEntryPropertyCompleted( |
998 drive::FileError result) { | 953 drive::FileError result) { |
999 Respond(result == drive::FILE_ERROR_OK ? NoArguments() | 954 Respond(result == drive::FILE_ERROR_OK ? NoArguments() |
1000 : Error("Failed to set a tag.")); | 955 : Error("Failed to set a tag.")); |
1001 } | 956 } |
1002 | 957 |
1003 } // namespace extensions | 958 } // namespace extensions |
OLD | NEW |