diff --git a/td/telegram/SecureManager.cpp b/td/telegram/SecureManager.cpp index 8770923a7..a805dd0ad 100644 --- a/td/telegram/SecureManager.cpp +++ b/td/telegram/SecureManager.cpp @@ -650,8 +650,7 @@ void SetSecureValue::merge(FileManager *file_manager, FileId file_id, EncryptedS LOG(ERROR) << "Hash mismatch"; return; } - auto r_file_id = file_manager->merge(encrypted_file.file.file_id, file_id); - LOG_IF(ERROR, r_file_id.is_error()) << r_file_id.error(); + LOG_STATUS(file_manager->merge(encrypted_file.file.file_id, file_id)); } class DeleteSecureValue final : public NetQueryCallback { diff --git a/td/telegram/files/FileManager.cpp b/td/telegram/files/FileManager.cpp index 8a8638556..57f42d53f 100644 --- a/td/telegram/files/FileManager.cpp +++ b/td/telegram/files/FileManager.cpp @@ -1140,14 +1140,15 @@ void FileManager::on_file_unlink(const FullLocalFileLocation &location) { } Result FileManager::register_local(FullLocalFileLocation location, DialogId owner_dialog_id, int64 size, - bool get_by_hash, bool force, bool skip_file_size_checks) { + bool get_by_hash, bool force, bool skip_file_size_checks, + FileId merge_file_id) { // TODO: use get_by_hash FileData data; data.local_ = LocalFileLocation(std::move(location)); data.owner_dialog_id_ = owner_dialog_id; data.size_ = size; - return register_file(std::move(data), FileLocationSource::None /*won't be used*/, "register_local", force, - skip_file_size_checks); + return register_file(std::move(data), FileLocationSource::None /*won't be used*/, merge_file_id, "register_local", + force, skip_file_size_checks); } FileId FileManager::register_remote(FullRemoteFileLocation location, FileLocationSource file_location_source, @@ -1160,7 +1161,7 @@ FileId FileManager::register_remote(FullRemoteFileLocation location, FileLocatio data.expected_size_ = expected_size; data.remote_name_ = std::move(remote_name); - auto file_id = register_file(std::move(data), file_location_source, "register_remote", false).move_as_ok(); + auto file_id = register_file(std::move(data), file_location_source, FileId(), "register_remote", false).move_as_ok(); if (!url.empty()) { auto file_node = get_file_node(file_id); CHECK(file_node); @@ -1196,11 +1197,12 @@ Result FileManager::register_generate(FileType file_type, FileLocationSo td::make_unique(file_type, std::move(original_path), std::move(conversion)); data.owner_dialog_id_ = owner_dialog_id; data.expected_size_ = expected_size; - return register_file(std::move(data), file_location_source, "register_generate", false); + return register_file(std::move(data), file_location_source, FileId(), "register_generate", false); } -Result FileManager::register_file(FileData &&data, FileLocationSource file_location_source, const char *source, - bool force, bool skip_file_size_checks) { +Result FileManager::register_file(FileData &&data, FileLocationSource file_location_source, + FileId merge_file_id, const char *source, bool force, + bool skip_file_size_checks) { bool has_remote = data.remote_.type() == RemoteFileLocation::Type::Full; bool has_generate = data.generate_ != nullptr; if (data.local_.type() == LocalFileLocation::Type::Full && !force) { @@ -1319,6 +1321,13 @@ Result FileManager::register_file(FileData &&data, FileLocationSource fi // may invalidate node merge(file_id, id, no_sync_merge).ignore(); } + Status status; + if (merge_file_id.is_valid()) { + auto r_file_id = merge(file_id, merge_file_id); + if (r_file_id.is_error()) { + status = r_file_id.move_as_error(); + } + } try_flush_node(get_file_node(file_id), "register_file"); auto main_file_id = get_file_node(file_id)->main_file_id_; @@ -1342,6 +1351,9 @@ Result FileManager::register_file(FileData &&data, FileLocationSource fi context_->add_file_source(main_file_id, file_source_id); } } + if (status.is_error()) { + return std::move(status); + } return FileId(main_file_id.get(), remote_key); } @@ -2032,8 +2044,9 @@ void FileManager::load_from_pmc(FileNodePtr node, bool new_remote, bool new_loca << ", new_remote = " << new_remote << ", new_local = " << new_local << ", new_generate = " << new_generate; auto load = [&](auto location, const char *source) { TRY_RESULT(file_data, file_db_->get_file_data_sync(location)); - TRY_RESULT(new_file_id, register_file(std::move(file_data), FileLocationSource::FromDatabase, source, false)); - TRY_RESULT(main_file_id, merge(file_id, new_file_id)); + TRY_RESULT(new_file_id, + register_file(std::move(file_data), FileLocationSource::FromDatabase, FileId(), source, false)); + TRY_RESULT(main_file_id, merge(file_id, new_file_id)); // merge manually to keep merge parameters order file_id = main_file_id; return Status::OK(); }; @@ -3027,7 +3040,7 @@ Result FileManager::from_persistent_id_generated(Slice binary, FileType } FileData data; data.generate_ = make_unique(std::move(generate_location)); - return register_file(std::move(data), FileLocationSource::FromUser, "from_persistent_id_generated", false) + return register_file(std::move(data), FileLocationSource::FromUser, FileId(), "from_persistent_id_generated", false) .move_as_ok(); } @@ -3055,8 +3068,8 @@ Result FileManager::from_persistent_id_v23(Slice binary, FileType file_t } FileData data; data.remote_ = RemoteFileLocation(std::move(remote_location)); - auto file_id = - register_file(std::move(data), FileLocationSource::FromUser, "from_persistent_id_v23", false).move_as_ok(); + auto file_id = register_file(std::move(data), FileLocationSource::FromUser, FileId(), "from_persistent_id_v23", false) + .move_as_ok(); return file_id; } @@ -3631,7 +3644,7 @@ void FileManager::on_download_ok(QueryId query_id, FullLocalFileLocation local, std::tie(query, was_active) = finish_query(query_id); auto file_id = query.file_id_; LOG(INFO) << "ON DOWNLOAD OK of " << (is_new ? "new" : "checked") << " file " << file_id << " of size " << size; - auto r_new_file_id = register_local(std::move(local), DialogId(), size, false, false, true); + auto r_new_file_id = register_local(std::move(local), DialogId(), size, false, false, true, file_id); Status status = Status::OK(); if (r_new_file_id.is_error()) { status = Status::Error(PSLICE() << "Can't register local file after download: " << r_new_file_id.error().message()); @@ -3639,10 +3652,6 @@ void FileManager::on_download_ok(QueryId query_id, FullLocalFileLocation local, if (is_new && context_->need_notify_on_new_files()) { context_->on_new_file(size, get_file_view(r_new_file_id.ok()).get_allocated_local_size(), 1); } - auto r_file_id = merge(r_new_file_id.ok(), file_id); - if (r_file_id.is_error()) { - status = r_file_id.move_as_error(); - } } if (status.is_error()) { LOG(ERROR) << status.message(); @@ -3727,6 +3736,7 @@ void FileManager::on_upload_ok(QueryId query_id, FileType file_type, PartialRemo } } +// for upload by hash void FileManager::on_upload_full_ok(QueryId query_id, FullRemoteFileLocation remote) { if (is_closed_) { return; @@ -3792,19 +3802,12 @@ void FileManager::on_generate_ok(QueryId query_id, FullLocalFileLocation local) auto old_upload_id = file_node->upload_id_; - auto r_new_file_id = register_local(local, DialogId(), 0); - Status status; - if (r_new_file_id.is_error()) { - status = Status::Error(PSLICE() << "Can't register local file after generate: " << r_new_file_id.error()); - } else { - auto result = merge(r_new_file_id.ok(), generate_file_id); - if (result.is_error()) { - status = result.move_as_error(); - } - } + auto r_new_file_id = register_local(local, DialogId(), 0, false, false, false, generate_file_id); file_node = get_file_node(generate_file_id); - if (status.is_error()) { - return on_error_impl(file_node, query.type_, was_active, std::move(status)); + if (r_new_file_id.is_error()) { + return on_error_impl( + file_node, query.type_, was_active, + Status::Error(PSLICE() << "Can't register local file after generate: " << r_new_file_id.error())); } CHECK(file_node); diff --git a/td/telegram/files/FileManager.h b/td/telegram/files/FileManager.h index 6ff95c25b..7f302233a 100644 --- a/td/telegram/files/FileManager.h +++ b/td/telegram/files/FileManager.h @@ -427,8 +427,8 @@ class FileManager final : public FileLoadManager::Callback { FileId register_empty(FileType type); Result register_local(FullLocalFileLocation location, DialogId owner_dialog_id, int64 size, - bool get_by_hash = false, bool force = false, - bool skip_file_size_checks = false) TD_WARN_UNUSED_RESULT; + bool get_by_hash = false, bool force = false, bool skip_file_size_checks = false, + FileId merge_file_id = FileId()) TD_WARN_UNUSED_RESULT; FileId register_remote(FullRemoteFileLocation location, FileLocationSource file_location_source, DialogId owner_dialog_id, int64 size, int64 expected_size, string remote_name) TD_WARN_UNUSED_RESULT; @@ -520,8 +520,8 @@ class FileManager final : public FileLoadManager::Callback { FileId register_url(string url, FileType file_type, FileLocationSource file_location_source, DialogId owner_dialog_id); - Result register_file(FileData &&data, FileLocationSource file_location_source, const char *source, bool force, - bool skip_file_size_checks = false); + Result register_file(FileData &&data, FileLocationSource file_location_source, FileId merge_file_id, + const char *source, bool force, bool skip_file_size_checks = false); static constexpr int8 FROM_BYTES_PRIORITY = 10;