Fix addind/removing file source for messages.
GitOrigin-RevId: 726e2671dee6368bce20bac207b8d3929b1a34f6
This commit is contained in:
parent
b53cd5d76a
commit
cc5eaa6b7e
@ -47,7 +47,7 @@ void FileReferenceManager::update_file_reference(FileId file_id, std::vector<Fil
|
|||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
});
|
});
|
||||||
if (it == to_full_message_id_.end()) {
|
if (it == to_full_message_id_.end()) {
|
||||||
new_promise.set_error(Status::Error("Unkonwn source id"));
|
new_promise.set_error(Status::Error("Unkonwn source id"));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,8 +36,8 @@ class ConfigManager;
|
|||||||
class ConfigShared;
|
class ConfigShared;
|
||||||
class ConnectionCreator;
|
class ConnectionCreator;
|
||||||
class ContactsManager;
|
class ContactsManager;
|
||||||
class FileReferenceManager;
|
|
||||||
class FileManager;
|
class FileManager;
|
||||||
|
class FileReferenceManager;
|
||||||
class LanguagePackManager;
|
class LanguagePackManager;
|
||||||
class MessagesManager;
|
class MessagesManager;
|
||||||
class MtprotoHeader;
|
class MtprotoHeader;
|
||||||
@ -173,13 +173,6 @@ class Global : public ActorContext {
|
|||||||
contacts_manager_ = contacts_manager;
|
contacts_manager_ = contacts_manager;
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorId<FileReferenceManager> file_reference_manager() const {
|
|
||||||
return file_reference_manager_;
|
|
||||||
}
|
|
||||||
void set_file_reference_manager(ActorId<FileReferenceManager> file_reference_manager) {
|
|
||||||
file_reference_manager_ = std::move(file_reference_manager);
|
|
||||||
}
|
|
||||||
|
|
||||||
ActorId<FileManager> file_manager() const {
|
ActorId<FileManager> file_manager() const {
|
||||||
return file_manager_;
|
return file_manager_;
|
||||||
}
|
}
|
||||||
@ -187,6 +180,13 @@ class Global : public ActorContext {
|
|||||||
file_manager_ = std::move(file_manager);
|
file_manager_ = std::move(file_manager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ActorId<FileReferenceManager> file_reference_manager() const {
|
||||||
|
return file_reference_manager_;
|
||||||
|
}
|
||||||
|
void set_file_reference_manager(ActorId<FileReferenceManager> file_reference_manager) {
|
||||||
|
file_reference_manager_ = std::move(file_reference_manager);
|
||||||
|
}
|
||||||
|
|
||||||
ActorId<LanguagePackManager> language_pack_manager() const {
|
ActorId<LanguagePackManager> language_pack_manager() const {
|
||||||
return language_pack_manager_;
|
return language_pack_manager_;
|
||||||
}
|
}
|
||||||
@ -356,8 +356,8 @@ class Global : public ActorContext {
|
|||||||
ActorId<CallManager> call_manager_;
|
ActorId<CallManager> call_manager_;
|
||||||
ActorId<ConfigManager> config_manager_;
|
ActorId<ConfigManager> config_manager_;
|
||||||
ActorId<ContactsManager> contacts_manager_;
|
ActorId<ContactsManager> contacts_manager_;
|
||||||
ActorId<FileReferenceManager> file_reference_manager_;
|
|
||||||
ActorId<FileManager> file_manager_;
|
ActorId<FileManager> file_manager_;
|
||||||
|
ActorId<FileReferenceManager> file_reference_manager_;
|
||||||
ActorId<LanguagePackManager> language_pack_manager_;
|
ActorId<LanguagePackManager> language_pack_manager_;
|
||||||
ActorId<MessagesManager> messages_manager_;
|
ActorId<MessagesManager> messages_manager_;
|
||||||
ActorId<NotificationManager> notification_manager_;
|
ActorId<NotificationManager> notification_manager_;
|
||||||
|
@ -3159,7 +3159,7 @@ static auto secret_to_telegram(secret_api::fileLocationUnavailable &file_locatio
|
|||||||
static auto secret_to_telegram(secret_api::fileLocation &file_location) {
|
static auto secret_to_telegram(secret_api::fileLocation &file_location) {
|
||||||
return make_tl_object<telegram_api::fileLocation>(file_location.dc_id_, file_location.volume_id_,
|
return make_tl_object<telegram_api::fileLocation>(file_location.dc_id_, file_location.volume_id_,
|
||||||
file_location.local_id_, file_location.secret_,
|
file_location.local_id_, file_location.secret_,
|
||||||
BufferSlice() /*FIXME*/);
|
BufferSlice());
|
||||||
}
|
}
|
||||||
|
|
||||||
// photoSizeEmpty#e17e23c type:string = PhotoSize;
|
// photoSizeEmpty#e17e23c type:string = PhotoSize;
|
||||||
@ -3308,7 +3308,7 @@ static auto secret_to_telegram_document(secret_api::decryptedMessageMediaExterna
|
|||||||
from.mime_type_.clear();
|
from.mime_type_.clear();
|
||||||
}
|
}
|
||||||
return make_tl_object<telegram_api::document>(
|
return make_tl_object<telegram_api::document>(
|
||||||
from.id_, from.access_hash_, BufferSlice() /*FIXME*/, from.date_, from.mime_type_, from.size_,
|
from.id_, from.access_hash_, BufferSlice(), from.date_, from.mime_type_, from.size_,
|
||||||
secret_to_telegram<telegram_api::PhotoSize>(*from.thumb_), from.dc_id_, secret_to_telegram(from.attributes_));
|
secret_to_telegram<telegram_api::PhotoSize>(*from.thumb_), from.dc_id_, secret_to_telegram(from.attributes_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10627,6 +10627,7 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_message(Dialog *
|
|||||||
delete_message_from_database(d, message_id, m, is_permanently_deleted);
|
delete_message_from_database(d, message_id, m, is_permanently_deleted);
|
||||||
|
|
||||||
delete_active_live_location(d->dialog_id, m);
|
delete_active_live_location(d->dialog_id, m);
|
||||||
|
remove_message_file_sources(d->dialog_id, m);
|
||||||
|
|
||||||
if (message_id == d->last_message_id) {
|
if (message_id == d->last_message_id) {
|
||||||
MessagesConstIterator it(d, message_id);
|
MessagesConstIterator it(d, message_id);
|
||||||
@ -10838,6 +10839,7 @@ void MessagesManager::do_delete_all_dialog_messages(Dialog *d, unique_ptr<Messag
|
|||||||
do_delete_all_dialog_messages(d, m->left, deleted_message_ids);
|
do_delete_all_dialog_messages(d, m->left, deleted_message_ids);
|
||||||
|
|
||||||
delete_active_live_location(d->dialog_id, m.get());
|
delete_active_live_location(d->dialog_id, m.get());
|
||||||
|
remove_message_file_sources(d->dialog_id, m.get());
|
||||||
|
|
||||||
if (message_id.is_yet_unsent()) {
|
if (message_id.is_yet_unsent()) {
|
||||||
cancel_send_message_query(d->dialog_id, m);
|
cancel_send_message_query(d->dialog_id, m);
|
||||||
@ -13695,6 +13697,38 @@ void MessagesManager::save_active_live_locations() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MessagesManager::add_message_file_sources(DialogId dialog_id, const Message *m) {
|
||||||
|
if (dialog_id.get_type() == DialogType::SecretChat || !m->message_id.is_server()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto file_ids = get_message_content_file_ids(m->content.get(), td_);
|
||||||
|
if (file_ids.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto file_source_id = td_->file_reference_manager_->create_file_source(FullMessageId(dialog_id, m->message_id));
|
||||||
|
for (auto file_id : file_ids) {
|
||||||
|
td_->file_manager_->add_file_source(file_id, file_source_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagesManager::remove_message_file_sources(DialogId dialog_id, const Message *m) {
|
||||||
|
if (dialog_id.get_type() == DialogType::SecretChat || !m->message_id.is_server()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto file_ids = get_message_content_file_ids(m->content.get(), td_);
|
||||||
|
if (file_ids.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto file_source_id = td_->file_reference_manager_->create_file_source(FullMessageId(dialog_id, m->message_id));
|
||||||
|
for (auto file_id : file_ids) {
|
||||||
|
td_->file_manager_->remove_file_source(file_id, file_source_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MessageId MessagesManager::get_first_database_message_id_by_index(const Dialog *d, SearchMessagesFilter filter) {
|
MessageId MessagesManager::get_first_database_message_id_by_index(const Dialog *d, SearchMessagesFilter filter) {
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
auto message_id = filter == SearchMessagesFilter::Empty
|
auto message_id = filter == SearchMessagesFilter::Empty
|
||||||
@ -20971,16 +21005,6 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
cancel_user_dialog_action(dialog_id, message.get());
|
cancel_user_dialog_action(dialog_id, message.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message_id.is_server()) {
|
|
||||||
auto file_ids = get_message_content_file_ids(message->content.get(), td_);
|
|
||||||
if (!file_ids.empty()) {
|
|
||||||
auto file_source_id = td_->file_reference_manager_->create_file_source(FullMessageId(dialog_id, message_id));
|
|
||||||
for (auto file_id : file_ids) {
|
|
||||||
td_->file_manager_->add_file_source(file_id, file_source_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
unique_ptr<Message> *v = find_message(&d->messages, message_id);
|
unique_ptr<Message> *v = find_message(&d->messages, message_id);
|
||||||
if (*v == nullptr && !message->from_database) {
|
if (*v == nullptr && !message->from_database) {
|
||||||
@ -21014,11 +21038,13 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
const int32 INDEX_MASK_MASK = ~search_messages_filter_index_mask(SearchMessagesFilter::UnreadMention);
|
const int32 INDEX_MASK_MASK = ~search_messages_filter_index_mask(SearchMessagesFilter::UnreadMention);
|
||||||
auto old_index_mask = get_message_index_mask(dialog_id, v->get()) & INDEX_MASK_MASK;
|
auto old_index_mask = get_message_index_mask(dialog_id, v->get()) & INDEX_MASK_MASK;
|
||||||
bool was_deleted = delete_active_live_location(dialog_id, v->get());
|
bool was_deleted = delete_active_live_location(dialog_id, v->get());
|
||||||
|
remove_message_file_sources(dialog_id, v->get());
|
||||||
update_message(d, *v, std::move(message), true, need_update_dialog_pos);
|
update_message(d, *v, std::move(message), true, need_update_dialog_pos);
|
||||||
auto new_index_mask = get_message_index_mask(dialog_id, v->get()) & INDEX_MASK_MASK;
|
auto new_index_mask = get_message_index_mask(dialog_id, v->get()) & INDEX_MASK_MASK;
|
||||||
if (was_deleted) {
|
if (was_deleted) {
|
||||||
try_add_active_live_location(dialog_id, v->get());
|
try_add_active_live_location(dialog_id, v->get());
|
||||||
}
|
}
|
||||||
|
add_message_file_sources(dialog_id, v->get());
|
||||||
if (old_index_mask != new_index_mask) {
|
if (old_index_mask != new_index_mask) {
|
||||||
update_message_count_by_index(d, -1, old_index_mask & ~new_index_mask);
|
update_message_count_by_index(d, -1, old_index_mask & ~new_index_mask);
|
||||||
update_message_count_by_index(d, +1, new_index_mask & ~old_index_mask);
|
update_message_count_by_index(d, +1, new_index_mask & ~old_index_mask);
|
||||||
@ -21346,6 +21372,8 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
get_messages_from_server({full_message_id}, Auto());
|
get_messages_from_server({full_message_id}, Auto());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add_message_file_sources(dialog_id, m);
|
||||||
|
|
||||||
if (from_update && message_id.is_server() && dialog_id.get_type() == DialogType::Channel) {
|
if (from_update && message_id.is_server() && dialog_id.get_type() == DialogType::Channel) {
|
||||||
int32 new_participant_count = get_message_content_new_participant_count(m->content.get());
|
int32 new_participant_count = get_message_content_new_participant_count(m->content.get());
|
||||||
if (new_participant_count != 0) {
|
if (new_participant_count != 0) {
|
||||||
|
@ -1841,6 +1841,10 @@ class MessagesManager : public Actor {
|
|||||||
|
|
||||||
void save_active_live_locations();
|
void save_active_live_locations();
|
||||||
|
|
||||||
|
void add_message_file_sources(DialogId dialog_id, const Message *m);
|
||||||
|
|
||||||
|
void remove_message_file_sources(DialogId dialog_id, const Message *m);
|
||||||
|
|
||||||
Result<unique_ptr<ReplyMarkup>> get_dialog_reply_markup(
|
Result<unique_ptr<ReplyMarkup>> get_dialog_reply_markup(
|
||||||
DialogId dialog_id, tl_object_ptr<td_api::ReplyMarkup> &&reply_markup_ptr) const TD_WARN_UNUSED_RESULT;
|
DialogId dialog_id, tl_object_ptr<td_api::ReplyMarkup> &&reply_markup_ptr) const TD_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
|
@ -3633,10 +3633,10 @@ void Td::dec_actor_refcnt() {
|
|||||||
LOG(DEBUG) << "ContactsManager was cleared " << timer;
|
LOG(DEBUG) << "ContactsManager was cleared " << timer;
|
||||||
documents_manager_.reset();
|
documents_manager_.reset();
|
||||||
LOG(DEBUG) << "DocumentsManager was cleared " << timer;
|
LOG(DEBUG) << "DocumentsManager was cleared " << timer;
|
||||||
file_reference_manager_.reset();
|
|
||||||
LOG(DEBUG) << "FileReferenceManager was cleared " << timer;
|
|
||||||
file_manager_.reset();
|
file_manager_.reset();
|
||||||
LOG(DEBUG) << "FileManager was cleared " << timer;
|
LOG(DEBUG) << "FileManager was cleared " << timer;
|
||||||
|
file_reference_manager_.reset();
|
||||||
|
LOG(DEBUG) << "FileReferenceManager was cleared " << timer;
|
||||||
inline_queries_manager_.reset();
|
inline_queries_manager_.reset();
|
||||||
LOG(DEBUG) << "InlineQueriesManager was cleared " << timer;
|
LOG(DEBUG) << "InlineQueriesManager was cleared " << timer;
|
||||||
messages_manager_.reset();
|
messages_manager_.reset();
|
||||||
@ -3808,10 +3808,10 @@ void Td::clear() {
|
|||||||
LOG(DEBUG) << "AuthManager actor was cleared " << timer;
|
LOG(DEBUG) << "AuthManager actor was cleared " << timer;
|
||||||
contacts_manager_actor_.reset();
|
contacts_manager_actor_.reset();
|
||||||
LOG(DEBUG) << "ContactsManager actor was cleared " << timer;
|
LOG(DEBUG) << "ContactsManager actor was cleared " << timer;
|
||||||
file_reference_manager_actor_.reset();
|
|
||||||
LOG(DEBUG) << "FileReferenceManager actor was cleared " << timer;
|
|
||||||
file_manager_actor_.reset();
|
file_manager_actor_.reset();
|
||||||
LOG(DEBUG) << "FileManager actor was cleared " << timer;
|
LOG(DEBUG) << "FileManager actor was cleared " << timer;
|
||||||
|
file_reference_manager_actor_.reset();
|
||||||
|
LOG(DEBUG) << "FileReferenceManager actor was cleared " << timer;
|
||||||
inline_queries_manager_actor_.reset();
|
inline_queries_manager_actor_.reset();
|
||||||
LOG(DEBUG) << "InlineQueriesManager actor was cleared " << timer;
|
LOG(DEBUG) << "InlineQueriesManager actor was cleared " << timer;
|
||||||
messages_manager_actor_.reset(); // TODO: Stop silent
|
messages_manager_actor_.reset(); // TODO: Stop silent
|
||||||
@ -4087,15 +4087,16 @@ Status Td::init(DbKey key) {
|
|||||||
private:
|
private:
|
||||||
Td *td_;
|
Td *td_;
|
||||||
};
|
};
|
||||||
file_reference_manager_ = make_unique<FileReferenceManager>();
|
|
||||||
file_reference_manager_actor_ = register_actor("FileReferenceManager", file_reference_manager_.get());
|
|
||||||
G()->set_file_reference_manager(file_reference_manager_actor_.get());
|
|
||||||
|
|
||||||
file_manager_ = make_unique<FileManager>(make_unique<FileManagerContext>(this));
|
file_manager_ = make_unique<FileManager>(make_unique<FileManagerContext>(this));
|
||||||
file_manager_actor_ = register_actor("FileManager", file_manager_.get());
|
file_manager_actor_ = register_actor("FileManager", file_manager_.get());
|
||||||
file_manager_->init_actor();
|
file_manager_->init_actor();
|
||||||
G()->set_file_manager(file_manager_actor_.get());
|
G()->set_file_manager(file_manager_actor_.get());
|
||||||
|
|
||||||
|
file_reference_manager_ = make_unique<FileReferenceManager>();
|
||||||
|
file_reference_manager_actor_ = register_actor("FileReferenceManager", file_reference_manager_.get());
|
||||||
|
G()->set_file_reference_manager(file_reference_manager_actor_.get());
|
||||||
|
|
||||||
VLOG(td_init) << "Create Managers";
|
VLOG(td_init) << "Create Managers";
|
||||||
audios_manager_ = make_unique<AudiosManager>(this);
|
audios_manager_ = make_unique<AudiosManager>(this);
|
||||||
callback_queries_manager_ = make_unique<CallbackQueriesManager>(this);
|
callback_queries_manager_ = make_unique<CallbackQueriesManager>(this);
|
||||||
|
@ -44,8 +44,8 @@ class ConfigManager;
|
|||||||
class ContactsManager;
|
class ContactsManager;
|
||||||
class DeviceTokenManager;
|
class DeviceTokenManager;
|
||||||
class DocumentsManager;
|
class DocumentsManager;
|
||||||
class FileReferenceManager;
|
|
||||||
class FileManager;
|
class FileManager;
|
||||||
|
class FileReferenceManager;
|
||||||
class InlineQueriesManager;
|
class InlineQueriesManager;
|
||||||
class HashtagHints;
|
class HashtagHints;
|
||||||
class LanguagePackManager;
|
class LanguagePackManager;
|
||||||
@ -139,10 +139,10 @@ class Td final : public NetQueryCallback {
|
|||||||
ActorOwn<AuthManager> auth_manager_actor_;
|
ActorOwn<AuthManager> auth_manager_actor_;
|
||||||
unique_ptr<ContactsManager> contacts_manager_;
|
unique_ptr<ContactsManager> contacts_manager_;
|
||||||
ActorOwn<ContactsManager> contacts_manager_actor_;
|
ActorOwn<ContactsManager> contacts_manager_actor_;
|
||||||
unique_ptr<FileReferenceManager> file_reference_manager_;
|
|
||||||
ActorOwn<FileReferenceManager> file_reference_manager_actor_;
|
|
||||||
unique_ptr<FileManager> file_manager_;
|
unique_ptr<FileManager> file_manager_;
|
||||||
ActorOwn<FileManager> file_manager_actor_;
|
ActorOwn<FileManager> file_manager_actor_;
|
||||||
|
unique_ptr<FileReferenceManager> file_reference_manager_;
|
||||||
|
ActorOwn<FileReferenceManager> file_reference_manager_actor_;
|
||||||
unique_ptr<InlineQueriesManager> inline_queries_manager_;
|
unique_ptr<InlineQueriesManager> inline_queries_manager_;
|
||||||
ActorOwn<InlineQueriesManager> inline_queries_manager_actor_;
|
ActorOwn<InlineQueriesManager> inline_queries_manager_actor_;
|
||||||
unique_ptr<MessagesManager> messages_manager_;
|
unique_ptr<MessagesManager> messages_manager_;
|
||||||
|
@ -607,6 +607,7 @@ void FileManager::init_actor() {
|
|||||||
file_generate_manager_ = create_actor_on_scheduler<FileGenerateManager>(
|
file_generate_manager_ = create_actor_on_scheduler<FileGenerateManager>(
|
||||||
"FileGenerateManager", G()->get_slow_net_scheduler_id(), context_->create_reference());
|
"FileGenerateManager", G()->get_slow_net_scheduler_id(), context_->create_reference());
|
||||||
}
|
}
|
||||||
|
|
||||||
FileManager::~FileManager() {
|
FileManager::~FileManager() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user