Add get_main_file_type.

GitOrigin-RevId: 138fc28f8c8e59a8583514b53ce37750f2f0360a
This commit is contained in:
levlam 2020-06-22 08:43:00 +03:00
parent e3f9b5066b
commit d01c906f53
7 changed files with 59 additions and 78 deletions

View File

@ -49,15 +49,14 @@ void FileGcWorker::run_gc(const FileGcParameters &parameters, std::vector<FullFi
if (!parameters.file_types.empty()) {
std::fill(immune_types.begin(), immune_types.end(), true);
for (auto file_type : parameters.file_types) {
if (file_type == FileType::Secure) {
immune_types[narrow_cast<size_t>(FileType::SecureRaw)] = false;
} else if (file_type == FileType::Background) {
immune_types[narrow_cast<size_t>(FileType::Wallpaper)] = false;
} else if (file_type == FileType::Document) {
immune_types[narrow_cast<size_t>(FileType::DocumentAsFile)] = false;
}
immune_types[narrow_cast<size_t>(file_type)] = false;
}
for (int32 i = 0; i < MAX_FILE_TYPE; i++) {
auto main_file_type = narrow_cast<size_t>(get_main_file_type(static_cast<FileType>(i)));
if (immune_types[main_file_type] == false) {
immune_types[i] = false;
}
}
}
if (G()->parameters().use_file_db) {

View File

@ -46,6 +46,7 @@
#include <limits>
#include <numeric>
#include <tuple>
#include <unordered_set>
#include <utility>
namespace td {
@ -748,9 +749,15 @@ FileManager::FileManager(unique_ptr<Context> context) : context_(std::move(conte
next_file_id();
next_file_node_id();
std::vector<string> dirs;
auto create_dir = [&](CSlice path) {
dirs.push_back(path.str());
std::unordered_set<string> dir_paths;
for (int32 i = 0; i < MAX_FILE_TYPE; i++) {
dir_paths.insert(get_files_dir(static_cast<FileType>(i)));
}
// add both temp dirs
dir_paths.insert(get_files_temp_dir(FileType::Encrypted));
dir_paths.insert(get_files_temp_dir(FileType::Video));
for (const auto &path : dir_paths) {
auto status = mkdir(path, 0750);
if (status.is_error()) {
auto r_stat = stat(path);
@ -761,22 +768,9 @@ FileManager::FileManager(unique_ptr<Context> context) : context_(std::move(conte
}
}
#if TD_ANDROID
FileFd::open(dirs.back() + ".nomedia", FileFd::Create | FileFd::Read).ignore();
FileFd::open(path + ".nomedia", FileFd::Create | FileFd::Read).ignore();
#endif
};
for (int32 i = 0; i < MAX_FILE_TYPE; i++) {
FileType file_type = static_cast<FileType>(i);
if (file_type == FileType::SecureRaw || file_type == FileType::Background ||
file_type == FileType::DocumentAsFile) {
continue;
}
auto path = get_files_dir(file_type);
create_dir(path);
}
// Create both temp dirs.
create_dir(get_files_temp_dir(FileType::Encrypted));
create_dir(get_files_temp_dir(FileType::Video));
G()->td_db()->with_db_path([this](CSlice path) { this->bad_paths_.insert(path.str()); });
}

View File

@ -134,49 +134,22 @@ void FileStats::apply_dialog_limit(int32 limit) {
static tl_object_ptr<td_api::storageStatisticsByChat> get_storage_statistics_by_chat_object(
DialogId dialog_id, const FileStats::StatByType &stat_by_type) {
auto stats = make_tl_object<td_api::storageStatisticsByChat>(dialog_id.get(), 0, 0, Auto());
int64 secure_raw_size = 0;
int32 secure_raw_cnt = 0;
int64 wallpaper_raw_size = 0;
int32 wallpaper_raw_cnt = 0;
int64 document_raw_size = 0;
int32 document_raw_cnt = 0;
FileStats::StatByType aggregated_stats;
for (int32 i = 0; i < MAX_FILE_TYPE; i++) {
FileType file_type = static_cast<FileType>(i);
auto size = stat_by_type[i].size;
auto cnt = stat_by_type[i].cnt;
size_t file_type = narrow_cast<size_t>(get_main_file_type(static_cast<FileType>(i)));
aggregated_stats[file_type].size += stat_by_type[i].size;
aggregated_stats[file_type].cnt += stat_by_type[i].cnt;
}
for (int32 i = 0; i < MAX_FILE_TYPE; i++) {
auto size = aggregated_stats[i].size;
auto cnt = aggregated_stats[i].cnt;
if (file_type == FileType::SecureRaw) {
secure_raw_size = size;
secure_raw_cnt = cnt;
continue;
}
if (file_type == FileType::Wallpaper) {
wallpaper_raw_size = size;
wallpaper_raw_cnt = cnt;
continue;
}
if (file_type == FileType::Document) {
document_raw_size = size;
document_raw_cnt = cnt;
continue;
}
if (file_type == FileType::Secure) {
size += secure_raw_size;
cnt += secure_raw_cnt;
}
if (file_type == FileType::Background) {
size += wallpaper_raw_size;
cnt += wallpaper_raw_cnt;
}
if (file_type == FileType::DocumentAsFile) {
size += document_raw_size;
cnt += document_raw_cnt;
continue;
}
if (size == 0) {
continue;
}
FileType file_type = static_cast<FileType>(i);
stats->size_ += size;
stats->count_ += cnt;
stats->by_file_type_.push_back(

View File

@ -31,6 +31,7 @@
#include <functional>
#include <unordered_map>
#include <unordered_set>
namespace td {
namespace {
@ -101,12 +102,13 @@ struct FsFileInfo {
template <class CallbackT>
void scan_fs(CancellationToken &token, CallbackT &&callback) {
for (int32 i = 0; i < MAX_FILE_TYPE; i++) {
auto file_type = static_cast<FileType>(i);
if (file_type == FileType::SecureRaw || file_type == FileType::Wallpaper || file_type == FileType::DocumentAsFile) {
int32 main_file_type = static_cast<size_t>(get_main_file_type(static_cast<FileType>(i)));
if (i != main_file_type) {
continue;
}
auto files_dir = get_files_dir(file_type);
walk_path(files_dir, [&](CSlice path, WalkPath::Type type) {
auto file_type = static_cast<FileType>(i);
auto file_dir = get_files_dir(file_type);
walk_path(file_dir, [&](CSlice path, WalkPath::Type type) {
if (token) {
return WalkPath::Action::Abort;
}

View File

@ -95,6 +95,19 @@ tl_object_ptr<td_api::FileType> get_file_type_object(FileType file_type) {
}
}
FileType get_main_file_type(FileType file_type) {
switch (file_type) {
case FileType::Wallpaper:
return FileType::Background;
case FileType::SecureRaw:
return FileType::Secure;
case FileType::DocumentAsFile:
return FileType::Document;
default:
return file_type;
}
}
CSlice get_file_type_name(FileType file_type) {
switch (file_type) {
case FileType::Thumbnail:

View File

@ -45,6 +45,8 @@ FileType get_file_type(const td_api::FileType &file_type);
tl_object_ptr<td_api::FileType> get_file_type_object(FileType file_type);
FileType get_main_file_type(FileType file_type);
CSlice get_file_type_name(FileType file_type);
StringBuilder &operator<<(StringBuilder &string_builder, FileType file_type);

View File

@ -60,13 +60,9 @@ void NetStatsManager::init() {
};
for_each_stat([&](NetStatsInfo &stat, size_t id, CSlice name, FileType file_type) {
if (file_type == FileType::SecureRaw) {
id += static_cast<size_t>(FileType::SecureRaw) - static_cast<size_t>(FileType::Secure);
} else if (file_type == FileType::Wallpaper) {
id += static_cast<size_t>(FileType::Background) - static_cast<size_t>(FileType::Wallpaper);
} else if (file_type == FileType::DocumentAsFile) {
id += static_cast<size_t>(FileType::Document) - static_cast<size_t>(FileType::DocumentAsFile);
}
auto main_file_type = get_main_file_type(file_type);
id += static_cast<size_t>(main_file_type) - static_cast<size_t>(file_type);
stat.key = "net_stats_" + name.str();
stat.stats.set_callback(make_unique<NetStatsInternalCallback>(actor_id(this), id));
});
@ -117,8 +113,7 @@ void NetStatsManager::get_network_stats(bool current, Promise<NetworkStats> prom
entry.is_call = true;
result.entries.push_back(std::move(entry));
} else if (file_type != FileType::None) {
if (file_type == FileType::SecureRaw || file_type == FileType::Wallpaper ||
file_type == FileType::DocumentAsFile) {
if (get_main_file_type(file_type) != file_type) {
return;
}
@ -198,7 +193,7 @@ void NetStatsManager::add_network_stats_impl(NetStatsInfo &info, const NetworkSt
void NetStatsManager::start_up() {
for_each_stat([&](NetStatsInfo &info, size_t id, CSlice name, FileType file_type) {
if (file_type == FileType::SecureRaw || file_type == FileType::Wallpaper || file_type == FileType::DocumentAsFile) {
if (get_main_file_type(file_type) != file_type) {
return;
}
@ -261,9 +256,12 @@ std::shared_ptr<NetStatsCallback> NetStatsManager::get_media_stats_callback() co
std::vector<std::shared_ptr<NetStatsCallback>> NetStatsManager::get_file_stats_callbacks() const {
auto result = transform(files_stats_, [](auto &stat) { return stat.stats.get_callback(); });
result[static_cast<int32>(FileType::SecureRaw)] = result[static_cast<int32>(FileType::Secure)];
result[static_cast<int32>(FileType::Wallpaper)] = result[static_cast<int32>(FileType::Background)];
result[static_cast<int32>(FileType::DocumentAsFile)] = result[static_cast<int32>(FileType::Document)];
for (int32 i = 0; i < MAX_FILE_TYPE; i++) {
int32 main_file_type = static_cast<size_t>(get_main_file_type(static_cast<FileType>(i)));
if (main_file_type != i) {
result[i] = result[main_file_type];
}
}
return result;
}