Fix some secret chat actions on closing.

GitOrigin-RevId: 055965d9dd24f42c16826d18c88ef1205d9b808e
This commit is contained in:
levlam 2018-07-24 01:45:44 +03:00
parent 9882a8a619
commit 7fd2a81a38
4 changed files with 28 additions and 18 deletions

View File

@ -8523,10 +8523,8 @@ void MessagesManager::delete_dialog_history_from_server(DialogId dialog_id, Mess
->send(dialog_id.get_channel_id(), max_message_id, allow_error); ->send(dialog_id.get_channel_id(), max_message_id, allow_error);
break; break;
case DialogType::SecretChat: case DialogType::SecretChat:
// TODO: use promise
send_closure(G()->secret_chats_manager(), &SecretChatsManager::delete_all_messages, send_closure(G()->secret_chats_manager(), &SecretChatsManager::delete_all_messages,
dialog_id.get_secret_chat_id(), Promise<>()); dialog_id.get_secret_chat_id(), std::move(promise));
promise.set_value(Unit());
break; break;
case DialogType::None: case DialogType::None:
default: default:

View File

@ -36,9 +36,11 @@
#define G GLOBAL_SHOULD_NOT_BE_USED_HERE #define G GLOBAL_SHOULD_NOT_BE_USED_HERE
namespace td { namespace td {
inline TLObjectStorer<secret_api::Object> create_storer(const secret_api::Object &object) { inline TLObjectStorer<secret_api::Object> create_storer(const secret_api::Object &object) {
return TLObjectStorer<secret_api::Object>(object); return TLObjectStorer<secret_api::Object>(object);
} }
class SecretImpl { class SecretImpl {
public: public:
explicit SecretImpl(const Storer &data) : data(data) { explicit SecretImpl(const Storer &data) : data(data) {
@ -52,6 +54,7 @@ class SecretImpl {
private: private:
const Storer &data; const Storer &data;
}; };
SecretChatActor::SecretChatActor(int32 id, std::unique_ptr<Context> context, bool can_be_empty) SecretChatActor::SecretChatActor(int32 id, std::unique_ptr<Context> context, bool can_be_empty)
: context_(std::move(context)), can_be_empty_(can_be_empty) { : context_(std::move(context)), can_be_empty_(can_be_empty) {
auth_state_.id = id; auth_state_.id = id;
@ -87,8 +90,13 @@ void SecretChatActor::create_chat(int32 user_id, int64 user_access_hash, int32 r
promise.set_value(SecretChatId(random_id)); promise.set_value(SecretChatId(random_id));
loop(); loop();
} }
void SecretChatActor::on_result_resendable(NetQueryPtr net_query, Promise<NetQueryPtr> promise) { void SecretChatActor::on_result_resendable(NetQueryPtr net_query, Promise<NetQueryPtr> promise) {
LOG(INFO) << "on_result_resendable: " << net_query; LOG(INFO) << "on_result_resendable: " << net_query << " " << close_flag_;
if (context_->close_flag()) {
return;
}
auto key = UniqueId::extract_key(net_query->id()); auto key = UniqueId::extract_key(net_query->id());
if (close_flag_) { if (close_flag_) {
if (key == static_cast<uint8>(QueryType::DiscardEncryption)) { if (key == static_cast<uint8>(QueryType::DiscardEncryption)) {
@ -103,7 +111,8 @@ void SecretChatActor::on_result_resendable(NetQueryPtr net_query, Promise<NetQue
case static_cast<uint8>(QueryType::EncryptedChat): case static_cast<uint8>(QueryType::EncryptedChat):
return on_update_chat(std::move(net_query)); return on_update_chat(std::move(net_query));
case static_cast<uint8>(QueryType::Message): case static_cast<uint8>(QueryType::Message):
return on_outbound_send_message_result(std::move(net_query), std::move(promise)), Status::OK(); on_outbound_send_message_result(std::move(net_query), std::move(promise));
return Status::OK();
case static_cast<uint8>(QueryType::ReadHistory): case static_cast<uint8>(QueryType::ReadHistory):
return on_read_history(std::move(net_query)); return on_read_history(std::move(net_query));
case static_cast<uint8>(QueryType::Ignore): case static_cast<uint8>(QueryType::Ignore):
@ -114,18 +123,21 @@ void SecretChatActor::on_result_resendable(NetQueryPtr net_query, Promise<NetQue
loop(); loop();
} }
void SecretChatActor::replay_close_chat(std::unique_ptr<logevent::CloseSecretChat> event) { void SecretChatActor::replay_close_chat(std::unique_ptr<logevent::CloseSecretChat> event) {
if (close_flag_) { if (close_flag_) {
return; return;
} }
do_close_chat_impl(std::move(event)); do_close_chat_impl(std::move(event));
} }
void SecretChatActor::replay_create_chat(std::unique_ptr<logevent::CreateSecretChat> event) { void SecretChatActor::replay_create_chat(std::unique_ptr<logevent::CreateSecretChat> event) {
if (close_flag_) { if (close_flag_) {
return; return;
} }
do_create_chat_impl(std::move(event)); do_create_chat_impl(std::move(event));
} }
void SecretChatActor::add_inbound_message(std::unique_ptr<logevent::InboundSecretMessage> message) { void SecretChatActor::add_inbound_message(std::unique_ptr<logevent::InboundSecretMessage> message) {
SCOPE_EXIT { SCOPE_EXIT {
if (message) { if (message) {

View File

@ -43,9 +43,7 @@
namespace td { namespace td {
class BinlogInterface; class BinlogInterface;
class DhCache;
class NetQueryCreator; class NetQueryCreator;
class SequenceDispatcher;
class SecretChatActor : public NetQueryCallback { class SecretChatActor : public NetQueryCallback {
public: public:

View File

@ -275,11 +275,12 @@ class InboundSecretMessage : public LogEventHelper<InboundSecretMessage, SecretC
} }
StringBuilder &print(StringBuilder &sb) const override { StringBuilder &print(StringBuilder &sb) const override {
return sb << "[Logevent InboundSecretMessage " << tag("id", logevent_id()) return sb << "[Logevent InboundSecretMessage " << tag("id", logevent_id()) << tag("qts", qts)
<< tag("auth_key_id", format::as_hex(auth_key_id)) << tag("message_id", message_id) << tag("chat_id", chat_id) << tag("date", date) << tag("auth_key_id", format::as_hex(auth_key_id))
<< tag("my_in_seq_no", my_in_seq_no) << tag("my_out_seq_no", my_out_seq_no) << tag("message_id", message_id) << tag("my_in_seq_no", my_in_seq_no)
<< tag("his_in_seq_no", his_in_seq_no) << tag("message", to_string(decrypted_message_layer)) << tag("my_out_seq_no", my_out_seq_no) << tag("his_in_seq_no", his_in_seq_no)
<< tag("is_pending", is_pending) << format::cond(has_encrypted_file, tag("file", file)) << "]"; << tag("message", to_string(decrypted_message_layer)) << tag("is_pending", is_pending)
<< format::cond(has_encrypted_file, tag("file", file)) << "]";
} }
}; };
@ -376,11 +377,11 @@ class OutboundSecretMessage : public LogEventHelper<OutboundSecretMessage, Secre
} }
StringBuilder &print(StringBuilder &sb) const override { StringBuilder &print(StringBuilder &sb) const override {
return sb << "[Logevent OutboundSecretMessage " << tag("id", logevent_id()) << tag("is_sent", is_sent) return sb << "[Logevent OutboundSecretMessage " << tag("id", logevent_id()) << tag("chat_id", chat_id)
<< tag("is_service", is_service) << tag("is_rewritable", is_rewritable) << tag("is_external", is_external) << tag("is_sent", is_sent) << tag("is_service", is_service) << tag("is_rewritable", is_rewritable)
<< tag("message_id", message_id) << tag("random_id", random_id) << tag("my_in_seq_no", my_in_seq_no) << tag("is_external", is_external) << tag("message_id", message_id) << tag("random_id", random_id)
<< tag("my_out_seq_no", my_out_seq_no) << tag("his_in_seq_no", his_in_seq_no) << tag("file", file) << tag("my_in_seq_no", my_in_seq_no) << tag("my_out_seq_no", my_out_seq_no)
<< tag("action", to_string(action)) << "]"; << tag("his_in_seq_no", his_in_seq_no) << tag("file", file) << tag("action", to_string(action)) << "]";
} }
}; };
@ -430,7 +431,8 @@ class CreateSecretChat : public LogEventHelper<CreateSecretChat, SecretChatEvent
} }
StringBuilder &print(StringBuilder &sb) const override { StringBuilder &print(StringBuilder &sb) const override {
return sb << "[Logevent CreateSecretChat " << tag("id", logevent_id()) << tag("chat_id", random_id) << "]"; return sb << "[Logevent CreateSecretChat " << tag("id", logevent_id()) << tag("chat_id", random_id)
<< tag("user_id", user_id) << "]";
} }
}; };