Add explicit Context to WebPageBlock methods.

GitOrigin-RevId: b3e9b9994091e16ae789311ed598067ae5f1fa3d
This commit is contained in:
levlam 2020-03-02 22:31:01 +03:00
parent e326fdcf80
commit c36b6948b0
3 changed files with 200 additions and 178 deletions

View File

@ -38,11 +38,24 @@
namespace td { namespace td {
struct GetWebPageBlockObjectContext {
Td *td_;
};
static vector<td_api::object_ptr<td_api::PageBlock>> get_page_block_objects(
const vector<unique_ptr<WebPageBlock>> &page_blocks, GetWebPageBlockObjectContext *context) {
return transform(page_blocks, [context](const unique_ptr<WebPageBlock> &page_block) {
return page_block->get_page_block_object(context);
});
}
namespace { namespace {
class RichText { class RichText {
static vector<td_api::object_ptr<td_api::RichText>> get_rich_text_objects(const vector<RichText> &rich_texts) { static vector<td_api::object_ptr<td_api::RichText>> get_rich_text_objects(const vector<RichText> &rich_texts,
return transform(rich_texts, [](const RichText &rich_text) { return rich_text.get_rich_text_object(); }); GetWebPageBlockObjectContext *context) {
return transform(rich_texts,
[context](const RichText &rich_text) { return rich_text.get_rich_text_object(context); });
} }
public: public:
@ -73,54 +86,55 @@ class RichText {
return type == Type::Plain && content.empty(); return type == Type::Plain && content.empty();
} }
void append_file_ids(vector<FileId> &file_ids) const { void append_file_ids(const Td *td, vector<FileId> &file_ids) const {
if (type == RichText::Type::Icon) { if (type == RichText::Type::Icon) {
CHECK(document_file_id.is_valid()); CHECK(document_file_id.is_valid());
Document(Document::Type::General, document_file_id).append_file_ids(G()->td().get_actor_unsafe(), file_ids); Document(Document::Type::General, document_file_id).append_file_ids(td, file_ids);
} else { } else {
for (auto &text : texts) { for (auto &text : texts) {
text.append_file_ids(file_ids); text.append_file_ids(td, file_ids);
} }
} }
} }
td_api::object_ptr<td_api::RichText> get_rich_text_object() const { td_api::object_ptr<td_api::RichText> get_rich_text_object(GetWebPageBlockObjectContext *context) const {
switch (type) { switch (type) {
case RichText::Type::Plain: case RichText::Type::Plain:
return make_tl_object<td_api::richTextPlain>(content); return make_tl_object<td_api::richTextPlain>(content);
case RichText::Type::Bold: case RichText::Type::Bold:
return make_tl_object<td_api::richTextBold>(texts[0].get_rich_text_object()); return make_tl_object<td_api::richTextBold>(texts[0].get_rich_text_object(context));
case RichText::Type::Italic: case RichText::Type::Italic:
return make_tl_object<td_api::richTextItalic>(texts[0].get_rich_text_object()); return make_tl_object<td_api::richTextItalic>(texts[0].get_rich_text_object(context));
case RichText::Type::Underline: case RichText::Type::Underline:
return make_tl_object<td_api::richTextUnderline>(texts[0].get_rich_text_object()); return make_tl_object<td_api::richTextUnderline>(texts[0].get_rich_text_object(context));
case RichText::Type::Strikethrough: case RichText::Type::Strikethrough:
return make_tl_object<td_api::richTextStrikethrough>(texts[0].get_rich_text_object()); return make_tl_object<td_api::richTextStrikethrough>(texts[0].get_rich_text_object(context));
case RichText::Type::Fixed: case RichText::Type::Fixed:
return make_tl_object<td_api::richTextFixed>(texts[0].get_rich_text_object()); return make_tl_object<td_api::richTextFixed>(texts[0].get_rich_text_object(context));
case RichText::Type::Url: case RichText::Type::Url:
return make_tl_object<td_api::richTextUrl>(texts[0].get_rich_text_object(), content, web_page_id.is_valid()); return make_tl_object<td_api::richTextUrl>(texts[0].get_rich_text_object(context), content,
web_page_id.is_valid());
case RichText::Type::EmailAddress: case RichText::Type::EmailAddress:
return make_tl_object<td_api::richTextEmailAddress>(texts[0].get_rich_text_object(), content); return make_tl_object<td_api::richTextEmailAddress>(texts[0].get_rich_text_object(context), content);
case RichText::Type::Concatenation: case RichText::Type::Concatenation:
return make_tl_object<td_api::richTexts>(get_rich_text_objects(texts)); return make_tl_object<td_api::richTexts>(get_rich_text_objects(texts, context));
case RichText::Type::Subscript: case RichText::Type::Subscript:
return make_tl_object<td_api::richTextSubscript>(texts[0].get_rich_text_object()); return make_tl_object<td_api::richTextSubscript>(texts[0].get_rich_text_object(context));
case RichText::Type::Superscript: case RichText::Type::Superscript:
return make_tl_object<td_api::richTextSuperscript>(texts[0].get_rich_text_object()); return make_tl_object<td_api::richTextSuperscript>(texts[0].get_rich_text_object(context));
case RichText::Type::Marked: case RichText::Type::Marked:
return make_tl_object<td_api::richTextMarked>(texts[0].get_rich_text_object()); return make_tl_object<td_api::richTextMarked>(texts[0].get_rich_text_object(context));
case RichText::Type::PhoneNumber: case RichText::Type::PhoneNumber:
return make_tl_object<td_api::richTextPhoneNumber>(texts[0].get_rich_text_object(), content); return make_tl_object<td_api::richTextPhoneNumber>(texts[0].get_rich_text_object(context), content);
case RichText::Type::Icon: { case RichText::Type::Icon: {
auto dimensions = to_integer<uint32>(content); auto dimensions = to_integer<uint32>(content);
auto width = static_cast<int32>(dimensions / 65536); auto width = static_cast<int32>(dimensions / 65536);
auto height = static_cast<int32>(dimensions % 65536); auto height = static_cast<int32>(dimensions % 65536);
return make_tl_object<td_api::richTextIcon>( return make_tl_object<td_api::richTextIcon>(
G()->td().get_actor_unsafe()->documents_manager_->get_document_object(document_file_id), width, height); context->td_->documents_manager_->get_document_object(document_file_id), width, height);
} }
case RichText::Type::Anchor: case RichText::Type::Anchor:
return make_tl_object<td_api::richTextAnchor>(texts[0].get_rich_text_object(), content); return make_tl_object<td_api::richTextAnchor>(texts[0].get_rich_text_object(context), content);
} }
UNREACHABLE(); UNREACHABLE();
return nullptr; return nullptr;
@ -168,13 +182,15 @@ class WebPageBlockCaption {
RichText text; RichText text;
RichText credit; RichText credit;
void append_file_ids(vector<FileId> &file_ids) const { void append_file_ids(const Td *td, vector<FileId> &file_ids) const {
text.append_file_ids(file_ids); text.append_file_ids(td, file_ids);
credit.append_file_ids(file_ids); credit.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::pageBlockCaption> get_page_block_caption_object() const { td_api::object_ptr<td_api::pageBlockCaption> get_page_block_caption_object(
return td_api::make_object<td_api::pageBlockCaption>(text.get_rich_text_object(), credit.get_rich_text_object()); GetWebPageBlockObjectContext *context) const {
return td_api::make_object<td_api::pageBlockCaption>(text.get_rich_text_object(context),
credit.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -209,7 +225,8 @@ class WebPageBlockTableCell {
int32 colspan = 1; int32 colspan = 1;
int32 rowspan = 1; int32 rowspan = 1;
td_api::object_ptr<td_api::pageBlockTableCell> get_page_block_table_cell_object() const { td_api::object_ptr<td_api::pageBlockTableCell> get_page_block_table_cell_object(
GetWebPageBlockObjectContext *context) const {
auto align = [&]() -> td_api::object_ptr<td_api::PageBlockHorizontalAlignment> { auto align = [&]() -> td_api::object_ptr<td_api::PageBlockHorizontalAlignment> {
if (align_left) { if (align_left) {
return td_api::make_object<td_api::pageBlockHorizontalAlignmentLeft>(); return td_api::make_object<td_api::pageBlockHorizontalAlignmentLeft>();
@ -236,7 +253,7 @@ class WebPageBlockTableCell {
UNREACHABLE(); UNREACHABLE();
return nullptr; return nullptr;
}(); }();
return td_api::make_object<td_api::pageBlockTableCell>(text.empty() ? nullptr : text.get_rich_text_object(), return td_api::make_object<td_api::pageBlockTableCell>(text.empty() ? nullptr : text.get_rich_text_object(context),
is_header, colspan, rowspan, std::move(align), is_header, colspan, rowspan, std::move(align),
std::move(valign)); std::move(valign));
} }
@ -394,12 +411,12 @@ class WebPageBlockTitle : public WebPageBlock {
return Type::Title; return Type::Title;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
title.append_file_ids(file_ids); title.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockTitle>(title.get_rich_text_object()); return make_tl_object<td_api::pageBlockTitle>(title.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -427,12 +444,12 @@ class WebPageBlockSubtitle : public WebPageBlock {
return Type::Subtitle; return Type::Subtitle;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
subtitle.append_file_ids(file_ids); subtitle.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockSubtitle>(subtitle.get_rich_text_object()); return make_tl_object<td_api::pageBlockSubtitle>(subtitle.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -461,12 +478,12 @@ class WebPageBlockAuthorDate : public WebPageBlock {
return Type::AuthorDate; return Type::AuthorDate;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
author.append_file_ids(file_ids); author.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockAuthorDate>(author.get_rich_text_object(), date); return make_tl_object<td_api::pageBlockAuthorDate>(author.get_rich_text_object(context), date);
} }
template <class StorerT> template <class StorerT>
@ -496,12 +513,12 @@ class WebPageBlockHeader : public WebPageBlock {
return Type::Header; return Type::Header;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
header.append_file_ids(file_ids); header.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockHeader>(header.get_rich_text_object()); return make_tl_object<td_api::pageBlockHeader>(header.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -529,12 +546,12 @@ class WebPageBlockSubheader : public WebPageBlock {
return Type::Subheader; return Type::Subheader;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
subheader.append_file_ids(file_ids); subheader.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockSubheader>(subheader.get_rich_text_object()); return make_tl_object<td_api::pageBlockSubheader>(subheader.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -562,12 +579,12 @@ class WebPageBlockKicker : public WebPageBlock {
return Type::Kicker; return Type::Kicker;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
kicker.append_file_ids(file_ids); kicker.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockKicker>(kicker.get_rich_text_object()); return make_tl_object<td_api::pageBlockKicker>(kicker.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -595,12 +612,12 @@ class WebPageBlockParagraph : public WebPageBlock {
return Type::Paragraph; return Type::Paragraph;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
text.append_file_ids(file_ids); text.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockParagraph>(text.get_rich_text_object()); return make_tl_object<td_api::pageBlockParagraph>(text.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -629,12 +646,12 @@ class WebPageBlockPreformatted : public WebPageBlock {
return Type::Preformatted; return Type::Preformatted;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
text.append_file_ids(file_ids); text.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockPreformatted>(text.get_rich_text_object(), language); return make_tl_object<td_api::pageBlockPreformatted>(text.get_rich_text_object(context), language);
} }
template <class StorerT> template <class StorerT>
@ -664,12 +681,12 @@ class WebPageBlockFooter : public WebPageBlock {
return Type::Footer; return Type::Footer;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
footer.append_file_ids(file_ids); footer.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockFooter>(footer.get_rich_text_object()); return make_tl_object<td_api::pageBlockFooter>(footer.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -691,10 +708,10 @@ class WebPageBlockDivider : public WebPageBlock {
return Type::Divider; return Type::Divider;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockDivider>(); return make_tl_object<td_api::pageBlockDivider>();
} }
@ -719,10 +736,10 @@ class WebPageBlockAnchor : public WebPageBlock {
return Type::Anchor; return Type::Anchor;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockAnchor>(name); return make_tl_object<td_api::pageBlockAnchor>(name);
} }
@ -763,10 +780,11 @@ class WebPageBlockList : public WebPageBlock {
private: private:
vector<Item> items; vector<Item> items;
static td_api::object_ptr<td_api::pageBlockListItem> get_page_block_list_item_object(const Item &item) { static td_api::object_ptr<td_api::pageBlockListItem> get_page_block_list_item_object(const Item &item,
Context *context) {
// if label is empty, then Bullet U+2022 is used as a label // if label is empty, then Bullet U+2022 is used as a label
return td_api::make_object<td_api::pageBlockListItem>(item.label.empty() ? "\xE2\x80\xA2" : item.label, return td_api::make_object<td_api::pageBlockListItem>(item.label.empty() ? "\xE2\x80\xA2" : item.label,
get_page_block_objects(item.page_blocks)); get_page_block_objects(item.page_blocks, context));
} }
public: public:
@ -778,17 +796,17 @@ class WebPageBlockList : public WebPageBlock {
return Type::List; return Type::List;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
for (auto &item : items) { for (auto &item : items) {
for (auto &page_block : item.page_blocks) { for (auto &page_block : item.page_blocks) {
page_block->append_file_ids(file_ids); page_block->append_file_ids(td, file_ids);
} }
} }
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return td_api::make_object<td_api::pageBlockList>( return td_api::make_object<td_api::pageBlockList>(
transform(items, [](const Item &item) { return get_page_block_list_item_object(item); })); transform(items, [context](const Item &item) { return get_page_block_list_item_object(item, context); }));
} }
template <class StorerT> template <class StorerT>
@ -841,13 +859,14 @@ class WebPageBlockBlockQuote : public WebPageBlock {
return Type::BlockQuote; return Type::BlockQuote;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
text.append_file_ids(file_ids); text.append_file_ids(td, file_ids);
credit.append_file_ids(file_ids); credit.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockBlockQuote>(text.get_rich_text_object(), credit.get_rich_text_object()); return make_tl_object<td_api::pageBlockBlockQuote>(text.get_rich_text_object(context),
credit.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -878,13 +897,14 @@ class WebPageBlockPullQuote : public WebPageBlock {
return Type::PullQuote; return Type::PullQuote;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
text.append_file_ids(file_ids); text.append_file_ids(td, file_ids);
credit.append_file_ids(file_ids); credit.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockPullQuote>(text.get_rich_text_object(), credit.get_rich_text_object()); return make_tl_object<td_api::pageBlockPullQuote>(text.get_rich_text_object(context),
credit.get_rich_text_object(context));
} }
template <class StorerT> template <class StorerT>
@ -917,16 +937,15 @@ class WebPageBlockAnimation : public WebPageBlock {
return Type::Animation; return Type::Animation;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
Document(Document::Type::Animation, animation_file_id).append_file_ids(G()->td().get_actor_unsafe(), file_ids); Document(Document::Type::Animation, animation_file_id).append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockAnimation>( return make_tl_object<td_api::pageBlockAnimation>(
G()->td().get_actor_unsafe()->animations_manager_->get_animation_object(animation_file_id, context->td_->animations_manager_->get_animation_object(animation_file_id, "get_page_block_object"),
"get_page_block_object"), caption.get_page_block_caption_object(context), need_autoplay);
caption.get_page_block_caption_object(), need_autoplay);
} }
template <class StorerT> template <class StorerT>
@ -985,15 +1004,14 @@ class WebPageBlockPhoto : public WebPageBlock {
return Type::Photo; return Type::Photo;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
append(file_ids, photo_get_file_ids(photo)); append(file_ids, photo_get_file_ids(photo));
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockPhoto>( return make_tl_object<td_api::pageBlockPhoto>(get_photo_object(context->td_->file_manager_.get(), &photo),
get_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &photo), caption.get_page_block_caption_object(context), url);
caption.get_page_block_caption_object(), url);
} }
template <class StorerT> template <class StorerT>
@ -1036,15 +1054,15 @@ class WebPageBlockVideo : public WebPageBlock {
return Type::Video; return Type::Video;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
Document(Document::Type::Video, video_file_id).append_file_ids(G()->td().get_actor_unsafe(), file_ids); Document(Document::Type::Video, video_file_id).append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockVideo>( return make_tl_object<td_api::pageBlockVideo>(context->td_->videos_manager_->get_video_object(video_file_id),
G()->td().get_actor_unsafe()->videos_manager_->get_video_object(video_file_id), caption.get_page_block_caption_object(context), need_autoplay,
caption.get_page_block_caption_object(), need_autoplay, is_looped); is_looped);
} }
template <class StorerT> template <class StorerT>
@ -1101,12 +1119,12 @@ class WebPageBlockCover : public WebPageBlock {
return Type::Cover; return Type::Cover;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
cover->append_file_ids(file_ids); cover->append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockCover>(cover->get_page_block_object()); return make_tl_object<td_api::pageBlockCover>(cover->get_page_block_object(context));
} }
template <class StorerT> template <class StorerT>
@ -1148,15 +1166,15 @@ class WebPageBlockEmbedded : public WebPageBlock {
return Type::Embedded; return Type::Embedded;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
append(file_ids, photo_get_file_ids(poster_photo)); append(file_ids, photo_get_file_ids(poster_photo));
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockEmbedded>( return make_tl_object<td_api::pageBlockEmbedded>(
url, html, get_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &poster_photo), dimensions.width, url, html, get_photo_object(context->td_->file_manager_.get(), &poster_photo), dimensions.width,
dimensions.height, caption.get_page_block_caption_object(), is_full_width, allow_scrolling); dimensions.height, caption.get_page_block_caption_object(context), is_full_width, allow_scrolling);
} }
template <class StorerT> template <class StorerT>
@ -1214,18 +1232,18 @@ class WebPageBlockEmbeddedPost : public WebPageBlock {
return Type::EmbeddedPost; return Type::EmbeddedPost;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
append(file_ids, photo_get_file_ids(author_photo)); append(file_ids, photo_get_file_ids(author_photo));
for (auto &page_block : page_blocks) { for (auto &page_block : page_blocks) {
page_block->append_file_ids(file_ids); page_block->append_file_ids(td, file_ids);
} }
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockEmbeddedPost>( return make_tl_object<td_api::pageBlockEmbeddedPost>(
url, author, get_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &author_photo), date, url, author, get_photo_object(context->td_->file_manager_.get(), &author_photo), date,
get_page_block_objects(page_blocks), caption.get_page_block_caption_object()); get_page_block_objects(page_blocks, context), caption.get_page_block_caption_object(context));
} }
template <class StorerT> template <class StorerT>
@ -1265,16 +1283,16 @@ class WebPageBlockCollage : public WebPageBlock {
return Type::Collage; return Type::Collage;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
for (auto &page_block : page_blocks) { for (auto &page_block : page_blocks) {
page_block->append_file_ids(file_ids); page_block->append_file_ids(td, file_ids);
} }
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockCollage>(get_page_block_objects(page_blocks), return make_tl_object<td_api::pageBlockCollage>(get_page_block_objects(page_blocks, context),
caption.get_page_block_caption_object()); caption.get_page_block_caption_object(context));
} }
template <class StorerT> template <class StorerT>
@ -1306,16 +1324,16 @@ class WebPageBlockSlideshow : public WebPageBlock {
return Type::Slideshow; return Type::Slideshow;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
for (auto &page_block : page_blocks) { for (auto &page_block : page_blocks) {
page_block->append_file_ids(file_ids); page_block->append_file_ids(td, file_ids);
} }
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockSlideshow>(get_page_block_objects(page_blocks), return make_tl_object<td_api::pageBlockSlideshow>(get_page_block_objects(page_blocks, context),
caption.get_page_block_caption_object()); caption.get_page_block_caption_object(context));
} }
template <class StorerT> template <class StorerT>
@ -1348,13 +1366,13 @@ class WebPageBlockChatLink : public WebPageBlock {
return Type::ChatLink; return Type::ChatLink;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
append(file_ids, dialog_photo_get_file_ids(photo)); append(file_ids, dialog_photo_get_file_ids(photo));
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockChatLink>( return make_tl_object<td_api::pageBlockChatLink>(
title, get_chat_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &photo), username); title, get_chat_photo_object(context->td_->file_manager_.get(), &photo), username);
} }
template <class StorerT> template <class StorerT>
@ -1388,15 +1406,14 @@ class WebPageBlockAudio : public WebPageBlock {
return Type::Audio; return Type::Audio;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
Document(Document::Type::Audio, audio_file_id).append_file_ids(G()->td().get_actor_unsafe(), file_ids); Document(Document::Type::Audio, audio_file_id).append_file_ids(td, file_ids);
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockAudio>( return make_tl_object<td_api::pageBlockAudio>(context->td_->audios_manager_->get_audio_object(audio_file_id),
G()->td().get_actor_unsafe()->audios_manager_->get_audio_object(audio_file_id), caption.get_page_block_caption_object(context));
caption.get_page_block_caption_object());
} }
template <class StorerT> template <class StorerT>
@ -1460,22 +1477,23 @@ class WebPageBlockTable : public WebPageBlock {
return Type::Table; return Type::Table;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
title.append_file_ids(file_ids); title.append_file_ids(td, file_ids);
for (auto &row : cells) { for (auto &row : cells) {
for (auto &cell : row) { for (auto &cell : row) {
cell.text.append_file_ids(file_ids); cell.text.append_file_ids(td, file_ids);
} }
} }
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
auto cell_objects = transform(cells, [&](const vector<WebPageBlockTableCell> &row) { auto cell_objects = transform(cells, [&](const vector<WebPageBlockTableCell> &row) {
return transform(row, [&](const WebPageBlockTableCell &cell) { return cell.get_page_block_table_cell_object(); }); return transform(
row, [&](const WebPageBlockTableCell &cell) { return cell.get_page_block_table_cell_object(context); });
}); });
return make_tl_object<td_api::pageBlockTable>(title.get_rich_text_object(), std::move(cell_objects), is_bordered, return make_tl_object<td_api::pageBlockTable>(title.get_rich_text_object(context), std::move(cell_objects),
is_striped); is_bordered, is_striped);
} }
template <class StorerT> template <class StorerT>
@ -1516,16 +1534,16 @@ class WebPageBlockDetails : public WebPageBlock {
return Type::Details; return Type::Details;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
header.append_file_ids(file_ids); header.append_file_ids(td, file_ids);
for (auto &page_block : page_blocks) { for (auto &page_block : page_blocks) {
page_block->append_file_ids(file_ids); page_block->append_file_ids(td, file_ids);
} }
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockDetails>(header.get_rich_text_object(), get_page_block_objects(page_blocks), return make_tl_object<td_api::pageBlockDetails>(header.get_rich_text_object(context),
is_open); get_page_block_objects(page_blocks, context), is_open);
} }
template <class StorerT> template <class StorerT>
@ -1563,8 +1581,8 @@ class WebPageBlockRelatedArticles : public WebPageBlock {
return Type::RelatedArticles; return Type::RelatedArticles;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
header.append_file_ids(file_ids); header.append_file_ids(td, file_ids);
for (auto &article : related_articles) { for (auto &article : related_articles) {
if (article.photo.id != -2) { if (article.photo.id != -2) {
append(file_ids, photo_get_file_ids(article.photo)); append(file_ids, photo_get_file_ids(article.photo));
@ -1572,14 +1590,13 @@ class WebPageBlockRelatedArticles : public WebPageBlock {
} }
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
auto related_article_objects = transform(related_articles, [](const RelatedArticle &article) { auto related_article_objects = transform(related_articles, [context](const RelatedArticle &article) {
return td_api::make_object<td_api::pageBlockRelatedArticle>( return td_api::make_object<td_api::pageBlockRelatedArticle>(
article.url, article.title, article.description, article.url, article.title, article.description,
get_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &article.photo), article.author, get_photo_object(context->td_->file_manager_.get(), &article.photo), article.author, article.published_date);
article.published_date);
}); });
return make_tl_object<td_api::pageBlockRelatedArticles>(header.get_rich_text_object(), return make_tl_object<td_api::pageBlockRelatedArticles>(header.get_rich_text_object(context),
std::move(related_article_objects)); std::move(related_article_objects));
} }
@ -1614,13 +1631,13 @@ class WebPageBlockMap : public WebPageBlock {
return Type::Map; return Type::Map;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockMap>(location.get_location_object(), zoom, dimensions.width, return make_tl_object<td_api::pageBlockMap>(location.get_location_object(), zoom, dimensions.width,
dimensions.height, caption.get_page_block_caption_object()); dimensions.height, caption.get_page_block_caption_object(context));
} }
template <class StorerT> template <class StorerT>
@ -1656,15 +1673,15 @@ class WebPageBlockVoiceNote : public WebPageBlock {
return Type::VoiceNote; return Type::VoiceNote;
} }
void append_file_ids(vector<FileId> &file_ids) const override { void append_file_ids(const Td *td, vector<FileId> &file_ids) const override {
Document(Document::Type::VoiceNote, voice_note_file_id).append_file_ids(G()->td().get_actor_unsafe(), file_ids); Document(Document::Type::VoiceNote, voice_note_file_id).append_file_ids(td, file_ids);
caption.append_file_ids(file_ids); caption.append_file_ids(td, file_ids);
} }
td_api::object_ptr<td_api::PageBlock> get_page_block_object() const override { td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const override {
return make_tl_object<td_api::pageBlockVoiceNote>( return make_tl_object<td_api::pageBlockVoiceNote>(
G()->td().get_actor_unsafe()->voice_notes_manager_->get_voice_note_object(voice_note_file_id), context->td_->voice_notes_manager_->get_voice_note_object(voice_note_file_id),
caption.get_page_block_caption_object()); caption.get_page_block_caption_object(context));
} }
template <class StorerT> template <class StorerT>
@ -2331,9 +2348,10 @@ vector<unique_ptr<WebPageBlock>> get_web_page_blocks(
} }
vector<td_api::object_ptr<td_api::PageBlock>> get_page_block_objects( vector<td_api::object_ptr<td_api::PageBlock>> get_page_block_objects(
const vector<unique_ptr<WebPageBlock>> &page_blocks) { const vector<unique_ptr<WebPageBlock>> &page_blocks, Td *td) {
return transform(page_blocks, GetWebPageBlockObjectContext context;
[](const unique_ptr<WebPageBlock> &page_block) { return page_block->get_page_block_object(); }); context.td_ = td;
return get_page_block_objects(page_blocks, &context);
} }
} // namespace td } // namespace td

View File

@ -19,6 +19,8 @@
namespace td { namespace td {
struct GetWebPageBlockObjectContext;
class Td; class Td;
class WebPageBlock { class WebPageBlock {
@ -73,6 +75,8 @@ class WebPageBlock {
template <class ParserT> template <class ParserT>
friend void parse_web_page_block(unique_ptr<WebPageBlock> &block, ParserT &parser); friend void parse_web_page_block(unique_ptr<WebPageBlock> &block, ParserT &parser);
using Context = GetWebPageBlockObjectContext;
public: public:
WebPageBlock() = default; WebPageBlock() = default;
WebPageBlock(const WebPageBlock &) = delete; WebPageBlock(const WebPageBlock &) = delete;
@ -81,9 +85,9 @@ class WebPageBlock {
WebPageBlock &operator=(WebPageBlock &&) = delete; WebPageBlock &operator=(WebPageBlock &&) = delete;
virtual ~WebPageBlock() = default; virtual ~WebPageBlock() = default;
virtual void append_file_ids(vector<FileId> &file_ids) const = 0; virtual void append_file_ids(const Td *td, vector<FileId> &file_ids) const = 0;
virtual td_api::object_ptr<td_api::PageBlock> get_page_block_object() const = 0; virtual td_api::object_ptr<td_api::PageBlock> get_page_block_object(Context *context) const = 0;
}; };
void store(const unique_ptr<WebPageBlock> &block, LogEventStorerCalcLength &storer); void store(const unique_ptr<WebPageBlock> &block, LogEventStorerCalcLength &storer);
@ -99,6 +103,6 @@ vector<unique_ptr<WebPageBlock>> get_web_page_blocks(
const std::unordered_map<int64, FileId> &videos, const std::unordered_map<int64, FileId> &voice_notes); const std::unordered_map<int64, FileId> &videos, const std::unordered_map<int64, FileId> &voice_notes);
vector<td_api::object_ptr<td_api::PageBlock>> get_page_block_objects( vector<td_api::object_ptr<td_api::PageBlock>> get_page_block_objects(
const vector<unique_ptr<WebPageBlock>> &page_blocks); const vector<unique_ptr<WebPageBlock>> &page_blocks, Td *td);
} // namespace td } // namespace td

View File

@ -1226,7 +1226,7 @@ tl_object_ptr<td_api::webPageInstantView> WebPagesManager::get_web_page_instant_
LOG(ERROR) << "Trying to get not loaded web page instant view"; LOG(ERROR) << "Trying to get not loaded web page instant view";
return nullptr; return nullptr;
} }
return make_tl_object<td_api::webPageInstantView>(get_page_block_objects(web_page_instant_view->page_blocks), return make_tl_object<td_api::webPageInstantView>(get_page_block_objects(web_page_instant_view->page_blocks, td_),
web_page_instant_view->is_v2 ? 2 : 1, web_page_instant_view->url, web_page_instant_view->is_v2 ? 2 : 1, web_page_instant_view->url,
web_page_instant_view->is_rtl, web_page_instant_view->is_full); web_page_instant_view->is_rtl, web_page_instant_view->is_full);
} }
@ -1621,7 +1621,7 @@ vector<FileId> WebPagesManager::get_web_page_file_ids(const WebPage *web_page) c
} }
if (!web_page->instant_view.is_empty) { if (!web_page->instant_view.is_empty) {
for (auto &page_block : web_page->instant_view.page_blocks) { for (auto &page_block : web_page->instant_view.page_blocks) {
page_block->append_file_ids(result); page_block->append_file_ids(td_, result);
} }
} }
return result; return result;