Fix has_input_media.

GitOrigin-RevId: f10ffc8116028849b3a0afc4ebf7169d707dd794
This commit is contained in:
levlam 2018-01-31 12:18:40 +03:00
parent e0d303095f
commit 536def0382
8 changed files with 50 additions and 20 deletions

View File

@ -330,10 +330,14 @@ const DocumentsManager::Document *DocumentsManager::get_document(FileId file_id)
return document->second.get();
}
bool DocumentsManager::has_input_media(FileId file_id, bool is_secret) const {
bool DocumentsManager::has_input_media(FileId file_id, FileId thumbnail_file_id, bool is_secret) const {
auto file_view = td_->file_manager_->get_file_view(file_id);
if (is_secret) {
return file_view.is_encrypted() && file_view.has_remote_location();
if (file_view.encryption_key().empty() || !file_view.has_remote_location()) {
return false;
}
return !thumbnail_file_id.is_valid();
} else {
if (file_view.is_encrypted()) {
return false;

View File

@ -67,7 +67,7 @@ class DocumentsManager {
void create_document(FileId file_id, PhotoSize thumbnail, string file_name, string mime_type, bool replace);
bool has_input_media(FileId file_id, bool is_secret) const;
bool has_input_media(FileId file_id, FileId thumbnail_file_id, bool is_secret) const;
SecretInputMedia get_secret_input_media(FileId document_file_id,
tl_object_ptr<telegram_api::InputEncryptedFile> input_file,

View File

@ -6310,16 +6310,18 @@ void MessagesManager::after_get_difference() {
}
}
// TODO move to AnimationsManager
td_->animations_manager_->get_saved_animations(Auto());
if (td_->is_online()) {
// TODO move to AnimationsManager
td_->animations_manager_->get_saved_animations(Auto());
// TODO move to StickersManager
td_->stickers_manager_->get_installed_sticker_sets(false, Auto());
td_->stickers_manager_->get_installed_sticker_sets(true, Auto());
td_->stickers_manager_->get_featured_sticker_sets(Auto());
td_->stickers_manager_->get_recent_stickers(false, Auto());
td_->stickers_manager_->get_recent_stickers(true, Auto());
td_->stickers_manager_->get_favorite_stickers(Auto());
// TODO move to StickersManager
td_->stickers_manager_->get_installed_sticker_sets(false, Auto());
td_->stickers_manager_->get_installed_sticker_sets(true, Auto());
td_->stickers_manager_->get_featured_sticker_sets(Auto());
td_->stickers_manager_->get_recent_stickers(false, Auto());
td_->stickers_manager_->get_recent_stickers(true, Auto());
td_->stickers_manager_->get_favorite_stickers(Auto());
}
load_notification_settings();
@ -20342,10 +20344,14 @@ unique_ptr<MessageContent> MessagesManager::dup_message_content(DialogId dialog_
return file_manager->dup_file_id(file_id);
};
FileId thumbnail_file_id;
if (to_secret) {
thumbnail_file_id = get_message_content_thumbnail_file_id(content);
}
switch (content->get_id()) {
case MessageAnimation::ID: {
auto result = make_unique<MessageAnimation>(*static_cast<const MessageAnimation *>(content));
if (td_->documents_manager_->has_input_media(result->file_id, to_secret)) {
if (td_->documents_manager_->has_input_media(result->file_id, thumbnail_file_id, to_secret)) {
return std::move(result);
}
result->file_id = td_->animations_manager_->dup_animation(fix_file_id(result->file_id), result->file_id);
@ -20354,7 +20360,7 @@ unique_ptr<MessageContent> MessagesManager::dup_message_content(DialogId dialog_
}
case MessageAudio::ID: {
auto result = make_unique<MessageAudio>(*static_cast<const MessageAudio *>(content));
if (td_->documents_manager_->has_input_media(result->file_id, to_secret)) {
if (td_->documents_manager_->has_input_media(result->file_id, thumbnail_file_id, to_secret)) {
return std::move(result);
}
result->file_id = td_->audios_manager_->dup_audio(fix_file_id(result->file_id), result->file_id);
@ -20365,7 +20371,7 @@ unique_ptr<MessageContent> MessagesManager::dup_message_content(DialogId dialog_
return make_unique<MessageContact>(*static_cast<const MessageContact *>(content));
case MessageDocument::ID: {
auto result = make_unique<MessageDocument>(*static_cast<const MessageDocument *>(content));
if (td_->documents_manager_->has_input_media(result->file_id, to_secret)) {
if (td_->documents_manager_->has_input_media(result->file_id, thumbnail_file_id, to_secret)) {
return std::move(result);
}
result->file_id = td_->documents_manager_->dup_document(fix_file_id(result->file_id), result->file_id);
@ -20436,6 +20442,9 @@ unique_ptr<MessageContent> MessagesManager::dup_message_content(DialogId dialog_
}
result->photo.photos.back().file_id = fix_file_id(result->photo.photos.back().file_id);
if (thumbnail.type != 0) {
result->photo.photos[0].file_id = td_->file_manager_->dup_file_id(result->photo.photos[0].file_id);
}
return std::move(result);
}
case MessageSticker::ID: {
@ -20453,7 +20462,7 @@ unique_ptr<MessageContent> MessagesManager::dup_message_content(DialogId dialog_
return make_unique<MessageVenue>(*static_cast<const MessageVenue *>(content));
case MessageVideo::ID: {
auto result = make_unique<MessageVideo>(*static_cast<const MessageVideo *>(content));
if (td_->documents_manager_->has_input_media(result->file_id, to_secret)) {
if (td_->documents_manager_->has_input_media(result->file_id, thumbnail_file_id, to_secret)) {
return std::move(result);
}
result->file_id = td_->videos_manager_->dup_video(fix_file_id(result->file_id), result->file_id);
@ -20463,7 +20472,7 @@ unique_ptr<MessageContent> MessagesManager::dup_message_content(DialogId dialog_
case MessageVideoNote::ID: {
auto result = make_unique<MessageVideoNote>(*static_cast<const MessageVideoNote *>(content));
result->is_viewed = false;
if (td_->documents_manager_->has_input_media(result->file_id, to_secret)) {
if (td_->documents_manager_->has_input_media(result->file_id, thumbnail_file_id, to_secret)) {
return std::move(result);
}
result->file_id = td_->video_notes_manager_->dup_video_note(fix_file_id(result->file_id), result->file_id);
@ -20473,7 +20482,7 @@ unique_ptr<MessageContent> MessagesManager::dup_message_content(DialogId dialog_
case MessageVoiceNote::ID: {
auto result = make_unique<MessageVoiceNote>(*static_cast<const MessageVoiceNote *>(content));
result->is_listened = false;
if (td_->documents_manager_->has_input_media(result->file_id, to_secret)) {
if (td_->documents_manager_->has_input_media(result->file_id, thumbnail_file_id, to_secret)) {
return std::move(result);
}
result->file_id = td_->voice_notes_manager_->dup_voice_note(fix_file_id(result->file_id), result->file_id);

View File

@ -386,7 +386,17 @@ bool photo_has_input_media(FileManager *file_manager, const Photo &photo, bool i
auto file_id = photo.photos.back().file_id;
auto file_view = file_manager->get_file_view(file_id);
if (is_secret) {
return file_view.is_encrypted() && file_view.has_remote_location();
if (file_view.encryption_key().empty() || !file_view.has_remote_location()) {
return false;
}
for (const auto &size : photo.photos) {
if (size.type == 't' && size.file_id.is_valid()) {
return false;
}
}
return true;
} else {
if (file_view.is_encrypted()) {
return false;

View File

@ -1687,6 +1687,7 @@ void SecretChatActor::on_outbound_outer_send_message_promise(uint64 state_id, Pr
LOG(INFO) << "Outbound secret message [TODO] " << tag("logevent_id", state->message->logevent_id());
promise.set_value(Unit()); // Seems like this message is at least stored to binlog already
}
void SecretChatActor::outbound_loop(OutboundMessageState *state, uint64 state_id) {
if (close_flag_) {
return;

View File

@ -1229,7 +1229,7 @@ bool StickersManager::has_input_media(FileId sticker_file_id, bool is_secret) co
auto file_view = td_->file_manager_->get_file_view(sticker_file_id);
if (is_secret) {
if (file_view.is_encrypted()) {
if (file_view.has_remote_location()) {
if (file_view.has_remote_location() && !sticker->message_thumbnail.file_id.is_valid()) {
return true;
}
} else {

View File

@ -3562,6 +3562,10 @@ void Td::on_channel_unban_timeout(int64 channel_id_long) {
contacts_manager_->on_channel_unban_timeout(ChannelId(narrow_cast<int32>(channel_id_long)));
}
bool Td::is_online() const {
return is_online_;
}
void Td::request(uint64 id, tl_object_ptr<td_api::Function> function) {
request_set_.insert(id);

View File

@ -97,6 +97,8 @@ class Td final : public NetQueryCallback {
void on_channel_unban_timeout(int64 channel_id_long);
bool is_online() const;
template <class ActorT, class... ArgsT>
ActorId<ActorT> create_net_actor(ArgsT &&... args) {
auto slot_id = request_actors_.create(ActorOwn<>(), RequestActorIdType);