aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2026-06-28 22:03:16 +0300
committerlevlam <levlam@telegram.org>2026-06-28 22:03:16 +0300
commite9e18e20cc87c6d197cdbf3405fa4e76c0ba6300 (patch)
treee521e3931a7c057255987a654877020c5a12f76c
parent07d68536be2991ece9aed5540904140ed1f96aa6 (diff)
Add FileReferenceManager::process_file_reference_error.
-rw-r--r--td/telegram/FileReferenceManager.cpp85
-rw-r--r--td/telegram/FileReferenceManager.h11
2 files changed, 96 insertions, 0 deletions
diff --git a/td/telegram/FileReferenceManager.cpp b/td/telegram/FileReferenceManager.cpp
index ab2fc0243..762afd9f2 100644
--- a/td/telegram/FileReferenceManager.cpp
+++ b/td/telegram/FileReferenceManager.cpp
@@ -8,6 +8,7 @@
#include "td/telegram/AnimationsManager.h"
#include "td/telegram/AttachMenuManager.h"
+#include "td/telegram/AuthManager.h"
#include "td/telegram/BackgroundManager.h"
#include "td/telegram/BotInfoManager.h"
#include "td/telegram/ChatManager.h"
@@ -101,6 +102,90 @@ FileReferenceManager::FileReferenceErrorSource FileReferenceManager::get_file_re
return {pos, begins_with(message, "COVER_")};
}
+bool FileReferenceManager::process_file_reference_error(const Status &status, bool was_uploaded,
+ const vector<FileUploadId> &file_upload_ids,
+ const vector<string> &file_references,
+ const vector<FileId> &cover_file_ids,
+ const vector<string> &cover_file_references, bool expect_index,
+ std::function<void(size_t pos)> on_error) {
+ auto *td_ = G()->td().get_actor_unsafe();
+ if (td_->auth_manager_->is_bot() || !is_file_reference_error(status)) {
+ return false;
+ }
+ auto source = get_file_reference_error_source(status);
+ auto pos = source.pos_;
+ if (pos > 0) {
+ pos--;
+ } else if (expect_index) {
+ LOG(ERROR) << "Expected a file reference error with an index";
+ return false;
+ }
+ if (source.is_cover_) {
+ if (pos < cover_file_ids.size() && pos < cover_file_references.size() && cover_file_ids[pos].is_valid()) {
+ VLOG(file_references) << "Receive " << status << " for cover " << cover_file_ids[pos];
+ td_->file_manager_->delete_file_reference(cover_file_ids[pos], cover_file_references[pos]);
+ on_error(pos);
+ return true;
+ } else {
+ LOG(ERROR) << "Receive file reference error " << status << ", but cover_file_ids = " << cover_file_ids
+ << ", file_references = " << cover_file_references;
+ }
+ } else {
+ if (pos < file_upload_ids.size() && pos < file_references.size() && !was_uploaded &&
+ file_upload_ids[pos].is_valid()) {
+ VLOG(file_references) << "Receive " << status << " for " << file_upload_ids[pos];
+ td_->file_manager_->delete_file_reference(file_upload_ids[pos].get_file_id(), file_references[pos]);
+ on_error(pos);
+ return true;
+ } else {
+ LOG(ERROR) << "Receive file reference error " << status << ", but file_upload_ids = " << file_upload_ids
+ << ", was_uploaded = " << was_uploaded << ", file_references = " << file_references;
+ }
+ }
+ return false;
+}
+
+bool FileReferenceManager::process_file_reference_error(const Status &status, const vector<FileId> &file_ids,
+ const vector<string> &file_references,
+ const vector<FileId> &cover_file_ids,
+ const vector<string> &cover_file_references, bool expect_index,
+ std::function<void(size_t pos)> on_error) {
+ auto *td_ = G()->td().get_actor_unsafe();
+ if (td_->auth_manager_->is_bot() || !is_file_reference_error(status)) {
+ return false;
+ }
+ auto source = get_file_reference_error_source(status);
+ auto pos = source.pos_;
+ if (pos > 0) {
+ pos--;
+ } else if (expect_index) {
+ LOG(ERROR) << "Expected a file reference error with an index";
+ return false;
+ }
+ if (source.is_cover_) {
+ if (pos < cover_file_ids.size() && pos < cover_file_references.size()) {
+ VLOG(file_references) << "Receive " << status << " for cover " << cover_file_ids[pos];
+ td_->file_manager_->delete_file_reference(cover_file_ids[pos], cover_file_references[pos]);
+ on_error(pos);
+ return true;
+ } else {
+ LOG(ERROR) << "Receive file reference error " << status << ", but cover_file_ids = " << cover_file_ids
+ << ", file_references = " << cover_file_references;
+ }
+ } else {
+ if (pos < file_ids.size() && pos < file_references.size() && file_ids[pos].is_valid()) {
+ VLOG(file_references) << "Receive " << status << " for " << file_ids[pos];
+ td_->file_manager_->delete_file_reference(file_ids[pos], file_references[pos]);
+ on_error(pos);
+ return true;
+ } else {
+ LOG(ERROR) << "Receive file reference error " << status << ", but file_ids = " << file_ids
+ << ", file_references = " << file_references;
+ }
+ }
+ return false;
+}
+
/*
fileSourceMessage chat_id:int53 message_id:int53 = FileSource; // get_message_from_server
fileSourceUserProfilePhoto user_id:int53 photo_id:int64 = FileSource; // photos.getUserPhotos
diff --git a/td/telegram/FileReferenceManager.h b/td/telegram/FileReferenceManager.h
index 01dee8ea3..114ecf609 100644
--- a/td/telegram/FileReferenceManager.h
+++ b/td/telegram/FileReferenceManager.h
@@ -12,6 +12,7 @@
#include "td/telegram/DialogId.h"
#include "td/telegram/files/FileId.h"
#include "td/telegram/files/FileSourceId.h"
+#include "td/telegram/files/FileUploadId.h"
#include "td/telegram/MessageFullId.h"
#include "td/telegram/MessageTopic.h"
#include "td/telegram/PhotoSizeSource.h"
@@ -56,6 +57,16 @@ class FileReferenceManager final : public Actor {
};
static FileReferenceErrorSource get_file_reference_error_source(const Status &error);
+ bool process_file_reference_error(const Status &status, bool was_uploaded,
+ const vector<FileUploadId> &file_upload_ids, const vector<string> &file_references,
+ const vector<FileId> &cover_file_ids, const vector<string> &cover_file_references,
+ bool expect_index, std::function<void(size_t pos)> on_error);
+
+ bool process_file_reference_error(const Status &status, const vector<FileId> &file_ids,
+ const vector<string> &file_references, const vector<FileId> &cover_file_ids,
+ const vector<string> &cover_file_references, bool expect_index,
+ std::function<void(size_t pos)> on_error);
+
FileSourceId create_message_file_source(MessageFullId message_full_id);
FileSourceId create_user_photo_file_source(UserId user_id, int64 photo_id);
// file reference aren't used for chat/channel photo download and the photos can't be reused