Don't generate MASK for parsed object/vector fields.

This commit is contained in:
levlam 2021-11-01 20:48:06 +03:00
parent 0522ba178a
commit 4533f79338
8 changed files with 35 additions and 16 deletions

View File

@ -164,13 +164,34 @@ std::string TD_TL_writer_h::gen_function_vars(const tl::tl_combinator *t,
return res; return res;
} }
std::string TD_TL_writer_h::gen_flags_definitions(const tl::tl_combinator *t) const { bool TD_TL_writer_h::need_arg_mask(const tl::arg &a, bool can_be_stored) const {
if (a.exist_var_num == -1) {
return false;
}
if (can_be_stored) {
return true;
}
if (a.type->get_type() != tl::NODE_TYPE_TYPE) {
return true;
}
const tl::tl_tree_type *tree_type = static_cast<tl::tl_tree_type *>(a.type);
const std::string &name = tree_type->type->name;
if (!is_built_in_simple_type(name)) {
return false;
}
return true;
}
std::string TD_TL_writer_h::gen_flags_definitions(const tl::tl_combinator *t, bool can_be_stored) const {
std::vector<std::pair<std::string, std::int32_t>> flags; std::vector<std::pair<std::string, std::int32_t>> flags;
for (std::size_t i = 0; i < t->args.size(); i++) { for (std::size_t i = 0; i < t->args.size(); i++) {
const tl::arg &a = t->args[i]; const tl::arg &a = t->args[i];
if (a.exist_var_num != -1) { if (need_arg_mask(a, can_be_stored)) {
auto name = a.name; auto name = a.name;
for (auto &c : name) { for (auto &c : name) {
c = to_upper(c); c = to_upper(c);

View File

@ -20,6 +20,8 @@ class TD_TL_writer_h : public TD_TL_writer {
static std::string forward_declaration(std::string type); static std::string forward_declaration(std::string type);
bool need_arg_mask(const tl::arg &a, bool can_be_stored) const;
public: public:
TD_TL_writer_h(const std::string &tl_name, const std::string &string_type, const std::string &bytes_type, TD_TL_writer_h(const std::string &tl_name, const std::string &string_type, const std::string &bytes_type,
const std::vector<std::string> &ext_include) const std::vector<std::string> &ext_include)
@ -40,7 +42,7 @@ class TD_TL_writer_h : public TD_TL_writer {
std::string gen_field_definition(const std::string &class_name, const std::string &type_name, std::string gen_field_definition(const std::string &class_name, const std::string &type_name,
const std::string &field_name) const override; const std::string &field_name) const override;
std::string gen_flags_definitions(const tl::tl_combinator *t) const override; std::string gen_flags_definitions(const tl::tl_combinator *t, bool can_be_stored) const override;
std::string gen_vars(const tl::tl_combinator *t, const tl::tl_tree_type *result_type, std::string gen_vars(const tl::tl_combinator *t, const tl::tl_tree_type *result_type,
std::vector<tl::var_description> &vars) const override; std::vector<tl::var_description> &vars) const override;
std::string gen_function_vars(const tl::tl_combinator *t, std::vector<tl::var_description> &vars) const override; std::string gen_function_vars(const tl::tl_combinator *t, std::vector<tl::var_description> &vars) const override;

View File

@ -8724,7 +8724,6 @@ ContactsManager::User *ContactsManager::get_user_force(UserId user_id) {
telegram_api::object_ptr<telegram_api::userProfilePhoto> profile_photo; telegram_api::object_ptr<telegram_api::userProfilePhoto> profile_photo;
if (!G()->is_test_dc() && profile_photo_id != 0) { if (!G()->is_test_dc() && profile_photo_id != 0) {
flags |= telegram_api::user::PHOTO_MASK;
profile_photo = telegram_api::make_object<telegram_api::userProfilePhoto>(0, false /*ignored*/, profile_photo_id, profile_photo = telegram_api::make_object<telegram_api::userProfilePhoto>(0, false /*ignored*/, profile_photo_id,
BufferSlice(), profile_photo_dc_id); BufferSlice(), profile_photo_dc_id);
} }

View File

@ -3848,9 +3848,9 @@ static auto secret_to_telegram_document(secret_api::decryptedMessageMediaExterna
} }
vector<telegram_api::object_ptr<telegram_api::PhotoSize>> thumbnails; vector<telegram_api::object_ptr<telegram_api::PhotoSize>> thumbnails;
thumbnails.push_back(secret_to_telegram<telegram_api::PhotoSize>(*from.thumb_)); thumbnails.push_back(secret_to_telegram<telegram_api::PhotoSize>(*from.thumb_));
return make_tl_object<telegram_api::document>( return make_tl_object<telegram_api::document>(0, from.id_, from.access_hash_, BufferSlice(), from.date_,
telegram_api::document::THUMBS_MASK, from.id_, from.access_hash_, BufferSlice(), from.date_, from.mime_type_, from.mime_type_, from.size_, std::move(thumbnails), Auto(), from.dc_id_,
from.size_, std::move(thumbnails), Auto(), from.dc_id_, secret_to_telegram(from.attributes_)); secret_to_telegram(from.attributes_));
} }
template <class ToT, class FromT> template <class ToT, class FromT>
@ -4116,7 +4116,7 @@ unique_ptr<MessageContent> get_message_content(Td *td, FormattedText message,
return make_unique<MessageText>(std::move(message), WebPageId()); return make_unique<MessageText>(std::move(message), WebPageId());
case telegram_api::messageMediaPhoto::ID: { case telegram_api::messageMediaPhoto::ID: {
auto message_photo = move_tl_object_as<telegram_api::messageMediaPhoto>(media); auto message_photo = move_tl_object_as<telegram_api::messageMediaPhoto>(media);
if ((message_photo->flags_ & telegram_api::messageMediaPhoto::PHOTO_MASK) == 0) { if (message_photo->photo_ == nullptr) {
if ((message_photo->flags_ & telegram_api::messageMediaPhoto::TTL_SECONDS_MASK) == 0) { if ((message_photo->flags_ & telegram_api::messageMediaPhoto::TTL_SECONDS_MASK) == 0) {
LOG(ERROR) << "Receive messageMediaPhoto without photo and TTL: " << oneline(to_string(message_photo)); LOG(ERROR) << "Receive messageMediaPhoto without photo and TTL: " << oneline(to_string(message_photo));
break; break;
@ -4196,7 +4196,7 @@ unique_ptr<MessageContent> get_message_content(Td *td, FormattedText message,
} }
case telegram_api::messageMediaDocument::ID: { case telegram_api::messageMediaDocument::ID: {
auto message_document = move_tl_object_as<telegram_api::messageMediaDocument>(media); auto message_document = move_tl_object_as<telegram_api::messageMediaDocument>(media);
if ((message_document->flags_ & telegram_api::messageMediaDocument::DOCUMENT_MASK) == 0) { if (message_document->document_ == nullptr) {
if ((message_document->flags_ & telegram_api::messageMediaDocument::TTL_SECONDS_MASK) == 0) { if ((message_document->flags_ & telegram_api::messageMediaDocument::TTL_SECONDS_MASK) == 0) {
LOG(ERROR) << "Receive messageMediaDocument without document and TTL: " LOG(ERROR) << "Receive messageMediaDocument without document and TTL: "
<< oneline(to_string(message_document)); << oneline(to_string(message_document));

View File

@ -26621,7 +26621,7 @@ unique_ptr<MessagesManager::MessageForwardInfo> MessagesManager::get_message_for
message_id = MessageId(); message_id = MessageId();
} }
} }
if ((flags & telegram_api::messageFwdHeader::SAVED_FROM_PEER_MASK) != 0) { if (forward_header->saved_from_peer_ != nullptr) {
from_dialog_id = DialogId(forward_header->saved_from_peer_); from_dialog_id = DialogId(forward_header->saved_from_peer_);
from_message_id = MessageId(ServerMessageId(forward_header->saved_from_msg_id_)); from_message_id = MessageId(ServerMessageId(forward_header->saved_from_msg_id_));
if (!from_dialog_id.is_valid() || !from_message_id.is_valid()) { if (!from_dialog_id.is_valid() || !from_message_id.is_valid()) {

View File

@ -3280,9 +3280,6 @@ Status NotificationManager::process_push_notification_payload(string payload, bo
// set phone number flag to show that this is a full access hash // set phone number flag to show that this is a full access hash
flags |= telegram_api::user::ACCESS_HASH_MASK | telegram_api::user::PHONE_MASK; flags |= telegram_api::user::ACCESS_HASH_MASK | telegram_api::user::PHONE_MASK;
} }
if (sender_photo != nullptr) {
flags |= telegram_api::user::PHOTO_MASK;
}
auto user_name = sender_user_id.get() == 136817688 ? "Channel" : sender_name; auto user_name = sender_user_id.get() == 136817688 ? "Channel" : sender_name;
auto user = telegram_api::make_object<telegram_api::user>( auto user = telegram_api::make_object<telegram_api::user>(
flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/,

View File

@ -248,7 +248,7 @@ static void write_function(tl_outputer &out, const tl_combinator *t, const std::
out.append(w.gen_class_begin(class_name, w.gen_base_function_class_name(), false)); out.append(w.gen_class_begin(class_name, w.gen_base_function_class_name(), false));
int required_args = gen_field_definitions(out, t, class_name, w); int required_args = gen_field_definitions(out, t, class_name, w);
out.append(w.gen_flags_definitions(t)); out.append(w.gen_flags_definitions(t, true));
std::vector<var_description> vars(t->var_count); std::vector<var_description> vars(t->var_count);
out.append(w.gen_function_vars(t, vars)); out.append(w.gen_function_vars(t, vars));
@ -304,7 +304,6 @@ static void write_constructor(tl_outputer &out, const tl_combinator *t, const st
out.append(w.gen_class_begin(class_name, base_class, is_proxy)); out.append(w.gen_class_begin(class_name, base_class, is_proxy));
int required_args = gen_field_definitions(out, t, class_name, w); int required_args = gen_field_definitions(out, t, class_name, w);
out.append(w.gen_flags_definitions(t));
bool can_be_parsed = false; bool can_be_parsed = false;
bool is_can_be_parsed_inited = false; bool is_can_be_parsed_inited = false;
@ -334,6 +333,7 @@ static void write_constructor(tl_outputer &out, const tl_combinator *t, const st
can_be_stored = true; can_be_stored = true;
} }
out.append(w.gen_flags_definitions(t, can_be_stored));
if (w.is_default_constructor_generated(t, can_be_parsed, can_be_stored)) { if (w.is_default_constructor_generated(t, can_be_parsed, can_be_stored)) {
write_class_constructor(out, t, class_name, true, w); write_class_constructor(out, t, class_name, true, w);
} }

View File

@ -96,7 +96,7 @@ class TL_writer {
virtual std::string gen_field_definition(const std::string &class_name, const std::string &type_name, virtual std::string gen_field_definition(const std::string &class_name, const std::string &type_name,
const std::string &field_name) const = 0; const std::string &field_name) const = 0;
virtual std::string gen_flags_definitions(const tl_combinator *t) const { virtual std::string gen_flags_definitions(const tl_combinator *t, bool can_be_stored) const {
return ""; return "";
} }