From 091bba0fc57d565538e474fcd10da043431d07fc Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 2 Jan 2015 17:55:24 +0300 Subject: [PATCH] stickers emoji tab done, local cache for stickers, recent stickers and voice messages --- Telegram/Resources/lang.strings | 17 +- Telegram/Resources/style.txt | 28 +- Telegram/Setup.iss | 4 +- Telegram/SourceFiles/_other/genemoji.cpp | 67 +- Telegram/SourceFiles/app.cpp | 60 +- Telegram/SourceFiles/app.h | 10 +- Telegram/SourceFiles/art/sprite.png | Bin 58068 -> 60244 bytes Telegram/SourceFiles/art/sprite_200x.png | Bin 100731 -> 105179 bytes Telegram/SourceFiles/boxes/emojibox.cpp | 69 +- Telegram/SourceFiles/config.h | 2 + Telegram/SourceFiles/dropdown.cpp | 653 +- Telegram/SourceFiles/dropdown.h | 108 +- Telegram/SourceFiles/fileuploader.cpp | 4 +- Telegram/SourceFiles/gui/emoji_config.cpp | 67 +- Telegram/SourceFiles/gui/flattextarea.cpp | 69 + Telegram/SourceFiles/gui/flattextarea.h | 3 + Telegram/SourceFiles/gui/images.cpp | 2 +- Telegram/SourceFiles/gui/text.cpp | 2 +- Telegram/SourceFiles/history.cpp | 67 +- Telegram/SourceFiles/history.h | 12 +- Telegram/SourceFiles/historywidget.cpp | 247 +- Telegram/SourceFiles/historywidget.h | 12 + Telegram/SourceFiles/localimageloader.cpp | 10 +- Telegram/SourceFiles/localstorage.cpp | 408 +- Telegram/SourceFiles/localstorage.h | 17 +- Telegram/SourceFiles/mainwidget.cpp | 43 + Telegram/SourceFiles/mainwidget.h | 2 + Telegram/SourceFiles/mediaview.cpp | 56 +- Telegram/SourceFiles/mtproto/mtpCoreTypes.h | 7 +- .../SourceFiles/mtproto/mtpFileLoader.cpp | 70 +- Telegram/SourceFiles/mtproto/mtpScheme.cpp | 6134 +++++++++-------- Telegram/SourceFiles/mtproto/mtpScheme.h | 227 +- Telegram/SourceFiles/mtproto/scheme.tl | 7 + Telegram/SourceFiles/overviewwidget.cpp | 19 + Telegram/SourceFiles/settings.cpp | 6 +- Telegram/SourceFiles/settings.h | 8 + Telegram/SourceFiles/settingswidget.cpp | 99 +- Telegram/SourceFiles/settingswidget.h | 11 +- Telegram/SourceFiles/types.h | 13 +- Telegram/SourceFiles/window.cpp | 6 +- Telegram/SourceFiles/window.h | 2 +- 41 files changed, 5178 insertions(+), 3470 deletions(-) diff --git a/Telegram/Resources/lang.strings b/Telegram/Resources/lang.strings index d58e459a4..971a3d7f2 100644 --- a/Telegram/Resources/lang.strings +++ b/Telegram/Resources/lang.strings @@ -163,7 +163,7 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org "lng_notification_preview" = "You have a new message"; "lng_settings_section_general" = "General"; -"lng_settings_change_lang" = "Change Language"; +"lng_settings_change_lang" = "Change language"; "lng_languages" = "Languages"; "lng_sure_save_language" = "Telegram will restart\nin order to change language"; "lng_settings_auto_update" = "Update automatically"; @@ -196,7 +196,7 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org "lng_download_path_label" = "Download path:"; "lng_download_path_temp" = "temp folder"; "lng_download_path_default" = "default folder"; -"lng_download_path_clear" = "Clear All"; +"lng_download_path_clear" = "Clear all"; "lng_download_path_header" = "Choose download path"; "lng_download_path_default_radio" = "Telegram folder in system «Downloads»"; "lng_download_path_temp_radio" = "Temp folder, cleared on logout or uninstall"; @@ -211,12 +211,13 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org "lng_download_path_clear_failed" = "Clear failed :("; "lng_settings_section_cache" = "Local storage"; -"lng_settings_no_images_cached" = "No cached images found!"; -"lng_settings_images_cached" = "Cached: {count:_not_used_|# image|# images}, {size}"; -"lng_local_images_clear" = "Clear All"; -"lng_local_images_clearing" = "Clearing.."; -"lng_local_images_cleared" = "Cleared!"; -"lng_local_images_clear_failed" = "Clear failed :("; +"lng_settings_no_data_cached" = "No cached data found!"; +"lng_settings_images_cached" = "{count:_not_used_|# image|# images}, {size}"; +"lng_settings_audios_cached" = "{count:_not_used_|# voice message|# voice messages}, {size}"; +"lng_local_storage_clear" = "Clear all"; +"lng_local_storage_clearing" = "Clearing.."; +"lng_local_storage_cleared" = "Cleared!"; +"lng_local_storage_clear_failed" = "Clear failed :("; "lng_settings_section_advanced" = "Advanced"; "lng_connection_type" = "Connection type:"; diff --git a/Telegram/Resources/style.txt b/Telegram/Resources/style.txt index f3668162d..4fa343db8 100644 --- a/Telegram/Resources/style.txt +++ b/Telegram/Resources/style.txt @@ -973,7 +973,6 @@ taMsgField: flatTextarea(taDefFlat) { font: msgFont; } maxFieldHeight: 250px; -minFieldHeight: 28px; newMsgSound: ':/gui/art/newmsg.wav'; @@ -1386,6 +1385,9 @@ dpiFont3: linkFont; dpiFont4: linkFont; emojiScroll: flatScroll(scrollDef) { + width: 5px; + deltax: 2px; + deltay: 1px; topsh: 0px; bottomsh: 0px; } @@ -1407,12 +1409,15 @@ emojiPlaces: sprite(90px, 197px, 20px, 20px); emojiSymbolsActive: sprite(290px, 266px, 20px, 20px); emojiSymbolsOver: sprite(311px, 266px, 20px, 20px); emojiSymbols: sprite(111px, 197px, 20px, 20px); +emojiStickersActive: sprite(311px, 308px, 20px, 20px); +emojiStickersOver: sprite(354px, 200px, 20px, 20px); +emojiStickers: sprite(375px, 200px, 20px, 20px); rbEmoji: flatCheckbox { textColor: transparent; bgColor: transparent; disColor: transparent; - width: 36px; + width: 29px; height: 36px; textTop: 0px; @@ -1423,7 +1428,7 @@ rbEmoji: flatCheckbox { cursor: cursor(pointer); disabledCursor: cursor(default); - imagePos: point(8px, 8px); + imagePos: point(5px, 8px); } rbEmojiRecent: flatCheckbox(rbEmoji) { imageRect: emojiRecent; @@ -1473,15 +1478,26 @@ rbEmojiSymbols: flatCheckbox(rbEmoji) { disImageRect: emojiSymbols; chkDisImageRect: emojiSymbolsActive; } -emojiPanPadding: margins(10px, 5px, 0px, 5px); +rbEmojiStickers: flatCheckbox(rbEmojiRecent) { + imageRect: emojiStickers; + chkImageRect: emojiStickersActive; + overImageRect: emojiStickersOver; + chkOverImageRect: emojiStickersActive; + disImageRect: emojiStickers; + chkDisImageRect: emojiStickersActive; +} +emojiPanPadding: margins(5px, 0px, 0px, 5px); emojiPanSize: size(28px, 28px); -emojiPanFont: font(fsize); -emojiPanText: #999; emojiPanSub: 0px; emojiPanDuration: 200; emojiPanHover: #f0f0f0; emojiPanRound: 2px; +stickerPanRound: 3px; +stickerPanPadding: 2px; +stickerPanDelete: sprite(158px, 197px, 12px, 12px); +stickerPanDeleteOpacity: 0.5; + medviewNavBarWidth: 132px; medviewLightNav: 0.5; medviewDarkNav: 1; diff --git a/Telegram/Setup.iss b/Telegram/Setup.iss index bf79faa2d..846d1d9f7 100644 --- a/Telegram/Setup.iss +++ b/Telegram/Setup.iss @@ -73,9 +73,11 @@ Type: filesandordirs; Name: "{userappdata}\{#MyAppName}\tdumps" Type: dirifempty; Name: "{userappdata}\{#MyAppName}" [Languages] -Name: "en"; MessagesFile: "compiler:Default.isl" Name: "it"; MessagesFile: "compiler:Languages\Italian.isl" Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl" +Name: "de"; MessagesFile: "compiler:Languages\German.isl" +Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl" +Name: "pt"; MessagesFile: "compiler:Languages\Portuguese.isl" [Code] procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); diff --git a/Telegram/SourceFiles/_other/genemoji.cpp b/Telegram/SourceFiles/_other/genemoji.cpp index 91c0b6d03..6ffa3523f 100644 --- a/Telegram/SourceFiles/_other/genemoji.cpp +++ b/Telegram/SourceFiles/_other/genemoji.cpp @@ -52,38 +52,41 @@ struct EmojiReplace { }; EmojiReplace replaces[] = { - {0xD83DDE0AU, ":-)"}, - {0xD83DDE03U, ":-D"}, - {0xD83DDE09U, ";-)"}, - {0xD83DDE06U, "xD"}, - {0xD83DDE1CU, ";-P"}, - {0xD83DDE0BU, ":-p"}, - {0xD83DDE0DU, "8-)"}, - {0xD83DDE0EU, "B-)"}, - {0xD83DDE12U, ":-("}, - {0xD83DDE0FU, ":]"}, - {0xD83DDE14U, "3("}, - {0xD83DDE22U, ":'("}, - {0xD83DDE2DU, ":_("}, - {0xD83DDE29U, ":(("}, - {0xD83DDE28U, ":o"}, - {0xD83DDE10U, ":|"}, - {0xD83DDE0CU, "3-)"}, - {0xD83DDE20U, ">("}, - {0xD83DDE21U, ">(("}, - {0xD83DDE07U, "O:)"}, - {0xD83DDE30U, ";o"}, - {0xD83DDE33U, "8|"}, - {0xD83DDE32U, "8o"}, - {0xD83DDE37U, ":X"}, - {0xD83DDE1AU, ":-*"}, - {0xD83DDE08U, "}:)"}, - {0x2764U, "<3"}, - {0xD83DDC4DU, ":like:"}, - {0xD83DDC4EU, ":dislike:"}, - {0x261DU, ":up:"}, - {0x270CU, ":v:"}, - {0xD83DDC4CU, ":ok:"} + { 0xD83DDE0AU, ":-)" }, + { 0xD83DDE0DU, "8-)" }, + { 0x2764U, "<3" }, + { 0xD83DDC8BU, ":kiss:" }, + { 0xD83DDE01U, ":grin:" }, + { 0xD83DDE02U, ":joy:" }, + { 0xD83DDE1AU, ":-*" }, + { 0xD83DDE06U, "xD" }, + { 0xD83DDC4DU, ":like:" }, + { 0xD83DDC4EU, ":dislike:" }, + { 0x261DU, ":up:" }, + { 0x270CU, ":v:" }, + { 0xD83DDC4CU, ":ok:" }, + { 0xD83DDE0EU, "B-)" }, + { 0xD83DDE03U, ":-D" }, + { 0xD83DDE09U, ";-)" }, + { 0xD83DDE1CU, ";-P" }, + { 0xD83DDE0BU, ":-p" }, + { 0xD83DDE14U, "3(" }, + { 0xD83DDE1EU, ":-(" }, + { 0xD83DDE0FU, ":]" }, + { 0xD83DDE22U, ":'(" }, + { 0xD83DDE2DU, ":_(" }, + { 0xD83DDE29U, ":((" }, + { 0xD83DDE28U, ":o" }, + { 0xD83DDE10U, ":|" }, + { 0xD83DDE0CU, "3-)" }, + { 0xD83DDE20U, ">(" }, + { 0xD83DDE21U, ">((" }, + { 0xD83DDE07U, "O:)" }, + { 0xD83DDE30U, ";o" }, + { 0xD83DDE33U, "8|" }, + { 0xD83DDE32U, "8o" }, + { 0xD83DDE37U, ":X" }, + { 0xD83DDE08U, "}:)" }, }; const uint32 replacesCount = sizeof(replaces) / sizeof(EmojiReplace); typedef QMap ReplaceMap; diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index 5cdb26ce5..f0cd87441 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -819,21 +819,21 @@ namespace App { return App::audio(audio.vid.v, convert, audio.vaccess_hash.v, audio.vuser_id.v, audio.vdate.v, audio.vduration.v, audio.vdc_id.v, audio.vsize.v); } - DocumentData *feedDocument(int32 user, const MTPdocument &document, const QPixmap &thumb) { + DocumentData *feedDocument(const MTPdocument &document, const QPixmap &thumb) { switch (document.type()) { case mtpc_document: { const MTPDdocument &d(document.c_document()); - return App::document(d.vid.v, 0, user, d.vaccess_hash.v, d.vdate.v, d.vattributes.c_vector().v, qs(d.vmime_type), ImagePtr(thumb, "JPG"), d.vdc_id.v, d.vsize.v); + return App::document(d.vid.v, 0, d.vaccess_hash.v, d.vdate.v, d.vattributes.c_vector().v, qs(d.vmime_type), ImagePtr(thumb, "JPG"), d.vdc_id.v, d.vsize.v); } break; case mtpc_documentEmpty: return App::document(document.c_documentEmpty().vid.v); } return App::document(0); } - DocumentData *feedDocument(int32 user, const MTPdocument &document, DocumentData *convert) { + DocumentData *feedDocument(const MTPdocument &document, DocumentData *convert) { switch (document.type()) { case mtpc_document: { - return feedDocument(user, document.c_document(), convert); + return feedDocument(document.c_document(), convert); } break; case mtpc_documentEmpty: { return App::document(document.c_documentEmpty().vid.v, convert); @@ -842,8 +842,8 @@ namespace App { return App::document(0); } - DocumentData *feedDocument(int32 user, const MTPDdocument &document, DocumentData *convert) { - return App::document(document.vid.v, convert, user, document.vaccess_hash.v, document.vdate.v, document.vattributes.c_vector().v, qs(document.vmime_type), App::image(document.vthumb), document.vdc_id.v, document.vsize.v); + DocumentData *feedDocument(const MTPDdocument &document, DocumentData *convert) { + return App::document(document.vid.v, convert, document.vaccess_hash.v, document.vdate.v, document.vattributes.c_vector().v, qs(document.vmime_type), App::image(document.vthumb), document.vdc_id.v, document.vsize.v); } UserData *userLoaded(const PeerId &user) { @@ -1058,7 +1058,7 @@ namespace App { return result; } - DocumentData *document(const DocumentId &document, DocumentData *convert, int32 user, const uint64 &access, int32 date, const QVector &attributes, const QString &mime, const ImagePtr &thumb, int32 dc, int32 size) { + DocumentData *document(const DocumentId &document, DocumentData *convert, const uint64 &access, int32 date, const QVector &attributes, const QString &mime, const ImagePtr &thumb, int32 dc, int32 size) { if (convert) { if (convert->id != document) { DocumentsData::iterator i = documentsData.find(convert->id); @@ -1070,13 +1070,14 @@ namespace App { } convert->access = access; if (!convert->date && date) { - convert->user = user; convert->date = date; convert->setattributes(attributes); convert->mime = mime; convert->thumb = thumb; convert->dc = dc; convert->size = size; + } else if (convert->thumb->isNull() && !thumb->isNull()) { + convert->thumb = thumb; } if (convert->location.check()) { @@ -1089,20 +1090,23 @@ namespace App { if (convert) { result = convert; } else { - result = new DocumentData(user, document, access, date, attributes, mime, thumb, dc, size); + result = new DocumentData(document, access, date, attributes, mime, thumb, dc, size); } documentsData.insert(document, result); } else { result = i.value(); - if (result != convert && !result->date && date) { - result->user = user; - result->access = access; - result->date = date; - result->setattributes(attributes); - result->mime = mime; - result->thumb = thumb; - result->dc = dc; - result->size = size; + if (result != convert) { + if (!result->date && date) { + result->access = access; + result->date = date; + result->setattributes(attributes); + result->mime = mime; + result->thumb = thumb; + result->dc = dc; + result->size = size; + } else if (result->thumb->isNull() && !thumb->isNull()) { + result->thumb = thumb; + } } } return result; @@ -1847,12 +1851,13 @@ namespace App { qint32 v; stream >> v; switch (v) { - case dbietRecent : cSetEmojiTab(dbietRecent); break; - case dbietPeople : cSetEmojiTab(dbietPeople); break; - case dbietNature : cSetEmojiTab(dbietNature); break; - case dbietObjects: cSetEmojiTab(dbietObjects); break; - case dbietPlaces : cSetEmojiTab(dbietPlaces); break; - case dbietSymbols: cSetEmojiTab(dbietSymbols); break; + case dbietRecent : cSetEmojiTab(dbietRecent); break; + case dbietPeople : cSetEmojiTab(dbietPeople); break; + case dbietNature : cSetEmojiTab(dbietNature); break; + case dbietObjects : cSetEmojiTab(dbietObjects); break; + case dbietPlaces : cSetEmojiTab(dbietPlaces); break; + case dbietSymbols : cSetEmojiTab(dbietSymbols); break; + case dbietStickers: cSetEmojiTab(dbietStickers); break; } } break; @@ -2017,13 +2022,16 @@ namespace App { return result; } - QImage readImage(const QString &file, QByteArray *format, bool opaque, bool *animated) { + QImage readImage(const QString &file, QByteArray *format, bool opaque, bool *animated, QByteArray *content) { QFile f(file); if (!f.open(QIODevice::ReadOnly)) { if (animated) *animated = false; return QImage(); } - return readImage(f.readAll(), format, opaque, animated); + QByteArray img = f.readAll(); + QImage result = readImage(img, format, opaque, animated); + if (content && !result.isNull()) *content = img; + return result; } void regVideoItem(VideoData *data, HistoryItem *item) { diff --git a/Telegram/SourceFiles/app.h b/Telegram/SourceFiles/app.h index 8086a00a0..256e6f604 100644 --- a/Telegram/SourceFiles/app.h +++ b/Telegram/SourceFiles/app.h @@ -85,9 +85,9 @@ namespace App { PhotoData *feedPhoto(const MTPDphoto &photo, PhotoData *convert = 0); VideoData *feedVideo(const MTPDvideo &video, VideoData *convert = 0); AudioData *feedAudio(const MTPDaudio &audio, AudioData *convert = 0); - DocumentData *feedDocument(int32 user, const MTPdocument &document, const QPixmap &thumb); - DocumentData *feedDocument(int32 user, const MTPdocument &document, DocumentData *convert = 0); - DocumentData *feedDocument(int32 user, const MTPDdocument &document, DocumentData *convert = 0); + DocumentData *feedDocument(const MTPdocument &document, const QPixmap &thumb); + DocumentData *feedDocument(const MTPdocument &document, DocumentData *convert = 0); + DocumentData *feedDocument(const MTPDdocument &document, DocumentData *convert = 0); UserData *userLoaded(const PeerId &user); ChatData *chatLoaded(const PeerId &chat); @@ -106,7 +106,7 @@ namespace App { PhotoData *photo(const PhotoId &photo, PhotoData *convert = 0, const uint64 &access = 0, int32 user = 0, int32 date = 0, const ImagePtr &thumb = ImagePtr(), const ImagePtr &medium = ImagePtr(), const ImagePtr &full = ImagePtr()); VideoData *video(const VideoId &video, VideoData *convert = 0, const uint64 &access = 0, int32 user = 0, int32 date = 0, int32 duration = 0, int32 w = 0, int32 h = 0, const ImagePtr &thumb = ImagePtr(), int32 dc = 0, int32 size = 0); AudioData *audio(const AudioId &audio, AudioData *convert = 0, const uint64 &access = 0, int32 user = 0, int32 date = 0, int32 duration = 0, int32 dc = 0, int32 size = 0); - DocumentData *document(const DocumentId &document, DocumentData *convert = 0, int32 user = 0, const uint64 &access = 0, int32 date = 0, const QVector &attributes = QVector(), const QString &mime = QString(), const ImagePtr &thumb = ImagePtr(), int32 dc = 0, int32 size = 0); + DocumentData *document(const DocumentId &document, DocumentData *convert = 0, const uint64 &access = 0, int32 date = 0, const QVector &attributes = QVector(), const QString &mime = QString(), const ImagePtr &thumb = ImagePtr(), int32 dc = 0, int32 size = 0); ImageLinkData *imageLink(const QString &imageLink, ImageLinkType type = InvalidImageLink, const QString &url = QString()); void forgetMedia(); @@ -169,7 +169,7 @@ namespace App { void setQuiting(); QImage readImage(QByteArray data, QByteArray *format = 0, bool opaque = true, bool *animated = 0); - QImage readImage(const QString &file, QByteArray *format = 0, bool opaque = true, bool *animated = 0); + QImage readImage(const QString &file, QByteArray *format = 0, bool opaque = true, bool *animated = 0, QByteArray *content = 0); void regVideoItem(VideoData *data, HistoryItem *item); void unregVideoItem(VideoData *data, HistoryItem *item); diff --git a/Telegram/SourceFiles/art/sprite.png b/Telegram/SourceFiles/art/sprite.png index de873f4010b22c92b5e45659f92b2e6dec99dca7..6e6775f8ad1ce4ffdaaaf6c2e1615050ef78d5f9 100644 GIT binary patch delta 43722 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%0A*#4vx5IiY;(B=4p~P%*+o%i`G_JL_SE^OQ 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�oKEx$D7qdL-0F)Wa^R#F~jt1?vCnJ1TqTNWdi}w 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 diff --git a/Telegram/SourceFiles/boxes/emojibox.cpp b/Telegram/SourceFiles/boxes/emojibox.cpp index acec51403..04fa6ff03 100644 --- a/Telegram/SourceFiles/boxes/emojibox.cpp +++ b/Telegram/SourceFiles/boxes/emojibox.cpp @@ -29,40 +29,43 @@ namespace { const char *replace; }; EmojiReplace replaces[] = { - {0xD83DDE0A, ":-)"}, - {0xD83DDE03, ":-D"}, - {0xD83DDE09, ";-)"}, - {0xD83DDE06, "xD"}, - {0xD83DDE1C, ";-P"}, - {0xD83DDE0B, ":-p"}, - {0xD83DDE0D, "8-)"}, - {0xD83DDE0E, "B-)"}, - {0xD83DDE12, ":-("}, - {0xD83DDE0F, ":]"}, - {0xD83DDE14, "3("}, - {0xD83DDE22, ":'("}, - {0xD83DDE2D, ":_("}, - {0xD83DDE29, ":(("}, - {0xD83DDE28, ":o"}, - {0xD83DDE10, ":|"}, - {0xD83DDE0C, "3-)"}, - {0xD83DDE20, ">("}, - {0xD83DDE21, ">(("}, - {0xD83DDE07, "O:)"}, - {0xD83DDE30, ";o"}, - {0xD83DDE33, "8|"}, - {0xD83DDE32, "8o"}, - {0xD83DDE37, ":X"}, - {0xD83DDE1A, ":-*"}, - {0xD83DDE08, "}:)"}, - {0x2764, "<3"}, - {0xD83DDC4D, ":like:"}, - {0xD83DDC4E, ":dislike:"}, - {0x261D, ":up:"}, - {0x270C, ":v:"}, - {0xD83DDC4C, ":ok:"} + { 0xD83DDE0AU, ":-)" }, + { 0xD83DDE0DU, "8-)" }, + { 0x2764U, "<3" }, + { 0xD83DDC8BU, ":kiss:" }, + { 0xD83DDE01U, ":grin:" }, + { 0xD83DDE02U, ":joy:" }, + { 0xD83DDE1AU, ":-*" }, + { 0xD83DDE06U, "xD" }, + { 0xD83DDC4DU, ":like:" }, + { 0xD83DDC4EU, ":dislike:" }, + { 0x261DU, ":up:" }, + { 0x270CU, ":v:" }, + { 0xD83DDC4CU, ":ok:" }, + { 0xD83DDE0EU, "B-)" }, + { 0xD83DDE03U, ":-D" }, + { 0xD83DDE09U, ";-)" }, + { 0xD83DDE1CU, ";-P" }, + { 0xD83DDE0BU, ":-p" }, + { 0xD83DDE14U, "3(" }, + { 0xD83DDE1EU, ":-(" }, + { 0xD83DDE0FU, ":]" }, + { 0xD83DDE22U, ":'(" }, + { 0xD83DDE2DU, ":_(" }, + { 0xD83DDE29U, ":((" }, + { 0xD83DDE28U, ":o" }, + { 0xD83DDE10U, ":|" }, + { 0xD83DDE0CU, "3-)" }, + { 0xD83DDE20U, ">(" }, + { 0xD83DDE21U, ">((" }, + { 0xD83DDE07U, "O:)" }, + { 0xD83DDE30U, ";o" }, + { 0xD83DDE33U, "8|" }, + { 0xD83DDE32U, "8o" }, + { 0xD83DDE37U, ":X" }, + { 0xD83DDE08U, "}:)" }, }; - const uint32 replacesCount = sizeof(replaces) / sizeof(EmojiReplace), replacesInRow = 8; + const uint32 replacesCount = sizeof(replaces) / sizeof(EmojiReplace), replacesInRow = 7; } EmojiBox::EmojiBox() : _done(this, lang(lng_about_done), st::aboutCloseButton), diff --git a/Telegram/SourceFiles/config.h b/Telegram/SourceFiles/config.h index 5fb7537d3..00df28ee4 100644 --- a/Telegram/SourceFiles/config.h +++ b/Telegram/SourceFiles/config.h @@ -95,6 +95,8 @@ enum { PreloadHeightsCount = 3, // when 3 screens to scroll left make a preload request EmojiPadPerRow = 7, EmojiPadRowsPerPage = 6, + StickerPadPerRow = 3, + StickersUpdateTimeout = 3600000, // update not more than once in an hour SearchPeopleLimit = 5, MinUsernameLength = 5, diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp index 8f378e286..a1697b610 100644 --- a/Telegram/SourceFiles/dropdown.cpp +++ b/Telegram/SourceFiles/dropdown.cpp @@ -20,6 +20,7 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org #include "dropdown.h" #include "historywidget.h" +#include "localstorage.h" #include "lang.h" Dropdown::Dropdown(QWidget *parent) : TWidget(parent), @@ -315,39 +316,96 @@ bool DragArea::animStep(float64 ms) { return res; } -EmojiPanInner::EmojiPanInner(QWidget *parent) : QWidget(parent), _tab(cEmojiTab()), _selected(-1), _pressedSel(-1) { +EmojiPanInner::EmojiPanInner(QWidget *parent) : QWidget(parent), _tab(cEmojiTab()), _selected(-1), _xSelected(-1), _pressedSel(-1), _xPressedSel(-1) { resize(EmojiPadPerRow * st::emojiPanSize.width(), EmojiPadRowsPerPage * st::emojiPanSize.height() - st::emojiPanSub); setMouseTracking(true); setFocusPolicy(Qt::NoFocus); + _saveConfigTimer.setSingleShot(true); connect(&_saveConfigTimer, SIGNAL(timeout()), this, SLOT(onSaveConfig())); } void EmojiPanInner::paintEvent(QPaintEvent *e) { QPainter p(this); - int32 size = _emojis.size(); QRect r = e ? e->rect() : rect(); - int32 rows = (size / EmojiPadPerRow) + ((size % EmojiPadPerRow) ? 1 : 0); - int32 fromrow = qMax(qFloor(r.top() / st::emojiPanSize.height()), 0), torow = qMin(qCeil(r.bottom() / st::emojiPanSize.height()) + 1, rows); - for (int32 i = fromrow; i < torow; ++i) { - for (int32 j = 0; j < EmojiPadPerRow; ++j) { - int32 index = i * EmojiPadPerRow + j; - if (index >= size) break; + if (_tab == dbietStickers) { + int32 size = _stickers.size(); + float64 stickerWidth = width() / float64(StickerPadPerRow); + int32 rows = (size / StickerPadPerRow) + ((size % StickerPadPerRow) ? 1 : 0), stickerSize = int32(stickerWidth); + int32 fromrow = qMax(qFloor(r.top() / stickerSize), 0), torow = qMin(qCeil(r.bottom() / stickerSize) + 1, rows); + for (int32 i = fromrow; i < torow; ++i) { + for (int32 j = 0; j < StickerPadPerRow; ++j) { + int32 index = i * StickerPadPerRow + j; + if (index >= size) break; - float64 hover = _hovers[index]; + float64 hover = _hovers[index]; - QPoint w(j * st::emojiPanSize.width(), i * st::emojiPanSize.height()); - if (hover > 0) { - p.setOpacity(hover); - p.setBrush(st::emojiPanHover->b); - p.setPen(Qt::NoPen); - p.drawRoundedRect(QRect(w, st::emojiPanSize), st::emojiPanRound, st::emojiPanRound); - p.setOpacity(1); + QPoint pos(qRound(j * stickerWidth), i * stickerSize); + if (hover > 0) { + p.setOpacity(hover); + p.setBrush(st::emojiPanHover->b); + p.setPen(Qt::NoPen); + p.drawRoundedRect(QRect(pos, QSize(stickerSize, stickerSize)), st::stickerPanRound, st::stickerPanRound); + p.setOpacity(1); + } + + DocumentData *sticker = _stickers[index]; + bool already = !sticker->already().isEmpty(), hasdata = !sticker->data.isEmpty(); + if (!sticker->loader && sticker->status != FileFailed && !already && !hasdata) { + sticker->save(QString()); + } + if (sticker->sticker->isNull() && (already || hasdata)) { + if (already) { + sticker->sticker = ImagePtr(sticker->already()); + } else { + sticker->sticker = ImagePtr(sticker->data); + } + } + + float64 coef = qMin((stickerWidth - st::stickerPanPadding * 2) / float64(sticker->dimensions.width()), (stickerSize - st::stickerPanPadding * 2) / float64(sticker->dimensions.height())); + int32 w = qRound(coef * sticker->dimensions.width()), h = qRound(coef * sticker->dimensions.height()); + QPoint ppos = pos + QPoint((stickerSize - w) / 2, (stickerSize - h) / 2); + + if (sticker->sticker->isNull()) { + p.drawPixmap(ppos, sticker->thumb->pix(w)); + } else { + p.drawPixmap(ppos, sticker->sticker->pix(w)); + } + + if (hover > 0 && _isUserGen[index]) { + float64 xHover = _hovers[_stickers.size() + index]; + + QPoint xPos = pos + QPoint(stickerWidth - st::stickerPanDelete.pxWidth(), 0); + p.setOpacity(hover * (xHover + (1 - xHover) * st::stickerPanDeleteOpacity)); + p.drawPixmap(xPos, App::sprite(), st::stickerPanDelete); + p.setOpacity(1); + } + } + } + } else { + int32 size = _emojis.size(); + int32 rows = (size / EmojiPadPerRow) + ((size % EmojiPadPerRow) ? 1 : 0); + int32 fromrow = qMax(qFloor(r.top() / st::emojiPanSize.height()), 0), torow = qMin(qCeil(r.bottom() / st::emojiPanSize.height()) + 1, rows); + for (int32 i = fromrow; i < torow; ++i) { + for (int32 j = 0; j < EmojiPadPerRow; ++j) { + int32 index = i * EmojiPadPerRow + j; + if (index >= size) break; + + float64 hover = _hovers[index]; + + QPoint w(j * st::emojiPanSize.width(), i * st::emojiPanSize.height()); + if (hover > 0) { + p.setOpacity(hover); + p.setBrush(st::emojiPanHover->b); + p.setPen(Qt::NoPen); + p.drawRoundedRect(QRect(w, st::emojiPanSize), st::emojiPanRound, st::emojiPanRound); + p.setOpacity(1); + } + QRect r(_emojis[index]->x, _emojis[index]->y, st::emojiImgSize, st::emojiImgSize); + p.drawPixmap(w + QPoint((st::emojiPanSize.width() - st::emojiSize) / 2, (st::emojiPanSize.height() - st::emojiSize) / 2), App::emojis(), r); } - QRect r(_emojis[index]->x, _emojis[index]->y, st::emojiImgSize, st::emojiImgSize); - p.drawPixmap(w + QPoint((st::emojiPanSize.width() - st::emojiSize) / 2, (st::emojiPanSize.height() - st::emojiSize) / 2), App::emojis(), r); } } } @@ -356,50 +414,70 @@ void EmojiPanInner::mousePressEvent(QMouseEvent *e) { _lastMousePos = e->globalPos(); updateSelected(); _pressedSel = _selected; + _xPressedSel = _xSelected; } void EmojiPanInner::mouseReleaseEvent(QMouseEvent *e) { _lastMousePos = e->globalPos(); updateSelected(); - if (_selected == _pressedSel && _selected >= 0 && _selected < _emojis.size()) { - EmojiPtr emoji(_emojis[_selected]); - RecentEmojiPack recent(cGetRecentEmojis()); - RecentEmojiPack::iterator i = recent.begin(), e = recent.end(); - for (; i != e; ++i) { - if (i->first == emoji) { - ++i->second; - if (i->second > 0x8000) { - for (RecentEmojiPack::iterator j = recent.begin(); j != e; ++j) { - if (j->second > 1) { - j->second /= 2; - } else { - j->second = 1; + if (_xSelected == _xPressedSel && _xSelected >= 0 && _tab == dbietStickers) { + RecentStickerPack recent(cRecentStickers()); + DocumentData *sticker = _stickers.at(_xSelected - _stickers.size()); + for (int32 i = 0, l = recent.size(); i < l; ++i) { + if (recent.at(i).first == sticker) { + recent.removeAt(i); + cSetRecentStickers(recent); + Local::writeRecentStickers(); + showEmojiPack(dbietStickers); + updateSelected(); + break; + } + } + } else if (_selected == _pressedSel && _selected >= 0) { + if (_tab == dbietStickers) { + if (_selected < _stickers.size()) { + emit stickerSelected(_stickers[_selected]); + } + } else if (_selected < _emojis.size()) { + EmojiPtr emoji(_emojis[_selected]); + RecentEmojiPack recent(cGetRecentEmojis()); + RecentEmojiPack::iterator i = recent.begin(), e = recent.end(); + for (; i != e; ++i) { + if (i->first == emoji) { + ++i->second; + if (i->second > 0x8000) { + for (RecentEmojiPack::iterator j = recent.begin(); j != e; ++j) { + if (j->second > 1) { + j->second /= 2; + } else { + j->second = 1; + } } } + for (; i != recent.begin(); --i) { + if ((i - 1)->second > i->second) { + break; + } + qSwap(*i, *(i - 1)); + } + break; } - for (; i != recent.begin(); --i) { + } + if (i == e) { + while (recent.size() >= EmojiPadPerRow * EmojiPadRowsPerPage) recent.pop_back(); + recent.push_back(qMakePair(emoji, 1)); + for (i = recent.end() - 1; i != recent.begin(); --i) { if ((i - 1)->second > i->second) { break; } qSwap(*i, *(i - 1)); } - break; } - } - if (i == e) { - while (recent.size() >= EmojiPadPerRow * EmojiPadRowsPerPage) recent.pop_back(); - recent.push_back(qMakePair(emoji, 1)); - for (i = recent.end() - 1; i != recent.begin(); --i) { - if ((i - 1)->second > i->second) { - break; - } - qSwap(*i, *(i - 1)); - } - } - cSetRecentEmojis(recent); - _saveConfigTimer.start(SaveRecentEmojisTimeout); + cSetRecentEmojis(recent); + _saveConfigTimer.start(SaveRecentEmojisTimeout); - emit emojiSelected(emoji); + emit emojiSelected(emoji); + } } } @@ -413,21 +491,50 @@ void EmojiPanInner::mouseMoveEvent(QMouseEvent *e) { } void EmojiPanInner::leaveEvent(QEvent *e) { - _lastMousePos = QCursor::pos(); - updateSelected(); + clearSelection(); +} + +void EmojiPanInner::clearSelection(bool fast) { + _lastMousePos = mapToGlobal(QPoint(-10, -10)); + if (fast) { + if (_tab == dbietStickers) { + _hovers = QVector(_stickers.size() * 2, 0); + } else { + _hovers = QVector(_emojis.size(), 0); + } + _emojiAnimations.clear(); + _selected = _pressedSel = _xSelected = _xPressedSel = -1; + anim::stop(this); + } else { + updateSelected(); + } } void EmojiPanInner::updateSelected() { - int32 selIndex = -1; + int32 selIndex = -1, xSelIndex = -1; QPoint p(mapFromGlobal(_lastMousePos)); - if (p.x() >= 0 && p.y() >= 0 && p.x() < EmojiPadPerRow * st::emojiPanSize.width()) { + if (_tab == dbietStickers) { + float64 stickerWidth = width() / float64(StickerPadPerRow); + int32 stickerSize = int32(stickerWidth); + if (p.x() >= 0 && p.y() >= 0 && p.x() < StickerPadPerRow * stickerWidth) { + selIndex = qFloor(p.y() / stickerSize) * StickerPadPerRow + qFloor(p.x() / stickerWidth); + if (selIndex >= _stickers.size()) { + selIndex = -1; + } else { + int32 inx = p.x() - (selIndex % StickerPadPerRow) * stickerWidth, iny = p.y() - ((selIndex / StickerPadPerRow) * stickerSize); + if (inx >= stickerWidth - st::stickerPanDelete.pxWidth() && iny < st::stickerPanDelete.pxHeight()) { + xSelIndex = _stickers.size() + selIndex; + } + } + } + } else if (p.x() >= 0 && p.y() >= 0 && p.x() < EmojiPadPerRow * st::emojiPanSize.width()) { selIndex = qFloor(p.y() / st::emojiPanSize.height()) * EmojiPadPerRow + qFloor(p.x() / st::emojiPanSize.width()); if (selIndex >= _emojis.size()) { selIndex = -1; } } + bool startanim = false; if (selIndex != _selected) { - bool startanim = false; if (_selected >= 0) { _emojiAnimations.remove(_selected + 1); if (_emojiAnimations.find(-_selected - 1) == _emojiAnimations.end()) { @@ -443,9 +550,26 @@ void EmojiPanInner::updateSelected() { _emojiAnimations.insert(_selected + 1, getms()); } } - if (startanim) anim::start(this); setCursor((_selected >= 0) ? style::cur_pointer : style::cur_default); } + if (xSelIndex != _xSelected) { + if (_xSelected >= 0) { + _emojiAnimations.remove(_xSelected + 1); + if (_emojiAnimations.find(-_xSelected - 1) == _emojiAnimations.end()) { + if (_emojiAnimations.isEmpty()) startanim = true; + _emojiAnimations.insert(-_xSelected - 1, getms()); + } + } + _xSelected = xSelIndex; + if (_xSelected >= 0) { + _emojiAnimations.remove(-_xSelected - 1); + if (_emojiAnimations.find(_xSelected + 1) == _emojiAnimations.end()) { + if (_emojiAnimations.isEmpty()) startanim = true; + _emojiAnimations.insert(_xSelected + 1, getms()); + } + } + } + if (startanim) anim::start(this); } bool EmojiPanInner::animStep(float64 ms) { @@ -466,12 +590,42 @@ bool EmojiPanInner::animStep(float64 ms) { void EmojiPanInner::showEmojiPack(DBIEmojiTab packIndex) { _tab = packIndex; - _emojis = emojiPack(packIndex); - _hovers = QVector(_emojis.size(), 0); + int32 h, size; + if (packIndex == dbietStickers) { + _emojis.clear(); + + float64 stickerWidth = width() / float64(StickerPadPerRow); + int32 stickerSize = int32(stickerWidth); + + int32 l = cRecentStickers().size(); + _stickers.resize(l); + _isUserGen.resize(l); + for (int32 i = 0; i < l; ++i) { + DocumentData *sticker = _stickers[i] = cRecentStickers().at(i).first; + _isUserGen[i] = (cRecentStickers().at(i).second < 0); + if (i < StickerPadPerRow * ((EmojiPadRowsPerPage * st::emojiPanSize.height() - int(st::emojiPanSub)) / stickerSize + 1)) { + bool already = !sticker->already().isEmpty(), hasdata = !sticker->data.isEmpty(); + if (!sticker->loader && sticker->status != FileFailed && !already && !hasdata) { + sticker->save(QString()); + } + } + } + + size = _stickers.size(); + h = ((size / StickerPadPerRow) + ((size % StickerPadPerRow) ? 1 : 0)) * stickerSize; + _hovers = QVector(size * 2, 0); + } else { + _emojis = emojiPack(packIndex); + _stickers.clear(); + _isUserGen.clear(); + + size = _emojis.size(); + h = ((size / EmojiPadPerRow) + ((size % EmojiPadPerRow) ? 1 : 0)) * st::emojiPanSize.height(); + _hovers = QVector(size, 0); + } + h = qMax(h, EmojiPadRowsPerPage * st::emojiPanSize.height() - int(st::emojiPanSub)); _emojiAnimations.clear(); _selected = _pressedSel = -1; - int32 size = _emojis.size(); - int32 h = qMax(((size / EmojiPadPerRow) + ((size % EmojiPadPerRow) ? 1 : 0)) * st::emojiPanSize.height(), EmojiPadRowsPerPage * st::emojiPanSize.height() - int(st::emojiPanSub)); resize(width(), h); _lastMousePos = QCursor::pos(); updateSelected(); @@ -480,18 +634,21 @@ void EmojiPanInner::showEmojiPack(DBIEmojiTab packIndex) { EmojiPan::EmojiPan(QWidget *parent) : TWidget(parent), _hiding(false), a_opacity(0), _shadow(st::dropdownShadow), -_recent (this, qsl("emoji_group"), dbietRecent , QString(), cEmojiTab() == dbietRecent , st::rbEmojiRecent), -_people (this, qsl("emoji_group"), dbietPeople , QString(), cEmojiTab() == dbietPeople , st::rbEmojiPeople), -_nature (this, qsl("emoji_group"), dbietNature , QString(), cEmojiTab() == dbietNature , st::rbEmojiNature), -_objects(this, qsl("emoji_group"), dbietObjects, QString(), cEmojiTab() == dbietObjects, st::rbEmojiObjects), -_places (this, qsl("emoji_group"), dbietPlaces , QString(), cEmojiTab() == dbietPlaces , st::rbEmojiPlaces), -_symbols(this, qsl("emoji_group"), dbietSymbols, QString(), cEmojiTab() == dbietSymbols, st::rbEmojiSymbols), +_recent (this, qsl("emoji_group"), dbietRecent , QString(), cEmojiTab() == dbietRecent , st::rbEmojiRecent), +_people (this, qsl("emoji_group"), dbietPeople , QString(), cEmojiTab() == dbietPeople , st::rbEmojiPeople), +_nature (this, qsl("emoji_group"), dbietNature , QString(), cEmojiTab() == dbietNature , st::rbEmojiNature), +_objects (this, qsl("emoji_group"), dbietObjects , QString(), cEmojiTab() == dbietObjects , st::rbEmojiObjects), +_places (this, qsl("emoji_group"), dbietPlaces , QString(), cEmojiTab() == dbietPlaces , st::rbEmojiPlaces), +_symbols (this, qsl("emoji_group"), dbietSymbols , QString(), cEmojiTab() == dbietSymbols , st::rbEmojiSymbols), +_stickers(this, qsl("emoji_group"), dbietStickers, QString(), cEmojiTab() == dbietStickers, st::rbEmojiStickers), _scroll(this, st::emojiScroll), _inner() { setFocusPolicy(Qt::NoFocus); _scroll.setFocusPolicy(Qt::NoFocus); _scroll.viewport()->setFocusPolicy(Qt::NoFocus); - _inner.showEmojiPack(cEmojiTab()); + if (cEmojiTab() != dbietStickers) { + _inner.showEmojiPack(cEmojiTab()); + } _scroll.setGeometry(st::dropdownPadding.left() + st::emojiPanPadding.left(), st::dropdownPadding.top() + _recent.height() + st::emojiPanPadding.top(), st::emojiPanPadding.left() + _inner.width() + st::emojiPanPadding.right(), EmojiPadRowsPerPage * st::emojiPanSize.height() - st::emojiPanSub); _scroll.setWidget(&_inner); @@ -500,7 +657,7 @@ _scroll(this, st::emojiScroll), _inner() { _height = st::dropdownPadding.top() + _recent.height() + st::emojiPanPadding.top() + _scroll.height() + st::emojiPanPadding.bottom() + st::dropdownPadding.bottom(); resize(_width, _height); - int32 left = st::dropdownPadding.left() + (_width - st::dropdownPadding.left() - st::dropdownPadding.right() - 6 * _recent.width()) / 2; + int32 left = st::dropdownPadding.left() + (_width - st::dropdownPadding.left() - st::dropdownPadding.right() - 7 * _recent.width()) / 2; int32 top = st::dropdownPadding.top(); _recent.move(left, top); left += _recent.width(); _people.move(left, top); left += _people.width(); @@ -508,20 +665,23 @@ _scroll(this, st::emojiScroll), _inner() { _objects.move(left, top); left += _objects.width(); _places.move(left, top); left += _places.width(); _symbols.move(left, top); left += _symbols.width(); + _stickers.move(left, top); left += _stickers.width(); _hideTimer.setSingleShot(true); connect(&_hideTimer, SIGNAL(timeout()), this, SLOT(hideStart())); - connect(&_recent , SIGNAL(changed()), this, SLOT(onTabChange())); - connect(&_people , SIGNAL(changed()), this, SLOT(onTabChange())); - connect(&_nature , SIGNAL(changed()), this, SLOT(onTabChange())); - connect(&_objects, SIGNAL(changed()), this, SLOT(onTabChange())); - connect(&_places , SIGNAL(changed()), this, SLOT(onTabChange())); - connect(&_symbols, SIGNAL(changed()), this, SLOT(onTabChange())); + connect(&_recent , SIGNAL(changed()), this, SLOT(onTabChange())); + connect(&_people , SIGNAL(changed()), this, SLOT(onTabChange())); + connect(&_nature , SIGNAL(changed()), this, SLOT(onTabChange())); + connect(&_objects , SIGNAL(changed()), this, SLOT(onTabChange())); + connect(&_places , SIGNAL(changed()), this, SLOT(onTabChange())); + connect(&_symbols , SIGNAL(changed()), this, SLOT(onTabChange())); + connect(&_stickers, SIGNAL(changed()), this, SLOT(onTabChange())); connect(&_scroll, SIGNAL(scrolled()), &_inner, SLOT(updateSelected())); connect(&_inner, SIGNAL(emojiSelected(EmojiPtr)), this, SIGNAL(emojiSelected(EmojiPtr))); + connect(&_inner, SIGNAL(stickerSelected(DocumentData*)), this, SIGNAL(stickerSelected(DocumentData*))); } void EmojiPan::paintEvent(QPaintEvent *e) { @@ -627,14 +787,23 @@ void EmojiPan::showStart() { show(); a_opacity.start(1); anim::start(this); + if (_stickers.checked()) emit updateStickers(); } bool EmojiPan::eventFilter(QObject *obj, QEvent *e) { if (e->type() == QEvent::Enter) { - otherEnter(); + //if (dynamic_cast(obj)) { + // enterEvent(e); + //} else { + otherEnter(); + //} } else if (e->type() == QEvent::Leave) { - otherLeave(); - } else if (e->type() == QEvent::MouseButtonPress && static_cast(e)->button() == Qt::LeftButton) { + //if (dynamic_cast(obj)) { + // leaveEvent(e); + //} else { + otherLeave(); + //} + } else if (e->type() == QEvent::MouseButtonPress && static_cast(e)->button() == Qt::LeftButton/* && !dynamic_cast(obj)*/) { if (isHidden() || _hiding) { otherEnter(); } else { @@ -651,6 +820,7 @@ void EmojiPan::showAll() { _objects.show(); _places.show(); _symbols.show(); + _stickers.show(); _scroll.show(); } @@ -661,7 +831,9 @@ void EmojiPan::hideAll() { _objects.hide(); _places.hide(); _symbols.hide(); + _stickers.hide(); _scroll.hide(); + _inner.clearSelection(true); } void EmojiPan::onTabChange() { @@ -671,10 +843,341 @@ void EmojiPan::onTabChange() { else if (_objects.checked()) newTab = dbietObjects; else if (_places.checked()) newTab = dbietPlaces; else if (_symbols.checked()) newTab = dbietSymbols; + else if (_stickers.checked()) newTab = dbietStickers; if (newTab != cEmojiTab()) { cSetEmojiTab(newTab); App::writeUserConfig(); _scroll.scrollToY(0); - _inner.showEmojiPack(newTab); + } + _inner.showEmojiPack(newTab); + if (newTab == dbietStickers) { + emit updateStickers(); } } + +//StickerPanInner::StickerPanInner(QWidget *parent) : QWidget(parent), _emoji(0), _selected(-1), _pressedSel(-1) { +// resize(StickerPadPerRow * st::stickerPanSize.width(), EmojiPadRowsPerPage * st::emojiPanSize.height() - st::emojiPanSub); +// setMouseTracking(true); +// setFocusPolicy(Qt::NoFocus); +//} +// +//void StickerPanInner::paintEvent(QPaintEvent *e) { +// QPainter p(this); +// int32 size = _stickers.size(); +// +// QRect r = e ? e->rect() : rect(); +// +// int32 rows = (size / StickerPadPerRow) + ((size % StickerPadPerRow) ? 1 : 0); +// int32 fromrow = qMax(qFloor(r.top() / st::stickerPanSize.height()), 0), torow = qMin(qCeil(r.bottom() / st::stickerPanSize.height()) + 1, rows); +// for (int32 i = fromrow; i < torow; ++i) { +// for (int32 j = 0; j < StickerPadPerRow; ++j) { +// int32 index = i * StickerPadPerRow + j; +// if (index >= size) break; +// +// float64 hover = _hovers[index]; +// QPoint pos(j * st::stickerPanSize.width(), i * st::stickerPanSize.height()); +// if (hover > 0) { +// p.setOpacity(hover); +// p.setBrush(st::stickerPanHover->b); +// p.setPen(Qt::NoPen); +// p.drawRoundedRect(QRect(pos, st::stickerPanSize), st::stickerPanRound, st::stickerPanRound); +// p.setOpacity(1); +// } +// +// DocumentData *data = _stickers[index]; +// bool already = !data->already().isEmpty(), hasdata = !data->data.isEmpty(); +// if (!data->loader && data->status != FileFailed && !already && !hasdata) { +// data->save(QString()); +// } +// if (data->sticker->isNull() && (already || hasdata)) { +// if (already) { +// data->sticker = ImagePtr(data->already()); +// } else { +// data->sticker = ImagePtr(data->data); +// } +// } +// +// float64 coef = qMin(st::stickerPanSize.width() / float64(data->dimensions.width()), st::stickerPanSize.height() / float64(data->dimensions.height())); +// int32 w = qRound(coef * data->dimensions.width()), h = qRound(coef * data->dimensions.height()); +// pos += QPoint((st::stickerPanSize.width() - w) / 2, (st::stickerPanSize.height() - h) / 2); +// +// if (data->sticker->isNull()) { +// p.drawPixmap(pos, data->thumb->pix(w)); +// } else { +// p.drawPixmap(pos, data->sticker->pix(w)); +// } +// } +// } +//} +// +//void StickerPanInner::mousePressEvent(QMouseEvent *e) { +// _lastMousePos = e->globalPos(); +// updateSelected(); +// _pressedSel = _selected; +//} +// +//void StickerPanInner::mouseReleaseEvent(QMouseEvent *e) { +// _lastMousePos = e->globalPos(); +// updateSelected(); +// if (_selected == _pressedSel && _selected >= 0 && _selected < _stickers.size()) { +// emit stickerSelected(_stickers[_selected]); +// } +//} +// +//void StickerPanInner::mouseMoveEvent(QMouseEvent *e) { +// _lastMousePos = e->globalPos(); +// updateSelected(); +//} +// +//void StickerPanInner::leaveEvent(QEvent *e) { +// _lastMousePos = QCursor::pos(); +// updateSelected(); +//} +// +//void StickerPanInner::updateSelected() { +// int32 selIndex = -1; +// QPoint p(mapFromGlobal(_lastMousePos)); +// if (p.x() >= 0 && p.y() >= 0 && p.x() < StickerPadPerRow * st::stickerPanSize.width()) { +// selIndex = qFloor(p.y() / st::stickerPanSize.height()) * StickerPadPerRow + qFloor(p.x() / st::stickerPanSize.width()); +// if (selIndex >= _stickers.size()) { +// selIndex = -1; +// } +// } +// if (selIndex != _selected) { +// bool startanim = false; +// if (_selected >= 0) { +// _stickerAnimations.remove(_selected + 1); +// if (_stickerAnimations.find(-_selected - 1) == _stickerAnimations.end()) { +// if (_stickerAnimations.isEmpty()) startanim = true; +// _stickerAnimations.insert(-_selected - 1, getms()); +// } +// } +// _selected = selIndex; +// if (_selected >= 0) { +// _stickerAnimations.remove(-_selected - 1); +// if (_stickerAnimations.find(_selected + 1) == _stickerAnimations.end()) { +// if (_stickerAnimations.isEmpty()) startanim = true; +// _stickerAnimations.insert(_selected + 1, getms()); +// } +// } +// if (startanim) anim::start(this); +// setCursor((_selected >= 0) ? style::cur_pointer : style::cur_default); +// } +//} +// +//bool StickerPanInner::animStep(float64 ms) { +// uint64 now = getms(); +// for (StickerAnimations::iterator i = _stickerAnimations.begin(); i != _stickerAnimations.end();) { +// float64 dt = float64(now - i.value()) / st::emojiPanDuration; +// if (dt >= 1) { +// _hovers[qAbs(i.key()) - 1] = (i.key() > 0) ? 1 : 0; +// i = _stickerAnimations.erase(i); +// } else { +// _hovers[qAbs(i.key()) - 1] = (i.key() > 0) ? dt : (1 - dt); +// ++i; +// } +// } +// update(); +// return !_stickerAnimations.isEmpty(); +//} +// +//void StickerPanInner::showStickerPack(EmojiPtr emoji) { +// StickerPack stickers = cStickers().value(emoji); +// if (stickers.isEmpty()) { +// _emoji = 0; +// } else { +// _emoji = emoji; +// _stickers = stickers; +// _hovers = QVector(_stickers.size(), 0); +// _stickerAnimations.clear(); +// _selected = _pressedSel = -1; +// int32 size = _stickers.size(); +// int32 h = qMax(((size / StickerPadPerRow) + ((size % StickerPadPerRow) ? 1 : 0)) * st::stickerPanSize.height(), EmojiPadRowsPerPage * st::emojiPanSize.height() - int(st::emojiPanSub)); +// resize(width(), h); +// _lastMousePos = QCursor::pos(); +// updateSelected(); +// update(); +// } +//} +// +//bool StickerPanInner::hasContent() const { +// return !!_emoji; +//} +// +//StickerPan::StickerPan(QWidget *parent) : TWidget(parent), +//_hiding(false), a_opacity(0), _shadow(st::dropdownShadow), +//_scroll(this, st::emojiScroll), _emoji(0), _inner() { +// setFocusPolicy(Qt::NoFocus); +// _scroll.setFocusPolicy(Qt::NoFocus); +// _scroll.viewport()->setFocusPolicy(Qt::NoFocus); +// +// _inner.showStickerPack(0); +// _scroll.setGeometry(st::dropdownPadding.left() + st::stickerPanPadding.left(), st::dropdownPadding.top() + st::rbEmoji.height + st::stickerPanPadding.top(), st::stickerPanPadding.left() + _inner.width() + st::stickerPanPadding.right(), EmojiPadRowsPerPage * st::emojiPanSize.height() - st::emojiPanSub); +// _scroll.setWidget(&_inner); +// +// _width = st::dropdownPadding.left() + st::stickerPanPadding.left() + _scroll.width() + st::stickerPanPadding.right() + st::dropdownPadding.right(); +// _height = st::dropdownPadding.top() + st::rbEmoji.height + st::stickerPanPadding.top() + _scroll.height() + st::stickerPanPadding.bottom() + st::dropdownPadding.bottom(); +// resize(_width, _height); +// +// _hideTimer.setSingleShot(true); +// connect(&_hideTimer, SIGNAL(timeout()), this, SLOT(hideStart())); +// +// connect(&_scroll, SIGNAL(scrolled()), &_inner, SLOT(updateSelected())); +// +// connect(&_inner, SIGNAL(stickerSelected(DocumentData*)), this, SIGNAL(stickerSelected(DocumentData*))); +//} +// +//void StickerPan::setStickerPack(EmojiPtr emoji, bool show) { +// _emoji = emoji; +// _inner.showStickerPack(_emoji); +// if (!_hiding && !isHidden() && !_inner.hasContent()) { +// _hideTimer.stop(); +// hideStart(); +// } else if ((_hiding || isHidden()) && _inner.hasContent() && show) { +// _hideTimer.stop(); +// showStart(); +// } +//} +// +//void StickerPan::paintEvent(QPaintEvent *e) { +// QPainter p(this); +// +// if (!_cache.isNull()) { +// p.setOpacity(a_opacity.current()); +// } +// +// QRect r(st::dropdownPadding.left(), st::dropdownPadding.top(), _width - st::dropdownPadding.left() - st::dropdownPadding.right(), _height - st::dropdownPadding.top() - st::dropdownPadding.bottom()); +// +// // draw shadow +// _shadow.paint(p, r); +// +// if (_cache.isNull()) { +// p.fillRect(r, st::white->b); +// +// p.setFont(st::stickerPanFont->f); +// p.setPen(st::stickerPanColor->p); +// p.drawText(QRect(st::dropdownPadding.left(), st::dropdownPadding.top(), width() - st::dropdownPadding.left() - st::dropdownPadding.right(), st::rbEmoji.height), lang(lng_attach_stickers_header), style::al_center); +// } else { +// p.drawPixmap(r.left(), r.top(), _cache); +// } +//} +// +//void StickerPan::enterEvent(QEvent *e) { +// _hideTimer.stop(); +// if (_hiding) showStart(); +//} +// +//void StickerPan::leaveEvent(QEvent *e) { +// if (animating()) { +// hideStart(); +// } else { +// _hideTimer.start(300); +// } +//} +// +//void StickerPan::otherEnter() { +// _hideTimer.stop(); +// showStart(); +//} +// +//void StickerPan::otherLeave() { +// if (animating()) { +// hideStart(); +// } else { +// _hideTimer.start(0); +// } +//} +// +//void StickerPan::fastHide() { +// if (animating()) { +// anim::stop(this); +// } +// a_opacity = anim::fvalue(0, 0); +// _hideTimer.stop(); +// hide(); +// _cache = QPixmap(); +//} +// +//bool StickerPan::animStep(float64 ms) { +// float64 dt = ms / 150; +// bool res = true; +// if (dt >= 1) { +// a_opacity.finish(); +// if (_hiding) { +// hideFinish(); +// } else { +// showAll(); +// _cache = QPixmap(); +// } +// res = false; +// } else { +// a_opacity.update(dt, anim::linear); +// } +// update(); +// return res; +//} +// +//void StickerPan::hideStart() { +// if (_cache.isNull()) { +// showAll(); +// _cache = myGrab(this, rect().marginsRemoved(st::dropdownPadding)); +// } +// hideAll(); +// _hiding = true; +// a_opacity.start(0); +// anim::start(this); +//} +// +//void StickerPan::hideFinish() { +// hide(); +// _cache = QPixmap(); +//} +// +//void StickerPan::showStart() { +// if (!isHidden() && a_opacity.current() == 1) { +// return; +// } +// if (!_inner.hasContent()) { +// return; +// } +// if (_cache.isNull()) { +// showAll(); +// _cache = myGrab(this, rect().marginsRemoved(st::dropdownPadding)); +// } +// hideAll(); +// _hiding = false; +// show(); +// a_opacity.start(1); +// anim::start(this); +//} +// +//bool StickerPan::eventFilter(QObject *obj, QEvent *e) { +// if (e->type() == QEvent::Enter) { +// if (dynamic_cast(obj)) { +// enterEvent(e); +// } else { +// otherEnter(); +// } +// } else if (e->type() == QEvent::Leave) { +// if (dynamic_cast(obj)) { +// leaveEvent(e); +// } else { +// otherLeave(); +// } +// } else if (e->type() == QEvent::MouseButtonPress && static_cast(e)->button() == Qt::LeftButton && !dynamic_cast(obj)) { +// if (isHidden() || _hiding) { +// otherEnter(); +// } else { +// otherLeave(); +// } +// } +// return false; +//} +// +//void StickerPan::showAll() { +// _scroll.show(); +//} +// +//void StickerPan::hideAll() { +// _scroll.hide(); +//} diff --git a/Telegram/SourceFiles/dropdown.h b/Telegram/SourceFiles/dropdown.h index 0036e5143..0c4e67d53 100644 --- a/Telegram/SourceFiles/dropdown.h +++ b/Telegram/SourceFiles/dropdown.h @@ -134,6 +134,8 @@ public: void showEmojiPack(DBIEmojiTab packIndex); + void clearSelection(bool fast = false); + public slots: void updateSelected(); @@ -142,17 +144,20 @@ public slots: signals: void emojiSelected(EmojiPtr emoji); + void stickerSelected(DocumentData *sticker); private: typedef QMap EmojiAnimations; // index - showing, -index - hiding EmojiAnimations _emojiAnimations; + StickerPack _stickers; + QVector _isUserGen; QVector _emojis; QVector _hovers; DBIEmojiTab _tab; - int32 _selected, _pressedSel; + int32 _selected, _xSelected, _pressedSel, _xPressedSel; QPoint _lastMousePos; QTimer _saveConfigTimer; @@ -174,6 +179,9 @@ public: void otherLeave(); void fastHide(); + bool hiding() const { + return _hiding || _hideTimer.isActive(); + } bool animStep(float64 ms); @@ -191,6 +199,8 @@ public slots: signals: void emojiSelected(EmojiPtr emoji); + void stickerSelected(DocumentData *sticker); + void updateStickers(); private: @@ -207,10 +217,104 @@ private: BoxShadow _shadow; - FlatRadiobutton _recent, _people, _nature, _objects, _places, _symbols; + FlatRadiobutton _recent, _people, _nature, _objects, _places, _symbols, _stickers; int32 _emojiPack; ScrollArea _scroll; EmojiPanInner _inner; }; + +//class StickerPanInner : public QWidget, public Animated { +// Q_OBJECT +// +//public: +// +// StickerPanInner(QWidget *parent = 0); +// +// void paintEvent(QPaintEvent *e); +// +// void mousePressEvent(QMouseEvent *e); +// void mouseReleaseEvent(QMouseEvent *e); +// void mouseMoveEvent(QMouseEvent *e); +// void leaveEvent(QEvent *e); +// +// bool animStep(float64 ms); +// +// void showStickerPack(EmojiPtr emoji); +// bool hasContent() const; +// +//public slots: +// +// void updateSelected(); +// +//signals: +// +// void stickerSelected(DocumentData *sticker); +// +//private: +// +// typedef QMap StickerAnimations; // index - showing, -index - hiding +// StickerAnimations _stickerAnimations; +// +// StickerPack _stickers; +// QVector _hovers; +// +// EmojiPtr _emoji; +// int32 _selected, _pressedSel; +// QPoint _lastMousePos; +// +//}; +// +//class StickerPan : public TWidget, public Animated { +// Q_OBJECT +// +//public: +// +// StickerPan(QWidget *parent); +// +// void setStickerPack(EmojiPtr emoji, bool show); +// void paintEvent(QPaintEvent *e); +// +// void enterEvent(QEvent *e); +// void leaveEvent(QEvent *e); +// void otherEnter(); +// void otherLeave(); +// +// void fastHide(); +// +// bool animStep(float64 ms); +// +// bool eventFilter(QObject *obj, QEvent *e); +// +//public slots: +// +// void hideStart(); +// void hideFinish(); +// +// void showStart(); +// +//signals: +// +// void stickerSelected(DocumentData *sticker); +// +//private: +// +// void showAll(); +// void hideAll(); +// +// int32 _width, _height; +// bool _hiding; +// QPixmap _cache; +// +// anim::fvalue a_opacity; +// +// QTimer _hideTimer; +// +// BoxShadow _shadow; +// +// EmojiPtr _emoji; +// ScrollArea _scroll; +// StickerPanInner _inner; +// +//}; diff --git a/Telegram/SourceFiles/fileuploader.cpp b/Telegram/SourceFiles/fileuploader.cpp index c3a6d396d..02cab32a0 100644 --- a/Telegram/SourceFiles/fileuploader.cpp +++ b/Telegram/SourceFiles/fileuploader.cpp @@ -32,9 +32,9 @@ void FileUploader::uploadMedia(MsgId msgId, const ReadyLocalMedia &media) { } else if (media.type == ToPrepareDocument) { DocumentData *document; if (media.photoThumbs.isEmpty()) { - document = App::feedDocument(MTP::authedId(), media.document); + document = App::feedDocument(media.document); } else { - document = App::feedDocument(MTP::authedId(), media.document, media.photoThumbs.begin().value()); + document = App::feedDocument(media.document, media.photoThumbs.begin().value()); } document->status = FileUploading; if (!media.file.isEmpty()) { diff --git a/Telegram/SourceFiles/gui/emoji_config.cpp b/Telegram/SourceFiles/gui/emoji_config.cpp index fc9459a24..ea21023f1 100644 --- a/Telegram/SourceFiles/gui/emoji_config.cpp +++ b/Telegram/SourceFiles/gui/emoji_config.cpp @@ -4512,6 +4512,71 @@ void findEmoji(const QChar *ch, const QChar *e, const QChar *&newEmojiEnd, uint3 break; } break; + case 'k': + if (ch + 2 != e) switch ((ch + 2)->unicode()) { + case 'i': + if (ch + 3 != e) switch ((ch + 3)->unicode()) { + case 's': + if (ch + 4 != e) switch ((ch + 4)->unicode()) { + case 's': + if (ch + 5 != e) switch ((ch + 5)->unicode()) { + case ':': + newEmojiEnd = ch + 6; + if (newEmojiEnd == e || emojiEdge(newEmojiEnd) || newEmojiEnd->unicode() == ' ') { + emojiCode = 0xD83DDC8BU; + return; + } + break; + } + break; + } + break; + } + break; + } + break; + case 'j': + if (ch + 2 != e) switch ((ch + 2)->unicode()) { + case 'o': + if (ch + 3 != e) switch ((ch + 3)->unicode()) { + case 'y': + if (ch + 4 != e) switch ((ch + 4)->unicode()) { + case ':': + newEmojiEnd = ch + 5; + if (newEmojiEnd == e || emojiEdge(newEmojiEnd) || newEmojiEnd->unicode() == ' ') { + emojiCode = 0xD83DDE02U; + return; + } + break; + } + break; + } + break; + } + break; + case 'g': + if (ch + 2 != e) switch ((ch + 2)->unicode()) { + case 'r': + if (ch + 3 != e) switch ((ch + 3)->unicode()) { + case 'i': + if (ch + 4 != e) switch ((ch + 4)->unicode()) { + case 'n': + if (ch + 5 != e) switch ((ch + 5)->unicode()) { + case ':': + newEmojiEnd = ch + 6; + if (newEmojiEnd == e || emojiEdge(newEmojiEnd) || newEmojiEnd->unicode() == ' ') { + emojiCode = 0xD83DDE01U; + return; + } + break; + } + break; + } + break; + } + break; + } + break; case 'd': if (ch + 2 != e) switch ((ch + 2)->unicode()) { case 'i': @@ -4605,7 +4670,7 @@ void findEmoji(const QChar *ch, const QChar *e, const QChar *&newEmojiEnd, uint3 case '(': newEmojiEnd = ch + 3; if (newEmojiEnd == e || emojiEdge(newEmojiEnd) || newEmojiEnd->unicode() == ' ') { - emojiCode = 0xD83DDE12U; + emojiCode = 0xD83DDE1EU; return; } break; diff --git a/Telegram/SourceFiles/gui/flattextarea.cpp b/Telegram/SourceFiles/gui/flattextarea.cpp index 76d27e2c8..ce6d38270 100644 --- a/Telegram/SourceFiles/gui/flattextarea.cpp +++ b/Telegram/SourceFiles/gui/flattextarea.cpp @@ -166,6 +166,75 @@ QSize FlatTextarea::minimumSizeHint() const { return geometry().size(); } +EmojiPtr FlatTextarea::getSingleEmoji() const { + QString text; + QTextFragment fragment; + + getSingleEmojiFragment(text, fragment); + + if (!text.isEmpty()) { + QString imageName = static_cast(&fragment.charFormat())->name(); + return getEmoji(imageName.mid(8).toUInt(0, 16)); + } + return 0; +} + +void FlatTextarea::getSingleEmojiFragment(QString &text, QTextFragment &fragment) const { + int32 end = textCursor().position(), start = end - 1; + if (textCursor().anchor() != end) return; + + if (start < 0) start = 0; + + QTextDocument *doc(document()); + QTextBlock from = doc->findBlock(start), till = doc->findBlock(end); + if (till.isValid()) till = till.next(); + + for (QTextBlock b = from; b != till; b = b.next()) { + for (QTextBlock::Iterator iter = b.begin(); !iter.atEnd(); ++iter) { + QTextFragment fr(iter.fragment()); + if (!fr.isValid()) continue; + + int32 p = fr.position(), e = (p + fr.length()); + if (p >= end || e <= start) { + continue; + } + + QTextCharFormat f = fr.charFormat(); + QString t(fr.text()); + if (p < start) { + t = t.mid(start - p, end - start); + } else if (e > end) { + t = t.mid(0, end - p); + } + if (f.isImageFormat() && !t.isEmpty() && t.at(0).unicode() == QChar::ObjectReplacementCharacter) { + QString imageName = static_cast(&f)->name(); + if (imageName.midRef(0, 8) == qsl("emoji://")) { + fragment = fr; + text = t; + return; + } + } + return; + } + } + return; +} + +void FlatTextarea::removeSingleEmoji() { + QString text; + QTextFragment fragment; + + getSingleEmojiFragment(text, fragment); + + if (!text.isEmpty()) { + QTextCursor t(textCursor()); + t.setPosition(fragment.position()); + t.setPosition(fragment.position() + fragment.length(), QTextCursor::KeepAnchor); + t.removeSelectedText(); + setTextCursor(t); + } +} + QString FlatTextarea::getText(int32 start, int32 end) const { if (end >= 0 && end <= start) return QString(); diff --git a/Telegram/SourceFiles/gui/flattextarea.h b/Telegram/SourceFiles/gui/flattextarea.h index 39721f5d8..cbe09a08e 100644 --- a/Telegram/SourceFiles/gui/flattextarea.h +++ b/Telegram/SourceFiles/gui/flattextarea.h @@ -48,6 +48,8 @@ public: QSize sizeHint() const; QSize minimumSizeHint() const; + EmojiPtr getSingleEmoji() const; + void removeSingleEmoji(); QString getText(int32 start = 0, int32 end = -1) const; bool hasText() const; @@ -77,6 +79,7 @@ protected: private: + void getSingleEmojiFragment(QString &text, QTextFragment &fragment) const; void processDocumentContentsChange(int position, int charsAdded); QMimeData *createMimeDataFromSelection() const; diff --git a/Telegram/SourceFiles/gui/images.cpp b/Telegram/SourceFiles/gui/images.cpp index d3421eec9..0268c9d74 100644 --- a/Telegram/SourceFiles/gui/images.cpp +++ b/Telegram/SourceFiles/gui/images.cpp @@ -330,7 +330,7 @@ void Image::invalidateSizeCache() const { } LocalImage::LocalImage(const QString &file, QByteArray fmt) { - data = QPixmap::fromImage(App::readImage(file, &fmt, false), Qt::ColorOnly); + data = QPixmap::fromImage(App::readImage(file, &fmt, false, 0, &saved), Qt::ColorOnly); format = fmt; if (!data.isNull()) { globalAquiredSize += int64(data.width()) * data.height() * 4; diff --git a/Telegram/SourceFiles/gui/text.cpp b/Telegram/SourceFiles/gui/text.cpp index 55e0fc884..f0346f329 100644 --- a/Telegram/SourceFiles/gui/text.cpp +++ b/Telegram/SourceFiles/gui/text.cpp @@ -4212,7 +4212,7 @@ LinkRanges textParseLinks(const QString &text, bool rich) { } } if (p > domainEnd) { // check, that domain ended - if (domainEnd->unicode() != '/') { + if (domainEnd->unicode() != '/' && domainEnd->unicode() != '?') { matchOffset = domainEnd - start; continue; } diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp index af39e3bee..cf970a145 100644 --- a/Telegram/SourceFiles/history.cpp +++ b/Telegram/SourceFiles/history.cpp @@ -720,8 +720,8 @@ void DocumentCancelLink::onClick(Qt::MouseButton button) const { data->cancel(); } -DocumentData::DocumentData(int32 user, const DocumentId &id, const uint64 &access, int32 date, const QVector &attributes, const QString &mime, const ImagePtr &thumb, int32 dc, int32 size) : -user(user), id(id), type(FileDocument), duration(0), access(access), date(date), mime(mime), thumb(thumb), dc(dc), size(size), status(FileReady), uploadOffset(0), openOnSave(0), openOnSaveMsgId(0), loader(0) { +DocumentData::DocumentData(const DocumentId &id, const uint64 &access, int32 date, const QVector &attributes, const QString &mime, const ImagePtr &thumb, int32 dc, int32 size) : +id(id), type(FileDocument), duration(0), access(access), date(date), mime(mime), thumb(thumb), dc(dc), size(size), status(FileReady), uploadOffset(0), openOnSave(0), openOnSaveMsgId(0), loader(0) { setattributes(attributes); location = Local::readFileLocation(mediaKey(mtpc_inputDocumentFileLocation, dc, id)); } @@ -1289,27 +1289,14 @@ HistoryItem *History::createItemForwarded(HistoryBlock *block, MsgId id, History return regItem(result); } -/* -HistoryItem *History::createItem(HistoryBlock *block, const MTPgeoChatMessage &msg, bool newMsg) { +HistoryItem *History::createItemDocument(HistoryBlock *block, MsgId id, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc) { HistoryItem *result = 0; - switch (msg.type()) { - case mtpc_geoChatMessageEmpty: - result = new HistoryServiceMsg(this, block, msg.c_geoChatMessageEmpty().vid.v, date(), lang(lng_message_empty)); - break; - - case mtpc_geoChatMessage: - result = new HistoryMessage(this, block, msg.c_geoChatMessage()); - break; - - case mtpc_geoChatMessageService: - result = new HistoryServiceMsg(this, block, msg.c_geoChatMessageService()); - break; - } + result = new HistoryMessage(this, block, id, out, unread, date, from, doc); return regItem(result); } -/**/ + HistoryItem *History::addToBackService(MsgId msgId, QDateTime date, const QString &text, bool out, bool unread, HistoryMedia *media, bool newMsg) { HistoryBlock *to = 0; bool newBlock = isEmpty(); @@ -1348,8 +1335,7 @@ HistoryItem *History::addToBackForwarded(MsgId id, HistoryMessage *item) { return doAddToBack(to, newBlock, createItemForwarded(to, id, item), true); } -/* -HistoryItem *History::addToBack(const MTPgeoChatMessage &msg, bool newMsg) { +HistoryItem *History::addToBackDocument(MsgId id, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc) { HistoryBlock *to = 0; bool newBlock = isEmpty(); if (newBlock) { @@ -1357,10 +1343,8 @@ HistoryItem *History::addToBack(const MTPgeoChatMessage &msg, bool newMsg) { } else { to = back(); } - - return doAddToBack(to, newBlock, createItem(to, msg, newMsg), newMsg); + return doAddToBack(to, newBlock, createItemDocument(to, id, out, unread, date, from, doc), true); } -/**/ void History::createInitialDateBlock(const QDateTime &date) { HistoryBlock *dateBlock = new HistoryBlock(this); // date block @@ -2988,7 +2972,7 @@ void HistoryDocument::unregItem(HistoryItem *item) { void HistoryDocument::updateFrom(const MTPMessageMedia &media) { if (media.type() == mtpc_messageMediaDocument) { - App::feedDocument(data->user, media.c_messageMediaDocument().vdocument, data); + App::feedDocument(media.c_messageMediaDocument().vdocument, data); } } @@ -3096,6 +3080,7 @@ void HistorySticker::initDimensions(const HistoryItem *parent) { void HistorySticker::draw(QPainter &p, const HistoryItem *parent, bool selected, int32 width) const { if (width < 0) width = w; if (width < 1) return; + if (width > _maxw) width = _maxw; bool out = parent->out(), hovered, pressed, already = !data->already().isEmpty(), hasdata = !data->data.isEmpty(); if (!data->loader && data->status != FileFailed && !already && !hasdata) { @@ -3158,7 +3143,8 @@ void HistorySticker::unregItem(HistoryItem *item) { void HistorySticker::updateFrom(const MTPMessageMedia &media) { if (media.type() == mtpc_messageMediaDocument) { - App::feedDocument(data->user, media.c_messageMediaDocument().vdocument, data); + App::feedDocument(media.c_messageMediaDocument().vdocument, data); + if (App::main()) App::main()->incrementSticker(data); } } @@ -3944,12 +3930,22 @@ HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgI , _textHeight(0) , _media(0) { - QString text(msg); if (fromMedia) { _media = fromMedia->clone(); _media->regItem(this); } - initDimensions(text); + initDimensions(msg); +} + +HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc) : +HistoryItem(history, block, msgId, out, unread, date, from) +, _text(st::msgMinWidth) +, _textWidth(0) +, _textHeight(0) +, _media(0) +{ + initMediaFromDocument(doc); + initDimensions(QString()); } void HistoryMessage::initMedia(const MTPMessageMedia &media, QString ¤tText) { @@ -3993,12 +3989,8 @@ void HistoryMessage::initMedia(const MTPMessageMedia &media, QString ¤tTex case mtpc_messageMediaDocument: { const MTPDocument &document(media.c_messageMediaDocument().vdocument); if (document.type() == mtpc_document) { - DocumentData *doc = App::feedDocument(_from->id, document); - if (doc->type == StickerDocument && doc->dimensions.width() > 0 && doc->dimensions.height() > 0 && doc->size < StickerInMemory) { - _media = new HistorySticker(doc); - } else { - _media = new HistoryDocument(doc); - } + DocumentData *doc = App::feedDocument(document); + return initMediaFromDocument(doc); } } break; case mtpc_messageMediaUnsupported: @@ -4007,6 +3999,15 @@ void HistoryMessage::initMedia(const MTPMessageMedia &media, QString ¤tTex if (_media) _media->regItem(this); } +void HistoryMessage::initMediaFromDocument(DocumentData *doc) { + if (doc->type == StickerDocument && doc->dimensions.width() > 0 && doc->dimensions.height() > 0 && doc->size < StickerInMemory) { + _media = new HistorySticker(doc); + } else { + _media = new HistoryDocument(doc); + } + _media->regItem(this); +} + void HistoryMessage::initDimensions(const QString &text) { _time = date.toString(qsl("hh:mm")); _timeWidth = st::msgDateFont->m.width(_time); diff --git a/Telegram/SourceFiles/history.h b/Telegram/SourceFiles/history.h index bb553d318..a1667b421 100644 --- a/Telegram/SourceFiles/history.h +++ b/Telegram/SourceFiles/history.h @@ -399,7 +399,7 @@ enum DocumentType { AnimatedDocument }; struct DocumentData { - DocumentData(int32 user, const DocumentId &id, const uint64 &access = 0, int32 date = 0, const QVector &attributes = QVector(), const QString &mime = QString(), const ImagePtr &thumb = ImagePtr(), int32 dc = 0, int32 size = 0); + DocumentData(const DocumentId &id, const uint64 &access = 0, int32 date = 0, const QVector &attributes = QVector(), const QString &mime = QString(), const ImagePtr &thumb = ImagePtr(), int32 dc = 0, int32 size = 0); void setattributes(const QVector &attributes); void forget() { @@ -435,8 +435,6 @@ struct DocumentData { QString already(bool check = false); - int32 user; - DocumentId id; DocumentType type; QSize dimensions; @@ -640,12 +638,14 @@ struct History : public QList { HistoryItem *createItem(HistoryBlock *block, const MTPmessage &msg, bool newMsg, bool returnExisting = false); HistoryItem *createItemForwarded(HistoryBlock *block, MsgId id, HistoryMessage *msg); -// HistoryItem *createItem(HistoryBlock *block, const MTPgeoChatMessage &msg, bool newMsg); + HistoryItem *createItemDocument(HistoryBlock *block, MsgId id, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc); + HistoryItem *addToBackService(MsgId msgId, QDateTime date, const QString &text, bool out = false, bool unread = false, HistoryMedia *media = 0, bool newMsg = true); HistoryItem *addToBack(const MTPmessage &msg, bool newMsg = true); HistoryItem *addToHistory(const MTPmessage &msg); HistoryItem *addToBackForwarded(MsgId id, HistoryMessage *item); -// HistoryItem *addToBack(const MTPgeoChatMessage &msg, bool newMsg = true); + HistoryItem *addToBackDocument(MsgId id, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc); + void addToFront(const QVector &slice); void addToBack(const QVector &slice); void createInitialDateBlock(const QDateTime &date); @@ -1549,8 +1549,10 @@ public: HistoryMessage(History *history, HistoryBlock *block, const MTPDmessage &msg); HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, bool out, bool unread, QDateTime date, int32 from, const QString &msg, const MTPMessageMedia &media); HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, bool out, bool unread, QDateTime date, int32 from, const QString &msg, HistoryMedia *media); + HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc); void initMedia(const MTPMessageMedia &media, QString ¤tText); + void initMediaFromDocument(DocumentData *doc); void initDimensions(const HistoryItem *parent = 0); void initDimensions(const QString &text); void fromNameUpdated() const; diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 17823fa33..fa18b0c44 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -1233,11 +1233,11 @@ MessageField::MessageField(HistoryWidget *history, const style::flatTextarea &st } void MessageField::onChange() { - int newh = ceil(document()->size().height()) + 2 * fakeMargin(); + int newh = ceil(document()->size().height()) + 2 * fakeMargin(), minh = st::btnSend.height - 2 * st::sendPadding; if (newh > st::maxFieldHeight) { newh = st::maxFieldHeight; - } else if (newh < st::minFieldHeight) { - newh = st::minFieldHeight; + } else if (newh < minh) { + newh = minh; } if (height() != newh) { @@ -1533,41 +1533,44 @@ HistoryHider::~HistoryHider() { } HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) - , histRequestsCount(0) - , histPeer(0) - , _activeHist(0) - , histPreloading(0) - , _loadingAroundId(-1) - , _loadingAroundRequest(0) - , _scroll(this, st::historyScroll, false) - , _list(0) - , hist(0) - , _histInited(false) - , _toHistoryEnd(this, st::historyToEnd) - , _send(this, lang(lng_send_button), st::btnSend) - , _attachDocument(this, st::btnAttachDocument) - , _attachPhoto(this, st::btnAttachPhoto) - , _attachEmoji(this, st::btnAttachEmoji) - , _field(this, st::taMsgField, lang(lng_message_ph)) - , _attachType(this) - , _emojiPan(this) - , _attachDrag(DragStateNone) - , _attachDragDocument(this) - , _attachDragPhoto(this) - , imageLoader(this) - , _synthedTextUpdate(false) - , loadingChatId(0) - , loadingRequestId(0) - , serviceImageCacheSize(0) - , confirmImageId(0) - , confirmWithText(false) - , titlePeerTextWidth(0) - , bg(st::msgBG) - , hiderOffered(false) - , _scrollDelta(0) - , _typingRequest(0) - , _saveDraftStart(0) - , _saveDraftText(false) { +, _lastStickersUpdate(0) +, _stickersUpdateRequest(0) +, histRequestsCount(0) +, histPeer(0) +, _activeHist(0) +, histPreloading(0) +, _loadingAroundId(-1) +, _loadingAroundRequest(0) +, _scroll(this, st::historyScroll, false) +, _list(0) +, hist(0) +, _histInited(false) +, _toHistoryEnd(this, st::historyToEnd) +, _send(this, lang(lng_send_button), st::btnSend) +, _attachDocument(this, st::btnAttachDocument) +, _attachPhoto(this, st::btnAttachPhoto) +, _attachEmoji(this, st::btnAttachEmoji) +, _field(this, st::taMsgField, lang(lng_message_ph)) +, _attachType(this) +, _emojiPan(this) +//, _stickerPan(this) +, _attachDrag(DragStateNone) +, _attachDragDocument(this) +, _attachDragPhoto(this) +, imageLoader(this) +, _synthedTextUpdate(false) +, loadingChatId(0) +, loadingRequestId(0) +, serviceImageCacheSize(0) +, confirmImageId(0) +, confirmWithText(false) +, titlePeerTextWidth(0) +, bg(st::msgBG) +, hiderOffered(false) +, _scrollDelta(0) +, _typingRequest(0) +, _saveDraftStart(0) +, _saveDraftText(false) { _scroll.setFocusPolicy(Qt::NoFocus); setAcceptDrops(true); @@ -1588,6 +1591,9 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) connect(App::wnd()->windowHandle(), SIGNAL(visibleChanged(bool)), this, SLOT(onVisibleChanged())); connect(&_scrollTimer, SIGNAL(timeout()), this, SLOT(onScrollTimer())); connect(&_emojiPan, SIGNAL(emojiSelected(EmojiPtr)), &_field, SLOT(onEmojiInsert(EmojiPtr))); + connect(&_emojiPan, SIGNAL(stickerSelected(DocumentData*)), this, SLOT(onStickerSend(DocumentData*))); + connect(&_emojiPan, SIGNAL(updateStickers()), this, SLOT(updateStickers())); +// connect(&_stickerPan, SIGNAL(stickerSelected(DocumentData*)), this, SLOT(onStickerSend(DocumentData*))); connect(&_typingStopTimer, SIGNAL(timeout()), this, SLOT(cancelTyping())); _scrollTimer.setSingleShot(false); @@ -1618,11 +1624,15 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) _attachDocument.installEventFilter(&_attachType); _attachPhoto.installEventFilter(&_attachType); _attachEmoji.installEventFilter(&_emojiPan); +// _attachEmoji.installEventFilter(&_stickerPan); +// _emojiPan.installEventFilter(&_stickerPan); +// _stickerPan.installEventFilter(&_emojiPan); connect(_attachType.addButton(new IconedButton(this, st::dropdownAttachDocument, lang(lng_attach_file))), SIGNAL(clicked()), this, SLOT(onDocumentSelect())); connect(_attachType.addButton(new IconedButton(this, st::dropdownAttachPhoto, lang(lng_attach_photo))), SIGNAL(clicked()), this, SLOT(onPhotoSelect())); _attachType.hide(); _emojiPan.hide(); +// _stickerPan.hide(); _attachDragDocument.hide(); _attachDragPhoto.hide(); @@ -1632,6 +1642,7 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) void HistoryWidget::onTextChange() { updateTyping(); +// updateStickerPan(); if (!hist || _synthedTextUpdate) return; _saveDraftText = true; @@ -1639,6 +1650,8 @@ void HistoryWidget::onTextChange() { } void HistoryWidget::onDraftSaveDelayed() { +// updateStickerPan(); + if (!hist || _synthedTextUpdate) return; if (!_field.textCursor().anchor() && !_field.textCursor().position() && !_field.verticalScrollBar()->value()) { if (!Local::hasDraftPositions(hist->peer->id)) return; @@ -1690,6 +1703,18 @@ void HistoryWidget::updateTyping(bool typing) { } } +//void HistoryWidget::updateStickerPan() { +// EmojiPtr e = _field.getSingleEmoji(); +// if (e) updateStickers(); +// _stickerPan.setStickerPack(e, !_emojiPan.isHidden() && !_emojiPan.hiding()); +//} + +void HistoryWidget::updateRecentStickers() { + if (cEmojiTab() == dbietStickers) { + _emojiPan.onTabChange(); + } +} + void HistoryWidget::typingDone(const MTPBool &result, mtpRequestId req) { if (_typingRequest == req) { _typingRequest = 0; @@ -1734,6 +1759,98 @@ void HistoryWidget::chatLoaded(const MTPmessages_ChatFull &res) { peerUpdated(App::chat(peerId)); } +void HistoryWidget::updateStickers() { + if (_lastStickersUpdate && getms(true) < _lastStickersUpdate + StickersUpdateTimeout) return; + if (_stickersUpdateRequest) return; + + _stickersUpdateRequest = MTP::send(MTPmessages_GetAllStickers(MTP_string(cStickersHash())), rpcDone(&HistoryWidget::stickersGot), rpcFail(&HistoryWidget::stickersFailed)); +} + +void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) { + _lastStickersUpdate = getms(true); + _stickersUpdateRequest = 0; + + if (stickers.type() == mtpc_messages_allStickers) { + const MTPDmessages_allStickers &d(stickers.c_messages_allStickers()); + + AllStickers all; + + const QVector &docs(d.vdocuments.c_vector().v); + + const RecentStickerPack &recent(cRecentStickers()); + RecentStickerPack add; + add.reserve(docs.size()); + ushort addValue = recent.isEmpty() ? 1 : qAbs(recent.front().second); + for (int32 i = 0, l = docs.size(); i < l; ++i) { + DocumentData *doc = App::feedDocument(docs.at(i)); + if (!doc) continue; + int32 j = 0, s = recent.size(); + for (; j < s; ++j) { + if (doc == recent.at(j).first) break; + } + if (j < s) continue; + add.push_back(qMakePair(doc, addValue)); + } + if (!add.isEmpty()) { + cSetRecentStickers(add + recent); + Local::writeRecentStickers(); + _emojiPan.onTabChange(); + } + + const QVector &packs(d.vpacks.c_vector().v); + for (int32 i = 0, l = packs.size(); i < l; ++i) { + if (packs.at(i).type() == mtpc_stickerPack) { + const MTPDstickerPack &p(packs.at(i).c_stickerPack()); + QString emoticon(qs(p.vemoticon)); + EmojiPtr e = 0; + for (const QChar *ch = emoticon.constData(), *end = emoticon.constEnd(); ch != end; ++ch) { + if (ch->isHighSurrogate()) { + if (ch + 1 < end && (ch + 1)->isLowSurrogate()) { + e = getEmoji((ch->unicode() << 16) | (ch + 1)->unicode()); + if (!e) { + ++ch; + } + } + } else { + if (ch + 1 < end) { + if (((ch->unicode() >= 48 && ch->unicode() < 58) || ch->unicode() == 35) && (ch + 1)->unicode() == 0x20E3) { + e = getEmoji((ch->unicode() << 16) | (ch + 1)->unicode()); + } else if ((ch + 1)->unicode() == 0xFE0F) { + e = getEmoji(ch->unicode()); + } + } + } + if (e) break; + } + if (e) { + const QVector docs(p.vdocuments.c_vector().v); + if (!docs.isEmpty()) { + StickerPack &pack(all[e]); + pack.reserve(pack.size() + docs.size()); + for (int32 j = 0, s = docs.size(); j < s; ++j) { + pack.push_back(App::document(docs.at(j).v)); + } + } + } else { + LOG(("Sticker Error: Could not find emoji for string: %1").arg(emoticon)); + } + } + } + + cSetStickers(all); + cSetStickersHash(qba(d.vhash)); + +// updateStickerPan(); + _emojiPan.onTabChange(); + } +} + +bool HistoryWidget::stickersFailed(const RPCError &error) { + _lastStickersUpdate = getms(true); + _stickersUpdateRequest = 0; + return true; +} + void HistoryWidget::clearLoadingAround() { _loadingAroundId = -1; if (_loadingAroundRequest) { @@ -1928,6 +2045,7 @@ void HistoryWidget::updateControlsVisibility() { _attachEmoji.hide(); _attachType.hide(); _emojiPan.hide(); +// _stickerPan.hide(); return; } @@ -1957,6 +2075,7 @@ void HistoryWidget::updateControlsVisibility() { _attachEmoji.hide(); _attachType.hide(); _emojiPan.hide(); +// _stickerPan.hide(); if (!_field.isHidden()) { _field.hide(); resizeEvent(0); @@ -1977,6 +2096,7 @@ void HistoryWidget::updateControlsVisibility() { _attachEmoji.hide(); _attachType.hide(); _emojiPan.hide(); +// _stickerPan.hide(); _toHistoryEnd.hide(); if (!_field.isHidden()) { _field.hide(); @@ -2301,6 +2421,7 @@ void HistoryWidget::onSend(bool ctrlShiftEnter) { if (!_attachType.isHidden()) _attachType.hideStart(); if (!_emojiPan.isHidden()) _emojiPan.hideStart(); +// if (!_stickerPan.isHidden()) _stickerPan.hideStart(); } _field.setFocus(); @@ -2991,13 +3112,17 @@ void HistoryWidget::onDocumentUploaded(MsgId newId, const MTPInputFile &file) { if (!MTP::authedId()) return; HistoryMessage *item = dynamic_cast(App::histItemById(newId)); if (item) { - HistoryDocument *media = dynamic_cast(item->getMedia()); - if (media) { + DocumentData *document = 0; + if (HistoryDocument *media = dynamic_cast(item->getMedia())) { + document = media->document(); + } else if (HistorySticker *media = dynamic_cast(item->getMedia())) { + document = media->document(); + } + if (document) { //App::main()->readServerHistory(item->history(), false); uint64 randomId = MTP::nonce(); App::historyRegRandom(randomId, newId); - DocumentData *document = media->document(); History *hist = item->history(); hist->sendRequestId = MTP::send(MTPmessages_SendMedia(item->history()->peer->input, MTP_inputMediaUploadedDocument(file, MTP_string(document->mime), _composeDocumentAttributes(document)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); } @@ -3008,13 +3133,17 @@ void HistoryWidget::onThumbDocumentUploaded(MsgId newId, const MTPInputFile &fil if (!MTP::authedId()) return; HistoryMessage *item = dynamic_cast(App::histItemById(newId)); if (item) { - HistoryDocument *media = dynamic_cast(item->getMedia()); - if (media) { + DocumentData *document = 0; + if (HistoryDocument *media = dynamic_cast(item->getMedia())) { + document = media->document(); + } else if (HistorySticker *media = dynamic_cast(item->getMedia())) { + document = media->document(); + } + if (document) { //App::main()->readServerHistory(item->history(), false); uint64 randomId = MTP::nonce(); App::historyRegRandom(randomId, newId); - DocumentData *document = media->document(); History *hist = item->history(); hist->sendRequestId = MTP::send(MTPmessages_SendMedia(item->history()->peer->input, MTP_inputMediaUploadedThumbDocument(file, thumb, MTP_string(document->mime), _composeDocumentAttributes(document)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); } @@ -3070,6 +3199,7 @@ void HistoryWidget::resizeEvent(QResizeEvent *e) { _attachType.move(0, _attachDocument.y() - _attachType.height()); _emojiPan.move(width() - _emojiPan.width(), _attachEmoji.y() - _emojiPan.height()); +// _stickerPan.move(width() - _emojiPan.width() - _stickerPan.width() + st::dropdownPadding.left(), _attachEmoji.y() - _stickerPan.height()); switch (_attachDrag) { case DragStateFiles: @@ -3278,6 +3408,35 @@ void HistoryWidget::onFieldTabbed() { } } +void HistoryWidget::onStickerSend(DocumentData *sticker) { + if (!hist || !sticker) return; + + App::main()->readServerHistory(hist, false); + + uint64 randomId = MTP::nonce(); + MsgId newId = clientMsgId(); + + hist->loadAround(0); + + bool out = (histPeer->input.type() != mtpc_inputPeerSelf), unread = (histPeer->input.type() != mtpc_inputPeerSelf); + hist->addToBackDocument(newId, out, unread, date(MTP_int(unixtime())), MTP::authedId(), sticker); + + hist->sendRequestId = MTP::send(MTPmessages_SendMedia(histPeer->input, MTP_inputMediaDocument(MTP_inputDocument(MTP_long(sticker->id), MTP_long(sticker->access))), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); + + App::historyRegRandom(randomId, newId); + App::main()->historyToDown(hist); + + App::main()->dialogsToUp(); + peerMessagesUpdated(histPeer->id); + + if (!_attachType.isHidden()) _attachType.hideStart(); + if (!_emojiPan.isHidden()) _emojiPan.hideStart(); +// if (!_stickerPan.isHidden()) _stickerPan.hideStart(); + +// _field.removeSingleEmoji(); + _field.setFocus(); +} + void HistoryWidget::setFieldText(const QString &text) { _synthedTextUpdate = true; _field.setPlainText(text); diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index 1e836c6d1..17d58742c 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -288,6 +288,8 @@ public: QRect historyRect() const; void updateTyping(bool typing = true); +// void updateStickerPan(); + void updateRecentStickers(); void typingDone(const MTPBool &result, mtpRequestId req); void destroyData(); @@ -379,6 +381,7 @@ public slots: void onTextChange(); void onFieldTabbed(); + void onStickerSend(DocumentData *sticker); void onVisibleChanged(); @@ -401,6 +404,8 @@ public slots: void onDraftSaveDelayed(); void onDraftSave(bool delayed = false); + void updateStickers(); + private: bool messagesFailed(const RPCError &error, mtpRequestId requestId); @@ -409,6 +414,12 @@ private: void addMessagesToBack(const QVector &messages); void chatLoaded(const MTPmessages_ChatFull &res); + void stickersGot(const MTPmessages_AllStickers &stickers); + bool stickersFailed(const RPCError &error); + + uint64 _lastStickersUpdate; + mtpRequestId _stickersUpdateRequest; + void writeDraft(const QString *text = 0, const MessageCursor *cursor = 0); void setFieldText(const QString &text); @@ -440,6 +451,7 @@ private: Dropdown _attachType; EmojiPan _emojiPan; +// StickerPan _stickerPan; DragState _attachDrag; DragArea _attachDragDocument, _attachDragPhoto; diff --git a/Telegram/SourceFiles/localimageloader.cpp b/Telegram/SourceFiles/localimageloader.cpp index 62e058925..b94ec9913 100644 --- a/Telegram/SourceFiles/localimageloader.cpp +++ b/Telegram/SourceFiles/localimageloader.cpp @@ -167,14 +167,20 @@ void LocalImageLoaderPrivate::prepareImages() { jpeg_id = id; } else if ((type == ToPrepareVideo || type == ToPrepareDocument) && !img.isNull()) { int32 w = img.width(), h = img.height(); - if (animated) attributes.push_back(MTP_documentAttributeAnimated()); + QByteArray thumbFormat = "JPG"; + if (animated) { + attributes.push_back(MTP_documentAttributeAnimated()); + } else if (mime == qsl("image/webp") && w > 0 && h > 0 && filesize < StickerInMemory) { + attributes.push_back(MTP_documentAttributeSticker()); + thumbFormat = "webp"; + } attributes.push_back(MTP_documentAttributeImageSize(MTP_int(w), MTP_int(h))); QPixmap full = (w > 90 || h > 90) ? QPixmap::fromImage(img.scaled(90, 90, Qt::KeepAspectRatio, Qt::SmoothTransformation), Qt::ColorOnly) : QPixmap::fromImage(img, Qt::ColorOnly); { QBuffer jpegBuffer(&jpeg); - full.save(&jpegBuffer, "JPG", 87); + full.save(&jpegBuffer, thumbFormat, 87); } photoThumbs.insert('0', full); diff --git a/Telegram/SourceFiles/localstorage.cpp b/Telegram/SourceFiles/localstorage.cpp index 3af06399a..cf94ad174 100644 --- a/Telegram/SourceFiles/localstorage.cpp +++ b/Telegram/SourceFiles/localstorage.cpp @@ -84,7 +84,7 @@ namespace { result = MTP::nonce(); path.resize(_basePath.size()); path += toFilePart(result); - } while (keyAlreadyUsed(path)); + } while (!result || keyAlreadyUsed(path)); return result; } @@ -437,8 +437,11 @@ namespace { lskUserMap = 0, lskDraft, // data: PeerId peer lskDraftPosition, // data: PeerId peer - lskStorage, // data: StorageKey location + lskImages, // data: StorageKey location lskLocations, // no data + lskStickers, // data: StorageKey location + lskAudios, // data: StorageKey location + lskRecentStickers, // no data }; typedef QMap DraftsMap; @@ -446,17 +449,19 @@ namespace { typedef QMap DraftsNotReadMap; DraftsNotReadMap _draftsNotReadMap; - typedef QPair FileDesc; // file, size - typedef QMap StorageMap; - StorageMap _storageMap; - int32 _storageFilesSize = 0; - typedef QMultiMap FileLocations; FileLocations _fileLocations; typedef QPair FileLocationPair; typedef QMap FileLocationPairs; FileLocationPairs _fileLocationPairs; FileKey _locationsKey = 0; + + FileKey _recentStickersKey = 0; + + typedef QPair FileDesc; // file, size + typedef QMap StorageMap; + StorageMap _imagesMap, _stickersMap, _audiosMap; + int32 _storageImagesSize = 0, _storageStickersSize = 0, _storageAudiosSize = 0; bool _mapChanged = false; int32 _oldMapVersion = 0; @@ -474,6 +479,8 @@ namespace { _manager->writeLocations(when == WriteMapFast); return; } + if (!_working()) return; + _manager->writingLocations(); if (_fileLocations.isEmpty()) { if (_locationsKey) { @@ -484,15 +491,14 @@ namespace { } } else { if (!_locationsKey) { - while (!_locationsKey) { - _locationsKey = genKey(); - } + _locationsKey = genKey(); _mapChanged = true; _writeMap(WriteMapFast); } quint32 size = 0; for (FileLocations::const_iterator i = _fileLocations.cbegin(); i != _fileLocations.cend(); ++i) { - size += sizeof(quint64) * 2 + sizeof(quint32) + sizeof(quint32) + i.value().name.size() * sizeof(ushort) + sizeof(qint64) + sizeof(quint32) + sizeof(qint8) + sizeof(quint32); + // location + type + namelen + name + date + size + size += sizeof(quint64) * 2 + sizeof(quint32) + sizeof(quint32) + i.value().name.size() * sizeof(ushort) + (sizeof(qint64) + sizeof(quint32) + sizeof(qint8)) + sizeof(quint32); } EncryptedDescriptor data(size); for (FileLocations::const_iterator i = _fileLocations.cbegin(); i != _fileLocations.cend(); ++i) { @@ -576,9 +582,9 @@ namespace { DraftsMap draftsMap, draftsPositionsMap; DraftsNotReadMap draftsNotReadMap; - StorageMap storageMap; - qint64 storageFilesSize = 0; - quint64 locationsKey = 0; + StorageMap imagesMap, stickersMap, audiosMap; + qint64 storageImagesSize = 0, storageStickersSize = 0, storageAudiosSize = 0; + quint64 locationsKey = 0, recentStickersKey = 0; while (!map.stream.atEnd()) { quint32 keyType; map.stream >> keyType; @@ -604,7 +610,7 @@ namespace { draftsPositionsMap.insert(p, key); } } break; - case lskStorage: { + case lskImages: { quint32 count = 0; map.stream >> count; for (quint32 i = 0; i < count; ++i) { @@ -612,13 +618,40 @@ namespace { quint64 first, second; qint32 size; map.stream >> key >> first >> second >> size; - storageMap.insert(StorageKey(first, second), FileDesc(key, size)); - storageFilesSize += size; + imagesMap.insert(StorageKey(first, second), FileDesc(key, size)); + storageImagesSize += size; + } + } break; + case lskStickers: { + quint32 count = 0; + map.stream >> count; + for (quint32 i = 0; i < count; ++i) { + FileKey key; + quint64 first, second; + qint32 size; + map.stream >> key >> first >> second >> size; + stickersMap.insert(StorageKey(first, second), FileDesc(key, size)); + storageStickersSize += size; + } + } break; + case lskAudios: { + quint32 count = 0; + map.stream >> count; + for (quint32 i = 0; i < count; ++i) { + FileKey key; + quint64 first, second; + qint32 size; + map.stream >> key >> first >> second >> size; + audiosMap.insert(StorageKey(first, second), FileDesc(key, size)); + storageAudiosSize += size; } } break; case lskLocations: { map.stream >> locationsKey; } break; + case lskRecentStickers: { + map.stream >> recentStickersKey; + } break; default: LOG(("App Error: unknown key type in encrypted map: %1").arg(keyType)); return Local::ReadMapFailed; @@ -632,9 +665,16 @@ namespace { _draftsMap = draftsMap; _draftsPositionsMap = draftsPositionsMap; _draftsNotReadMap = draftsNotReadMap; - _storageMap = storageMap; - _storageFilesSize = storageFilesSize; + + _imagesMap = imagesMap; + _storageImagesSize = storageImagesSize; + _stickersMap = stickersMap; + _storageStickersSize = storageStickersSize; + _audiosMap = audiosMap; + _storageAudiosSize = storageAudiosSize; + _locationsKey = locationsKey; + _recentStickersKey = recentStickersKey; _oldMapVersion = mapData.version; if (_oldMapVersion < AppVersion) { _mapChanged = true; @@ -687,8 +727,11 @@ namespace { uint32 mapSize = 0; if (!_draftsMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _draftsMap.size() * sizeof(quint64) * 2; if (!_draftsPositionsMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _draftsPositionsMap.size() * sizeof(quint64) * 2; - if (!_storageMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _storageMap.size() * (sizeof(quint64) * 3 + sizeof(qint32)); + if (!_imagesMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _imagesMap.size() * (sizeof(quint64) * 3 + sizeof(qint32)); + if (!_stickersMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _stickersMap.size() * (sizeof(quint64) * 3 + sizeof(qint32)); + if (!_audiosMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _audiosMap.size() * (sizeof(quint64) * 3 + sizeof(qint32)); if (_locationsKey) mapSize += sizeof(quint32) + sizeof(quint64); + if (_recentStickersKey) mapSize += sizeof(quint32) + sizeof(quint64); EncryptedDescriptor mapData(mapSize); if (!_draftsMap.isEmpty()) { mapData.stream << quint32(lskDraft) << quint32(_draftsMap.size()); @@ -702,15 +745,30 @@ namespace { mapData.stream << quint64(i.value()) << quint64(i.key()); } } - if (!_storageMap.isEmpty()) { - mapData.stream << quint32(lskStorage) << quint32(_storageMap.size()); - for (StorageMap::const_iterator i = _storageMap.cbegin(), e = _storageMap.cend(); i != e; ++i) { + if (!_imagesMap.isEmpty()) { + mapData.stream << quint32(lskImages) << quint32(_imagesMap.size()); + for (StorageMap::const_iterator i = _imagesMap.cbegin(), e = _imagesMap.cend(); i != e; ++i) { + mapData.stream << quint64(i.value().first) << quint64(i.key().first) << quint64(i.key().second) << qint32(i.value().second); + } + } + if (!_stickersMap.isEmpty()) { + mapData.stream << quint32(lskStickers) << quint32(_stickersMap.size()); + for (StorageMap::const_iterator i = _stickersMap.cbegin(), e = _stickersMap.cend(); i != e; ++i) { + mapData.stream << quint64(i.value().first) << quint64(i.key().first) << quint64(i.key().second) << qint32(i.value().second); + } + } + if (!_audiosMap.isEmpty()) { + mapData.stream << quint32(lskAudios) << quint32(_audiosMap.size()); + for (StorageMap::const_iterator i = _audiosMap.cbegin(), e = _audiosMap.cend(); i != e; ++i) { mapData.stream << quint64(i.value().first) << quint64(i.key().first) << quint64(i.key().second) << qint32(i.value().second); } } if (_locationsKey) { mapData.stream << quint32(lskLocations) << quint64(_locationsKey); } + if (_recentStickersKey) { + mapData.stream << quint32(lskRecentStickers) << quint64(_recentStickersKey); + } map.writeEncrypted(mapData); map.finish(); @@ -958,9 +1016,25 @@ namespace Local { return result; } + qint32 _storageStickerSize(qint32 rawlen) { + // fulllen + storagekey + len + data + qint32 result = sizeof(uint32) + sizeof(quint64) * 2 + sizeof(quint32) + rawlen; + if (result & 0x0F) result += 0x10 - (result & 0x0F); + result += tdfMagicLen + sizeof(qint32) + sizeof(quint32) + 0x10 + 0x10; // magic + version + len of encrypted + part of sha1 + md5 + return result; + } + + qint32 _storageAudioSize(qint32 rawlen) { + // fulllen + storagekey + len + data + qint32 result = sizeof(uint32) + sizeof(quint64) * 2 + sizeof(quint32) + rawlen; + if (result & 0x0F) result += 0x10 - (result & 0x0F); + result += tdfMagicLen + sizeof(qint32) + sizeof(quint32) + 0x10 + 0x10; // magic + version + len of encrypted + part of sha1 + md5 + return result; + } + void writeImage(const StorageKey &location, const ImagePtr &image) { if (image->isNull() || !image->loaded()) return; - if (_storageMap.constFind(location) != _storageMap.cend()) return; + if (_imagesMap.constFind(location) != _imagesMap.cend()) return; QByteArray fmt = image->savedFormat(); mtpTypeId format = 0; @@ -981,10 +1055,10 @@ namespace Local { if (!_working()) return; qint32 size = _storageImageSize(image.data.size()); - StorageMap::const_iterator i = _storageMap.constFind(location); - if (i == _storageMap.cend()) { - i = _storageMap.insert(location, FileDesc(genKey(), size)); - _storageFilesSize += size; + StorageMap::const_iterator i = _imagesMap.constFind(location); + if (i == _imagesMap.cend()) { + i = _imagesMap.insert(location, FileDesc(genKey(), size)); + _storageImagesSize += size; _mapChanged = true; _writeMap(); } else if (!overwrite) { @@ -995,22 +1069,22 @@ namespace Local { FileWriteDescriptor file(i.value().first, false); file.writeEncrypted(data); if (i.value().second != size) { - _storageFilesSize += size; - _storageFilesSize -= i.value().second; - _storageMap[location].second = size; + _storageImagesSize += size; + _storageImagesSize -= i.value().second; + _imagesMap[location].second = size; } } StorageImageSaved readImage(const StorageKey &location) { - StorageMap::iterator j = _storageMap.find(location); - if (j == _storageMap.cend()) { + StorageMap::iterator j = _imagesMap.find(location); + if (j == _imagesMap.cend()) { return StorageImageSaved(); } FileReadDescriptor draft; if (!readEncryptedFile(draft, toFilePart(j.value().first), false)) { clearKey(j.value().first, false); - _storageFilesSize -= j.value().second; - _storageMap.erase(j); + _storageImagesSize -= j.value().second; + _imagesMap.erase(j); return StorageImageSaved(); } @@ -1023,16 +1097,194 @@ namespace Local { } int32 hasImages() { - return _storageMap.size(); + return _imagesMap.size(); } - qint64 storageFilesSize() { - return _storageFilesSize; + qint64 storageImagesSize() { + return _storageImagesSize; + } + + void writeSticker(const StorageKey &location, const QByteArray &sticker, bool overwrite) { + if (!_working()) return; + + qint32 size = _storageStickerSize(sticker.size()); + StorageMap::const_iterator i = _stickersMap.constFind(location); + if (i == _stickersMap.cend()) { + i = _stickersMap.insert(location, FileDesc(genKey(), size)); + _storageStickersSize += size; + _mapChanged = true; + _writeMap(); + } else if (!overwrite) { + return; + } + EncryptedDescriptor data(sizeof(quint64) * 2 + sizeof(quint32) + sizeof(quint32) + sticker.size()); + data.stream << quint64(location.first) << quint64(location.second) << sticker; + FileWriteDescriptor file(i.value().first, false); + file.writeEncrypted(data); + if (i.value().second != size) { + _storageStickersSize += size; + _storageStickersSize -= i.value().second; + _stickersMap[location].second = size; + } + } + + QByteArray readSticker(const StorageKey &location) { + StorageMap::iterator j = _stickersMap.find(location); + if (j == _stickersMap.cend()) { + return QByteArray(); + } + FileReadDescriptor draft; + if (!readEncryptedFile(draft, toFilePart(j.value().first), false)) { + clearKey(j.value().first, false); + _storageStickersSize -= j.value().second; + _stickersMap.erase(j); + return QByteArray(); + } + + QByteArray stickerData; + quint64 locFirst, locSecond; + draft.stream >> locFirst >> locSecond >> stickerData; + + return (locFirst == location.first && locSecond == location.second) ? stickerData : QByteArray(); + } + + int32 hasStickers() { + return _stickersMap.size(); + } + + qint64 storageStickersSize() { + return _storageStickersSize; + } + + void writeAudio(const StorageKey &location, const QByteArray &audio, bool overwrite) { + if (!_working()) return; + + qint32 size = _storageAudioSize(audio.size()); + StorageMap::const_iterator i = _audiosMap.constFind(location); + if (i == _audiosMap.cend()) { + i = _audiosMap.insert(location, FileDesc(genKey(), size)); + _storageAudiosSize += size; + _mapChanged = true; + _writeMap(); + } else if (!overwrite) { + return; + } + EncryptedDescriptor data(sizeof(quint64) * 2 + sizeof(quint32) + sizeof(quint32) + audio.size()); + data.stream << quint64(location.first) << quint64(location.second) << audio; + FileWriteDescriptor file(i.value().first, false); + file.writeEncrypted(data); + if (i.value().second != size) { + _storageAudiosSize += size; + _storageAudiosSize -= i.value().second; + _audiosMap[location].second = size; + } + } + + QByteArray readAudio(const StorageKey &location) { + StorageMap::iterator j = _audiosMap.find(location); + if (j == _audiosMap.cend()) { + return QByteArray(); + } + FileReadDescriptor draft; + if (!readEncryptedFile(draft, toFilePart(j.value().first), false)) { + clearKey(j.value().first, false); + _storageAudiosSize -= j.value().second; + _audiosMap.erase(j); + return QByteArray(); + } + + QByteArray audioData; + quint64 locFirst, locSecond; + draft.stream >> locFirst >> locSecond >> audioData; + + return (locFirst == location.first && locSecond == location.second) ? audioData : QByteArray(); + } + + int32 hasAudios() { + return _audiosMap.size(); + } + + qint64 storageAudiosSize() { + return _storageAudiosSize; + } + + void writeRecentStickers() { + if (!_working()) return; + + const RecentStickerPack &recent(cRecentStickers()); + if (recent.isEmpty()) { + if (_recentStickersKey) { + clearKey(_recentStickersKey); + _recentStickersKey = 0; + _mapChanged = true; + } + _writeMap(); + } else { + if (!_recentStickersKey) { + _recentStickersKey = genKey(); + _mapChanged = true; + _writeMap(WriteMapFast); + } + quint32 size = 0; + for (RecentStickerPack::const_iterator i = recent.cbegin(); i != recent.cend(); ++i) { + DocumentData *doc = i->first; + + // id + value + access + date + namelen + name + mimelen + mime + dc + size + width + height + type + size += sizeof(quint64) + sizeof(qint16) + sizeof(quint64) + sizeof(qint32) + (sizeof(quint32) + doc->name.size() * sizeof(ushort)) + (sizeof(quint32) + doc->mime.size() * sizeof(ushort)) + sizeof(qint32) + sizeof(qint32) + sizeof(qint32) + sizeof(qint32) + sizeof(qint32); + } + EncryptedDescriptor data(size); + for (RecentStickerPack::const_iterator i = recent.cbegin(); i != recent.cend(); ++i) { + DocumentData *doc = i->first; + + data.stream << quint64(doc->id) << qint16(i->second) << quint64(doc->access) << qint32(doc->date) << doc->name << doc->mime << qint32(doc->dc) << qint32(doc->size) << qint32(doc->dimensions.width()) << qint32(doc->dimensions.height()) << qint32(doc->type); + } + FileWriteDescriptor file(_recentStickersKey); + file.writeEncrypted(data); + } + } + + void readRecentStickers() { + if (!_recentStickersKey) return; + + FileReadDescriptor stickers; + if (!readEncryptedFile(stickers, toFilePart(_recentStickersKey))) { + clearKey(_recentStickersKey); + _recentStickersKey = 0; + _writeMap(); + return; + } + + QMap read; + RecentStickerPack recent; + while (!stickers.stream.atEnd()) { + quint64 id, access; + QString name, mime; + qint32 date, dc, size, width, height, type; + qint16 value; + stickers.stream >> id >> value >> access >> date >> name >> mime >> dc >> size >> width >> height >> type; + if (read.contains(id)) continue; + read.insert(id, true); + + QVector attributes; + if (!name.isEmpty()) attributes.push_back(MTP_documentAttributeFilename(MTP_string(name))); + if (type == AnimatedDocument) { + attributes.push_back(MTP_documentAttributeAnimated()); + } else if (type == StickerDocument) { + attributes.push_back(MTP_documentAttributeSticker()); + } + if (width > 0 && height > 0) { + attributes.push_back(MTP_documentAttributeImageSize(MTP_int(width), MTP_int(height))); + } + + recent.push_back(qMakePair(App::document(id, 0, access, date, attributes, mime, ImagePtr(), dc, size), value)); + } + + cSetRecentStickers(recent); } struct ClearManagerData { QThread *thread; - StorageMap images; + StorageMap images, stickers, audios; QMutex mutex; QList tasks; bool working; @@ -1050,9 +1302,19 @@ namespace Local { if (!data->tasks.isEmpty() && (data->tasks.at(0) == ClearManagerAll)) return true; if (task == ClearManagerAll) { data->tasks.clear(); - if (!_storageMap.isEmpty()) { - _storageMap.clear(); - _storageFilesSize = 0; + if (!_imagesMap.isEmpty()) { + _imagesMap.clear(); + _storageImagesSize = 0; + _mapChanged = true; + } + if (!_stickersMap.isEmpty()) { + _stickersMap.clear(); + _storageStickersSize = 0; + _mapChanged = true; + } + if (!_audiosMap.isEmpty()) { + _audiosMap.clear(); + _storageAudiosSize = 0; _mapChanged = true; } if (!_draftsMap.isEmpty()) { @@ -1067,13 +1329,17 @@ namespace Local { _locationsKey = 0; _mapChanged = true; } + if (_recentStickersKey) { + _recentStickersKey = 0; + _mapChanged = true; + } _writeMap(); } else { - if (task & ClearManagerImages) { + if (task & ClearManagerStorage) { if (data->images.isEmpty()) { - data->images = _storageMap; + data->images = _imagesMap; } else { - for (StorageMap::const_iterator i = _storageMap.cbegin(), e = _storageMap.cend(); i != e; ++i) { + for (StorageMap::const_iterator i = _imagesMap.cbegin(), e = _imagesMap.cend(); i != e; ++i) { StorageKey k = i.key(); while (data->images.constFind(k) != data->images.cend()) { ++k.second; @@ -1081,12 +1347,44 @@ namespace Local { data->images.insert(k, i.value()); } } - if (!_storageMap.isEmpty()) { - _storageMap.clear(); - _storageFilesSize = 0; + if (!_imagesMap.isEmpty()) { + _imagesMap.clear(); + _storageImagesSize = 0; _mapChanged = true; - _writeMap(); } + if (data->stickers.isEmpty()) { + data->stickers = _stickersMap; + } else { + for (StorageMap::const_iterator i = _stickersMap.cbegin(), e = _stickersMap.cend(); i != e; ++i) { + StorageKey k = i.key(); + while (data->stickers.constFind(k) != data->stickers.cend()) { + ++k.second; + } + data->stickers.insert(k, i.value()); + } + } + if (!_stickersMap.isEmpty()) { + _stickersMap.clear(); + _storageStickersSize = 0; + _mapChanged = true; + } + if (data->audios.isEmpty()) { + data->audios = _audiosMap; + } else { + for (StorageMap::const_iterator i = _audiosMap.cbegin(), e = _audiosMap.cend(); i != e; ++i) { + StorageKey k = i.key(); + while (data->audios.constFind(k) != data->audios.cend()) { + ++k.second; + } + data->audios.insert(k, i.value()); + } + } + if (!_audiosMap.isEmpty()) { + _audiosMap.clear(); + _storageAudiosSize = 0; + _mapChanged = true; + } + _writeMap(); } for (int32 i = 0, l = data->tasks.size(); i < l; ++i) { if (data->tasks.at(i) == task) return true; @@ -1121,7 +1419,7 @@ namespace Local { while (true) { int task = 0; bool result = false; - StorageMap images; + StorageMap images, stickers, audios; { QMutexLocker lock(&data->mutex); if (data->tasks.isEmpty()) { @@ -1130,6 +1428,8 @@ namespace Local { } task = data->tasks.at(0); images = data->images; + stickers = data->stickers; + audios = data->audios; } switch (task) { case ClearManagerAll: @@ -1138,10 +1438,16 @@ namespace Local { case ClearManagerDownloads: result = QDir(cTempDir()).removeRecursively(); break; - case ClearManagerImages: + case ClearManagerStorage: for (StorageMap::const_iterator i = images.cbegin(), e = images.cend(); i != e; ++i) { clearKey(i.value().first, false); } + for (StorageMap::const_iterator i = stickers.cbegin(), e = stickers.cend(); i != e; ++i) { + clearKey(i.value().first, false); + } + for (StorageMap::const_iterator i = audios.cbegin(), e = audios.cend(); i != e; ++i) { + clearKey(i.value().first, false); + } result = true; break; } diff --git a/Telegram/SourceFiles/localstorage.h b/Telegram/SourceFiles/localstorage.h index 58269b1db..36a8bd456 100644 --- a/Telegram/SourceFiles/localstorage.h +++ b/Telegram/SourceFiles/localstorage.h @@ -59,7 +59,7 @@ namespace Local { enum ClearManagerTask { ClearManagerAll = 0xFFFF, ClearManagerDownloads = 0x01, - ClearManagerImages = 0x02, + ClearManagerStorage = 0x02, }; struct ClearManagerData; @@ -106,6 +106,19 @@ namespace Local { void writeImage(const StorageKey &location, const StorageImageSaved &jpeg, bool overwrite = true); StorageImageSaved readImage(const StorageKey &location); int32 hasImages(); - qint64 storageFilesSize(); + qint64 storageImagesSize(); + + void writeSticker(const StorageKey &location, const QByteArray &data, bool overwrite = true); + QByteArray readSticker(const StorageKey &location); + int32 hasStickers(); + qint64 storageStickersSize(); + + void writeAudio(const StorageKey &location, const QByteArray &data, bool overwrite = true); + QByteArray readAudio(const StorageKey &location); + int32 hasAudios(); + qint64 storageAudiosSize(); + + void writeRecentStickers(); + void readRecentStickers(); }; diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 023a7fa4d..15bb5a4b7 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -26,6 +26,8 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "boxes/confirmbox.h" +#include "localstorage.h" + #include "audio.h" TopBarWidget::TopBarWidget(MainWidget *w) : TWidget(w), @@ -2121,6 +2123,8 @@ void MainWidget::start(const MTPUser &user) { } _started = true; App::wnd()->sendServiceHistoryRequest(); + Local::readRecentStickers(); + history.updateRecentStickers(); } bool MainWidget::started() { @@ -2267,6 +2271,45 @@ void MainWidget::updateNotifySetting(PeerData *peer, bool enabled) { updateNotifySettingTimer.start(NotifySettingSaveTimeout); } +void MainWidget::incrementSticker(DocumentData *sticker) { + RecentStickerPack recent(cRecentStickers()); + RecentStickerPack::iterator i = recent.begin(), e = recent.end(); + for (; i != e; ++i) { + if (i->first == sticker) { + if (i->second > 0) { + ++i->second; + } else { + --i->second; + } + if (qAbs(i->second) > 0x4000) { + for (RecentStickerPack::iterator j = recent.begin(); j != e; ++j) { + if (qAbs(j->second) > 1) { + j->second /= 2; + } else if (j->second > 0) { + j->second = 1; + } else { + j->second = -1; + } + } + } + for (; i != recent.begin(); --i) { + if (qAbs((i - 1)->second) > qAbs(i->second)) { + break; + } + qSwap(*i, *(i - 1)); + } + break; + } + } + if (i == e) { + recent.push_front(qMakePair(sticker, -(recent.isEmpty() ? 1 : qAbs(recent.front().second)))); + } + cSetRecentStickers(recent); + Local::writeRecentStickers(); + + history.updateRecentStickers(); +} + void MainWidget::activate() { if (!profile && !overview) { if (hider) { diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index e8abb6a47..8620f0888 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -196,6 +196,8 @@ public: void updateNotifySetting(PeerData *peer, bool enabled); + void incrementSticker(DocumentData *sticker); + void activate(); void createDialogAtTop(History *history, int32 unreadCount); diff --git a/Telegram/SourceFiles/mediaview.cpp b/Telegram/SourceFiles/mediaview.cpp index 2575968e6..4debbc88c 100644 --- a/Telegram/SourceFiles/mediaview.cpp +++ b/Telegram/SourceFiles/mediaview.cpp @@ -179,7 +179,7 @@ void MediaView::updateControls() { } else { _dateText = lng_mediaview_date_time(lt_date, d.date().toString(qsl("dd.MM.yy")), lt_time, d.time().toString(qsl("hh:mm"))); } - _fromName.setText(st::medviewNameFont, _from->name); + if (_from) _fromName.setText(st::medviewNameFont, _from->name); updateHeader(); _leftNavVisible = _photo && (_index > 0 || (_index == 0 && _history && _history->_overview[OverviewPhotos].size() < _history->_overviewCount[OverviewPhotos])); _rightNavVisible = _photo && (_index >= 0 && ( @@ -480,7 +480,7 @@ void MediaView::showDocument(DocumentData *doc, QPixmap pix, HistoryItem *contex } _x = (_avail.width() - _w) / 2; _y = (_avail.height() - st::medviewBottomBar - _h) / 2; - _from = App::user(_doc->user); + _from = context ? context->from()->asUser() : 0; _full = 1; updateControls(); if (isHidden()) { @@ -721,20 +721,26 @@ void MediaView::paintEvent(QPaintEvent *e) { } else { p.setPen(st::medviewNameColor->p); } - if (_over == OverName) _fromName.replaceFont(st::medviewNameFont->underline()); - if (_nameNav.intersects(r)) _fromName.drawElided(p, _nameNav.left(), _nameNav.top(), _nameNav.width()); - if (_over == OverName) _fromName.replaceFont(st::medviewNameFont); + if (_from) { + if (_nameNav.intersects(r)) { + if (_over == OverName) _fromName.replaceFont(st::medviewNameFont->underline()); + _fromName.drawElided(p, _nameNav.left(), _nameNav.top(), _nameNav.width()); + if (_over == OverName) _fromName.replaceFont(st::medviewNameFont); + } + } // date - if (_doc) { - float64 o = overLevel(OverDate); - p.setOpacity(st::medviewOverview.overOpacity * o + st::medviewOverview.opacity * (1 - o)); - p.setPen(st::white->p); - } else { - p.setPen(st::medviewDateColor->p); + if (_dateNav.intersects(r)) { + if (_doc) { + float64 o = overLevel(OverDate); + p.setOpacity(st::medviewOverview.overOpacity * o + st::medviewOverview.opacity * (1 - o)); + p.setPen(st::white->p); + } else { + p.setPen(st::medviewDateColor->p); + } + p.setFont((_over == OverDate ? st::medviewDateFont->underline() : st::medviewDateFont)->f); + p.drawText(_dateNav.left(), _dateNav.top() + st::medviewDateFont->ascent, _dateText); } - p.setFont((_over == OverDate ? st::medviewDateFont->underline() : st::medviewDateFont)->f); - if (_dateNav.intersects(r)) p.drawText(_dateNav.left(), _dateNav.top() + st::medviewDateFont->ascent, _dateText); } void MediaView::keyPressEvent(QKeyEvent *e) { @@ -1060,7 +1066,7 @@ void MediaView::mouseReleaseEvent(QMouseEvent *e) { } textlnkDown(TextLinkPtr()); if (_over == OverName && _down == OverName) { - if (App::wnd()) { + if (App::wnd() && _from) { onClose(); if (App::main()) App::main()->showPeerProfile(_from); } @@ -1339,15 +1345,21 @@ void MediaView::updatePolaroid() { int32 minus1 = width() - _delete.x(), minus2 = _overview.x() + st::medviewHeaderFont->m.width(_header) - st::medviewOverview.width; if (minus2 > minus1) minus1 = minus2; - int32 nameWidth = _fromName.maxWidth(), maxWidth = width() - 2 * minus1, dateWidth = st::medviewDateFont->m.width(_dateText); - if (maxWidth < dateWidth) { - maxWidth = dateWidth; + int32 dateWidth = st::medviewDateFont->m.width(_dateText), maxWidth = width() - 2 * minus1; + if (_from) { + int32 nameWidth = _fromName.maxWidth(); + if (maxWidth < dateWidth) { + maxWidth = dateWidth; + } + if (nameWidth > maxWidth) { + nameWidth = maxWidth; + } + _nameNav = QRect((_avail.width() - nameWidth) / 2, _avail.y() + _avail.height() - ((st::medviewPolaroid.bottom() + st::medviewBottomBar) / 2) + st::medviewNameTop, nameWidth, st::medviewNameFont->height); + _dateNav = QRect((_avail.width() - dateWidth) / 2, _avail.y() + _avail.height() - ((st::medviewPolaroid.bottom() + st::medviewBottomBar) / 2) + st::medviewDateTop, dateWidth, st::medviewDateFont->height); + } else { + _nameNav = QRect(_avail.x() - 1, _avail.y() - 1, 0, 0); + _dateNav = QRect((_avail.width() - dateWidth) / 2, _avail.y() + _avail.height() - ((st::medviewPolaroid.bottom() + st::medviewBottomBar) / 2) + ((st::medviewNameTop + st::medviewDateTop) / 2), dateWidth, st::medviewDateFont->height); } - if (nameWidth > maxWidth) { - nameWidth = maxWidth; - } - _nameNav = QRect((_avail.width() - nameWidth) / 2, _avail.y() + _avail.height() - ((st::medviewPolaroid.bottom() + st::medviewBottomBar) / 2) + st::medviewNameTop, nameWidth, st::medviewNameFont->height); - _dateNav = QRect((_avail.width() - dateWidth) / 2, _avail.y() + _avail.height() - ((st::medviewPolaroid.bottom() + st::medviewBottomBar) / 2) + st::medviewDateTop, dateWidth, st::medviewDateFont->height); } else { int32 pminw = qMin(st::medviewPolaroidMin.width(), int(_avail.width() - 2 * st::medviewNavBarWidth)); diff --git a/Telegram/SourceFiles/mtproto/mtpCoreTypes.h b/Telegram/SourceFiles/mtproto/mtpCoreTypes.h index 9ab02bdc0..451f220ec 100644 --- a/Telegram/SourceFiles/mtproto/mtpCoreTypes.h +++ b/Telegram/SourceFiles/mtproto/mtpCoreTypes.h @@ -762,7 +762,12 @@ inline bool operator!=(const MTPstring &a, const MTPstring &b) { inline QString qs(const MTPstring &v) { const string &d(v.c_string().v); - return QString::fromUtf8(d.c_str(), d.length()); + return QString::fromUtf8(d.data(), d.length()); +} + +inline QByteArray qba(const MTPstring &v) { + const string &d(v.c_string().v); + return QByteArray(d.data(), d.length()); } class MTPbool { diff --git a/Telegram/SourceFiles/mtproto/mtpFileLoader.cpp b/Telegram/SourceFiles/mtproto/mtpFileLoader.cpp index 0ed7bd3a4..07634f133 100644 --- a/Telegram/SourceFiles/mtproto/mtpFileLoader.cpp +++ b/Telegram/SourceFiles/mtproto/mtpFileLoader.cpp @@ -254,8 +254,17 @@ void mtpFileLoader::partLoaded(int32 offset, const MTPupload_File &result, mtpRe if (!locationType && triedLocal && (fname.isEmpty() || duplicateInData)) { Local::writeImage(storageKey(dc, volume, local), StorageImageSaved(type, data)); - } else if (locationType && triedLocal && !fname.isEmpty()) { - Local::writeFileLocation(mediaKey(locationType, dc, id), FileLocation(type, fname)); + } else if (locationType && triedLocal) { + if (!fname.isEmpty()) { + Local::writeFileLocation(mediaKey(locationType, dc, id), FileLocation(type, fname)); + } + if (duplicateInData) { + if (locationType == mtpc_inputDocumentFileLocation) { + Local::writeSticker(mediaKey(locationType, dc, id), data); + } else if (locationType == mtpc_inputAudioFileLocation) { + Local::writeAudio(mediaKey(locationType, dc, id), data); + } + } } } emit progress(this); @@ -297,29 +306,44 @@ void mtpFileLoader::start(bool loadFirst, bool prior) { StorageImageSaved cached = Local::readImage(storageKey(dc, volume, local)); if (cached.type != mtpc_storage_fileUnknown) { data = cached.data; - if (!fname.isEmpty() && duplicateInData) { - if (!fileIsOpen) fileIsOpen = file.open(QIODevice::WriteOnly); - if (!fileIsOpen) { - return finishFail(); - } - if (file.write(data) != qint64(data.size())) { - return finishFail(); - } - } type = cached.type; - complete = true; - if (fileIsOpen) { - file.close(); - fileIsOpen = false; - psPostprocessFile(QFileInfo(file).absoluteFilePath()); - } - App::wnd()->update(); - App::wnd()->notifyUpdateAllPhotos(); - emit progress(this); - return loadNext(); } - } else if (locationType && !fname.isEmpty()) { - triedLocal = true; + } else if (locationType) { + if (!fname.isEmpty()) { + triedLocal = true; + } + if (duplicateInData) { + if (locationType == mtpc_inputDocumentFileLocation) { + triedLocal = true; + data = Local::readSticker(mediaKey(locationType, dc, id)); + if (!data.isEmpty()) type = mtpc_storage_filePartial; + } else if (locationType == mtpc_inputAudioFileLocation) { + triedLocal = true; + data = Local::readAudio(mediaKey(locationType, dc, id)); + if (!data.isEmpty()) type = mtpc_storage_filePartial; + } + } + } + if (triedLocal && !data.isEmpty()) { + if (!fname.isEmpty() && duplicateInData) { + if (!fileIsOpen) fileIsOpen = file.open(QIODevice::WriteOnly); + if (!fileIsOpen) { + return finishFail(); + } + if (file.write(data) != qint64(data.size())) { + return finishFail(); + } + } + complete = true; + if (fileIsOpen) { + file.close(); + fileIsOpen = false; + psPostprocessFile(QFileInfo(file).absoluteFilePath()); + } + App::wnd()->update(); + App::wnd()->notifyUpdateAllPhotos(); + emit progress(this); + return loadNext(); } } diff --git a/Telegram/SourceFiles/mtproto/mtpScheme.cpp b/Telegram/SourceFiles/mtproto/mtpScheme.cpp index 80227ab8a..5e50dde03 100644 --- a/Telegram/SourceFiles/mtproto/mtpScheme.cpp +++ b/Telegram/SourceFiles/mtproto/mtpScheme.cpp @@ -51,63 +51,68 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP int32 lev = level + types.size() - 1; switch (type) { - case mtpc_inputPhoneContact: + case mtpc_inputAudioEmpty: + to.add("{ inputAudioEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputAudio: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ inputPhoneContact"); + to.add("{ inputAudio"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" client_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" phone: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" first_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" last_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_messages_dhConfigNotModified: + case mtpc_messages_allStickersNotModified: + to.add("{ messages_allStickersNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_messages_allStickers: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_dhConfigNotModified"); + to.add("{ messages_allStickers"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" random: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" packs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" documents: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_messages_dhConfig: + case mtpc_future_salt: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_dhConfig"); + to.add("{ future_salt"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" g: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" p: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" random: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" valid_since: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" valid_until: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" salt: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_chatFull: + case mtpc_chatLocated: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ chatFull"); + to.add("{ chatLocated"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" participants: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" chat_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" distance: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -138,107 +143,37 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_inputFileLocation: + case mtpc_chatFull: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ inputFileLocation"); + to.add("{ chatFull"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" volume_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" local_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" participants: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" chat_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_inputVideoFileLocation: + case mtpc_msgs_state_req: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ inputVideoFileLocation"); + to.add("{ msgs_state_req"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_inputEncryptedFileLocation: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputEncryptedFileLocation"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputAudioFileLocation: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputAudioFileLocation"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputDocumentFileLocation: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputDocumentFileLocation"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contacts_suggested: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_suggested"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" results: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_config: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ config"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" test_mode: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" this_dc: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" dc_options: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" chat_size_max: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" broadcast_size_max: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } + case mtpc_inputPrivacyKeyStatusTimestamp: + to.add("{ inputPrivacyKeyStatusTimestamp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; case mtpc_encryptedChatEmpty: @@ -321,74 +256,68 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_contacts_importedContacts: + case mtpc_audioEmpty: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_importedContacts"); + to.add("{ audioEmpty"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" imported: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" retry_contacts: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_auth_checkedPhone: + case mtpc_audio: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ auth_checkedPhone"); + to.add("{ audio"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" phone_registered: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" phone_invited: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" duration: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" mime_type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 7: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_geoPointEmpty: - to.add("{ geoPointEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_geoPoint: + case mtpc_upload_file: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geoPoint"); + to.add("{ upload_file"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" long: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" lat: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" type: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" mtime: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_contacts_foreignLinkUnknown: - to.add("{ contacts_foreignLinkUnknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_contacts_foreignLinkRequested: + case mtpc_contactBlocked: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_foreignLinkRequested"); + to.add("{ contactBlocked"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" has_phone: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_contacts_foreignLinkMutual: - to.add("{ contacts_foreignLinkMutual }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - case mtpc_inputPhotoCropAuto: to.add("{ inputPhotoCropAuto }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; @@ -408,170 +337,73 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_resPQ: + case mtpc_auth_exportedAuthorization: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ resPQ"); + to.add("{ auth_exportedAuthorization"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" pq: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" server_public_key_fingerprints: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_privacyKeyStatusTimestamp: - to.add("{ privacyKeyStatusTimestamp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_messageActionEmpty: - to.add("{ messageActionEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_messageActionChatCreate: + case mtpc_contacts_importedContacts: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messageActionChatCreate"); + to.add("{ contacts_importedContacts"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; + case 0: to.add(" imported: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" retry_contacts: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_messageActionChatEditTitle: + case mtpc_inputPrivacyValueAllowContacts: + to.add("{ inputPrivacyValueAllowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputPrivacyValueAllowAll: + to.add("{ inputPrivacyValueAllowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputPrivacyValueAllowUsers: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messageActionChatEditTitle"); + to.add("{ inputPrivacyValueAllowUsers"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_messageActionChatEditPhoto: + case mtpc_inputPrivacyValueDisallowContacts: + to.add("{ inputPrivacyValueDisallowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputPrivacyValueDisallowAll: + to.add("{ inputPrivacyValueDisallowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputPrivacyValueDisallowUsers: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messageActionChatEditPhoto"); + to.add("{ inputPrivacyValueDisallowUsers"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messageActionChatDeletePhoto: - to.add("{ messageActionChatDeletePhoto }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_messageActionChatAddUser: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messageActionChatAddUser"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messageActionChatDeleteUser: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messageActionChatDeleteUser"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messageActionGeoChatCreate: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messageActionGeoChatCreate"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messageActionGeoChatCheckin: - to.add("{ messageActionGeoChatCheckin }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputMessagesFilterEmpty: - to.add("{ inputMessagesFilterEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputMessagesFilterPhotos: - to.add("{ inputMessagesFilterPhotos }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputMessagesFilterVideo: - to.add("{ inputMessagesFilterVideo }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputMessagesFilterPhotoVideo: - to.add("{ inputMessagesFilterPhotoVideo }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputMessagesFilterDocument: - to.add("{ inputMessagesFilterDocument }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputMessagesFilterAudio: - to.add("{ inputMessagesFilterAudio }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_p_q_inner_data: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ p_q_inner_data"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" pq: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" p: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" new_nonce: "); ++stages.back(); types.push_back(mtpc_int256); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_photos_photo: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ photos_photo"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -977,289 +809,16 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_help_appUpdate: + case mtpc_msgs_all_info: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ help_appUpdate"); + to.add("{ msgs_all_info"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" critical: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" url: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" text: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_help_noAppUpdate: - to.add("{ help_noAppUpdate }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_geochats_located: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_located"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" results: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_videoEmpty: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ videoEmpty"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_video: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ video"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" duration: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" mime_type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 7: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 8: to.add(" thumb: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 9: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 10: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 11: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_accountDaysTTL: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ accountDaysTTL"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" days: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputGeoPointEmpty: - to.add("{ inputGeoPointEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputGeoPoint: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputGeoPoint"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" lat: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" long: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updates_differenceEmpty: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updates_differenceEmpty"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updates_difference: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updates_difference"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" new_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" new_encrypted_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" other_updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" state: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updates_differenceSlice: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updates_differenceSlice"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" new_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" new_encrypted_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" other_updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" intermediate_state: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputVideoEmpty: - to.add("{ inputVideoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputVideo: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputVideo"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_messageEmpty: - to.add("{ messages_messageEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_messages_message: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_message"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_sentEncryptedMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sentEncryptedMessage"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_sentEncryptedFile: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sentEncryptedFile"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_chatPhotoEmpty: - to.add("{ chatPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_chatPhoto: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ chatPhoto"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" photo_small: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" photo_big: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_server_DH_inner_data: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ server_DH_inner_data"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" g: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" dh_prime: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" g_a: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" server_time: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputAudioEmpty: - to.add("{ inputAudioEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputAudio: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputAudio"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_upload_file: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ upload_file"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" type: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" mtime: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + case 1: to.add(" info: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -1327,6 +886,1852 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; + case mtpc_chatParticipantsForbidden: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ chatParticipantsForbidden"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_chatParticipants: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ chatParticipants"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" admin_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" participants: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_sendMessageTypingAction: + to.add("{ sendMessageTypingAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageCancelAction: + to.add("{ sendMessageCancelAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageRecordVideoAction: + to.add("{ sendMessageRecordVideoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageUploadVideoAction: + to.add("{ sendMessageUploadVideoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageRecordAudioAction: + to.add("{ sendMessageRecordAudioAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageUploadAudioAction: + to.add("{ sendMessageUploadAudioAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageUploadPhotoAction: + to.add("{ sendMessageUploadPhotoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageUploadDocumentAction: + to.add("{ sendMessageUploadDocumentAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageGeoLocationAction: + to.add("{ sendMessageGeoLocationAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_sendMessageChooseContactAction: + to.add("{ sendMessageChooseContactAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_messages_chats: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_chats"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputEncryptedFileEmpty: + to.add("{ inputEncryptedFileEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputEncryptedFileUploaded: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputEncryptedFileUploaded"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" md5_checksum: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputEncryptedFile: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputEncryptedFile"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputEncryptedFileBigUploaded: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputEncryptedFileBigUploaded"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contact: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contact"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" mutual: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_chatFull: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_chatFull"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" full_chat: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_statedMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_statedMessage"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_statedMessageLink: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_statedMessageLink"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_chatEmpty: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ chatEmpty"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_chat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ chat"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" participants_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" left: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_chatForbidden: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ chatForbidden"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geoChat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geoChat"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" venue: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" geo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 7: to.add(" participants_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 8: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 9: to.add(" checked_in: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 10: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_account_privacyRules: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_privacyRules"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" rules: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contactFound: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contactFound"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_dh_gen_ok: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ dh_gen_ok"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" new_nonce_hash1: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_dh_gen_retry: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ dh_gen_retry"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" new_nonce_hash2: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_dh_gen_fail: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ dh_gen_fail"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" new_nonce_hash3: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputFileLocation: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputFileLocation"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" volume_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" local_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputVideoFileLocation: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputVideoFileLocation"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputEncryptedFileLocation: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputEncryptedFileLocation"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputAudioFileLocation: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputAudioFileLocation"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputDocumentFileLocation: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputDocumentFileLocation"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_affectedHistory: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_affectedHistory"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_userProfilePhotoEmpty: + to.add("{ userProfilePhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_userProfilePhoto: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ userProfilePhoto"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" photo_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" photo_small: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" photo_big: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_msg_detailed_info: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ msg_detailed_info"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" answer_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" status: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_msg_new_detailed_info: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ msg_new_detailed_info"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" answer_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" status: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_bad_msg_notification: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ bad_msg_notification"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" bad_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" bad_msg_seqno: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" error_code: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_bad_server_salt: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ bad_server_salt"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" bad_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" bad_msg_seqno: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" error_code: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" new_server_salt: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_help_appUpdate: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ help_appUpdate"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" critical: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" url: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" text: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_help_noAppUpdate: + to.add("{ help_noAppUpdate }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_p_q_inner_data: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ p_q_inner_data"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" pq: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" p: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" new_nonce: "); ++stages.back(); types.push_back(mtpc_int256); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_msg_resend_req: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ msg_resend_req"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_link: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_link"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" my_link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" foreign_link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_http_wait: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ http_wait"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" max_delay: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" wait_after: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" max_wait: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputPhoneContact: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputPhoneContact"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" client_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" phone: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" first_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" last_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_importedContact: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ importedContact"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" client_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_chat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_chat"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputChatPhotoEmpty: + to.add("{ inputChatPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputChatUploadedPhoto: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputChatUploadedPhoto"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputChatPhoto: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputChatPhoto"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputPeerEmpty: + to.add("{ inputPeerEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputPeerSelf: + to.add("{ inputPeerSelf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputPeerContact: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputPeerContact"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputPeerForeign: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputPeerForeign"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputPeerChat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputPeerChat"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_peerNotifyEventsEmpty: + to.add("{ peerNotifyEventsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_peerNotifyEventsAll: + to.add("{ peerNotifyEventsAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_nearestDc: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ nearestDc"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" country: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" this_dc: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" nearest_dc: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geoChatMessageEmpty: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geoChatMessageEmpty"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geoChatMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geoChatMessage"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" from_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geoChatMessageService: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geoChatMessageService"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" from_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" action: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_future_salts: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ future_salts"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" req_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" now: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" salts: "); ++stages.back(); types.push_back(mtpc_vector); vtypes.push_back(mtpc_future_salt); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_privacyKeyStatusTimestamp: + to.add("{ privacyKeyStatusTimestamp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_account_sentChangePhoneCode: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_sentChangePhoneCode"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" send_call_timeout: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_server_DH_params_fail: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ server_DH_params_fail"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" new_nonce_hash: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_server_DH_params_ok: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ server_DH_params_ok"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" encrypted_answer: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_destroy_session_ok: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ destroy_session_ok"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" session_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_destroy_session_none: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ destroy_session_none"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" session_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputGeoChat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputGeoChat"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_messageEmpty: + to.add("{ messages_messageEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_messages_message: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_message"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_peerNotifySettingsEmpty: + to.add("{ peerNotifySettingsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_peerNotifySettings: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ peerNotifySettings"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" mute_until: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" sound: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" show_previews: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" events_mask: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputPeerNotifySettings: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputPeerNotifySettings"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" mute_until: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" sound: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" show_previews: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" events_mask: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_foreignLinkUnknown: + to.add("{ contacts_foreignLinkUnknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_contacts_foreignLinkRequested: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_foreignLinkRequested"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" has_phone: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_foreignLinkMutual: + to.add("{ contacts_foreignLinkMutual }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputVideoEmpty: + to.add("{ inputVideoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputVideo: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputVideo"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_blocked: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_blocked"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" blocked: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_blockedSlice: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_blockedSlice"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" blocked: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_auth_authorization: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_authorization"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" expires: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputDocumentEmpty: + to.add("{ inputDocumentEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputDocument: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputDocument"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_auth_sentCode: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_sentCode"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_registered: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" send_call_timeout: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" is_password: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_auth_sentAppCode: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_sentAppCode"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_registered: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" send_call_timeout: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" is_password: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_dcOption: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ dcOption"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" hostname: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" ip_address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" port: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_photos_photos: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photos_photos"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" photos: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_photos_photosSlice: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photos_photosSlice"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" photos: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputPeerNotifyEventsEmpty: + to.add("{ inputPeerNotifyEventsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputPeerNotifyEventsAll: + to.add("{ inputPeerNotifyEventsAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_videoEmpty: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ videoEmpty"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_video: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ video"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" duration: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" mime_type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 7: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 8: to.add(" thumb: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 9: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 10: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 11: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_fileLocationUnavailable: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ fileLocationUnavailable"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" volume_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" local_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_fileLocation: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ fileLocation"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" volume_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" local_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_wallPaper: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ wallPaper"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" sizes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_wallPaperSolid: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ wallPaperSolid"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" bg_color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_statedMessages: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_statedMessages"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_statedMessagesLinks: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_statedMessagesLinks"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_new_session_created: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ new_session_created"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" first_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" unique_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" server_salt: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_server_DH_inner_data: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ server_DH_inner_data"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" g: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" dh_prime: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" g_a: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" server_time: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_contactsNotModified: + to.add("{ contacts_contactsNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_contacts_contacts: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_contacts"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" contacts: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_notifyPeer: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ notifyPeer"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_notifyUsers: + to.add("{ notifyUsers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_notifyChats: + to.add("{ notifyChats }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_notifyAll: + to.add("{ notifyAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_chatParticipant: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ chatParticipant"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" inviter_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_userStatusEmpty: + to.add("{ userStatusEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_userStatusOnline: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ userStatusOnline"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" expires: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_userStatusOffline: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ userStatusOffline"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" was_online: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_userStatusRecently: + to.add("{ userStatusRecently }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_userStatusLastWeek: + to.add("{ userStatusLastWeek }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_userStatusLastMonth: + to.add("{ userStatusLastMonth }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_photos_photo: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photos_photo"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geoPointEmpty: + to.add("{ geoPointEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_geoPoint: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geoPoint"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" long: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" lat: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputNotifyPeer: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputNotifyPeer"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputNotifyUsers: + to.add("{ inputNotifyUsers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputNotifyChats: + to.add("{ inputNotifyChats }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputNotifyAll: + to.add("{ inputNotifyAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputNotifyGeoChatPeer: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputNotifyGeoChatPeer"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_rpc_answer_unknown: + to.add("{ rpc_answer_unknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_rpc_answer_dropped_running: + to.add("{ rpc_answer_dropped_running }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_rpc_answer_dropped: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ rpc_answer_dropped"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" seq_no: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_photoSizeEmpty: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photoSizeEmpty"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_photoSize: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photoSize"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_photoCachedSize: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photoCachedSize"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contactSuggested: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contactSuggested"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" mutual_contacts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_auth_checkedPhone: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_checkedPhone"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_registered: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" phone_invited: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_dialog: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ dialog"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" top_message: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" unread_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_client_DH_inner_data: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ client_DH_inner_data"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" retry_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" g_b: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_resPQ: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ resPQ"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" pq: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" server_public_key_fingerprints: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messageActionEmpty: + to.add("{ messageActionEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_messageActionChatCreate: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messageActionChatCreate"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messageActionChatEditTitle: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messageActionChatEditTitle"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messageActionChatEditPhoto: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messageActionChatEditPhoto"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messageActionChatDeletePhoto: + to.add("{ messageActionChatDeletePhoto }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_messageActionChatAddUser: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messageActionChatAddUser"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messageActionChatDeleteUser: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messageActionChatDeleteUser"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messageActionGeoChatCreate: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messageActionGeoChatCreate"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messageActionGeoChatCheckin: + to.add("{ messageActionGeoChatCheckin }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_stickerPack: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ stickerPack"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" emoticon: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" documents: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputEncryptedChat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputEncryptedChat"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_suggested: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_suggested"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" results: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_accountDaysTTL: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ accountDaysTTL"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" days: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_updatesTooLong: + to.add("{ updatesTooLong }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_updateShortMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updateShortMessage"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" from_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_updateShortChatMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updateShortChatMessage"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" from_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_updateShort: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updateShort"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" update: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_updatesCombined: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updatesCombined"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" seq_start: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_updates: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updates"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + case mtpc_rpc_error: if (stage) { to.add(",\n").addSpaces(lev); @@ -1341,60 +2746,207 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_geochats_statedMessage: + case mtpc_inputUserEmpty: + to.add("{ inputUserEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputUserSelf: + to.add("{ inputUserSelf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputUserContact: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_statedMessage"); + to.add("{ inputUserContact"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_storage_fileUnknown: - to.add("{ storage_fileUnknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_inputUserForeign: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputUserForeign"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; - case mtpc_storage_fileJpeg: - to.add("{ storage_fileJpeg }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_inputGeoPointEmpty: + to.add("{ inputGeoPointEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - case mtpc_storage_fileGif: - to.add("{ storage_fileGif }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_inputGeoPoint: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputGeoPoint"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" lat: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" long: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; - case mtpc_storage_filePng: - to.add("{ storage_filePng }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_geochats_messages: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_messages"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; - case mtpc_storage_filePdf: - to.add("{ storage_filePdf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_geochats_messagesSlice: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_messagesSlice"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; - case mtpc_storage_fileMp3: - to.add("{ storage_fileMp3 }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_messages_dhConfigNotModified: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_dhConfigNotModified"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" random: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; - case mtpc_storage_fileMov: - to.add("{ storage_fileMov }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_messages_dhConfig: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_dhConfig"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" g: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" p: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" random: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; - case mtpc_storage_filePartial: - to.add("{ storage_filePartial }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_contacts_found: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_found"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" results: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; - case mtpc_storage_fileMp4: - to.add("{ storage_fileMp4 }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_msgs_ack: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ msgs_ack"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; - case mtpc_storage_fileWebp: - to.add("{ storage_fileWebp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + case mtpc_config: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ config"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" test_mode: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" this_dc: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" dc_options: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" chat_size_max: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" broadcast_size_max: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_help_support: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ help_support"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_msgs_state_info: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ msgs_state_info"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" req_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" info: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_updates_state: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updates_state"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" qts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" unread_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } break; case mtpc_messageEmpty: @@ -1468,46 +3020,113 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_msg_resend_req: + case mtpc_contactStatus: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ msg_resend_req"); + to.add("{ contactStatus"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" status: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_msg_detailed_info: + case mtpc_storage_fileUnknown: + to.add("{ storage_fileUnknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_fileJpeg: + to.add("{ storage_fileJpeg }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_fileGif: + to.add("{ storage_fileGif }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_filePng: + to.add("{ storage_filePng }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_filePdf: + to.add("{ storage_filePdf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_fileMp3: + to.add("{ storage_fileMp3 }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_fileMov: + to.add("{ storage_fileMov }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_filePartial: + to.add("{ storage_filePartial }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_fileMp4: + to.add("{ storage_fileMp4 }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_storage_fileWebp: + to.add("{ storage_fileWebp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputMessagesFilterEmpty: + to.add("{ inputMessagesFilterEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputMessagesFilterPhotos: + to.add("{ inputMessagesFilterPhotos }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputMessagesFilterVideo: + to.add("{ inputMessagesFilterVideo }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputMessagesFilterPhotoVideo: + to.add("{ inputMessagesFilterPhotoVideo }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputMessagesFilterDocument: + to.add("{ inputMessagesFilterDocument }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputMessagesFilterAudio: + to.add("{ inputMessagesFilterAudio }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_documentEmpty: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ msg_detailed_info"); + to.add("{ documentEmpty"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" answer_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" status: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_msg_new_detailed_info: + case mtpc_document: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ msg_new_detailed_info"); + to.add("{ document"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" answer_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" status: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" mime_type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" thumb: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 7: to.add(" attributes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -1610,741 +3229,6 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_documentEmpty: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ documentEmpty"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_document: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ document"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" mime_type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" thumb: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 7: to.add(" attributes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputFile: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputFile"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" md5_checksum: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputFileBig: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputFileBig"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputChatPhotoEmpty: - to.add("{ inputChatPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputChatUploadedPhoto: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputChatUploadedPhoto"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputChatPhoto: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputChatPhoto"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_msgs_state_req: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ msgs_state_req"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_userStatusEmpty: - to.add("{ userStatusEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_userStatusOnline: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ userStatusOnline"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" expires: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_userStatusOffline: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ userStatusOffline"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" was_online: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_userStatusRecently: - to.add("{ userStatusRecently }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_userStatusLastWeek: - to.add("{ userStatusLastWeek }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_userStatusLastMonth: - to.add("{ userStatusLastMonth }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_notifyPeer: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ notifyPeer"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_notifyUsers: - to.add("{ notifyUsers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_notifyChats: - to.add("{ notifyChats }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_notifyAll: - to.add("{ notifyAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_bad_msg_notification: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ bad_msg_notification"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" bad_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" bad_msg_seqno: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" error_code: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_bad_server_salt: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ bad_server_salt"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" bad_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" bad_msg_seqno: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" error_code: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" new_server_salt: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_dh_gen_ok: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ dh_gen_ok"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" new_nonce_hash1: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_dh_gen_retry: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ dh_gen_retry"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" new_nonce_hash2: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_dh_gen_fail: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ dh_gen_fail"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" new_nonce_hash3: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputPeerNotifyEventsEmpty: - to.add("{ inputPeerNotifyEventsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputPeerNotifyEventsAll: - to.add("{ inputPeerNotifyEventsAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputUserEmpty: - to.add("{ inputUserEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputUserSelf: - to.add("{ inputUserSelf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputUserContact: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputUserContact"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputUserForeign: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputUserForeign"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputPeerEmpty: - to.add("{ inputPeerEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputPeerSelf: - to.add("{ inputPeerSelf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputPeerContact: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputPeerContact"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputPeerForeign: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputPeerForeign"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputPeerChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputPeerChat"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_chats: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_chats"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_account_privacyRules: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_privacyRules"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" rules: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_destroy_session_ok: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ destroy_session_ok"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" session_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_destroy_session_none: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ destroy_session_none"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" session_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_userFull: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ userFull"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" profile_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" blocked: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" real_first_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" real_last_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_help_support: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ help_support"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contacts_found: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_found"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" results: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contactBlocked: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contactBlocked"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_msgs_ack: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ msgs_ack"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_fileLocationUnavailable: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ fileLocationUnavailable"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" volume_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" local_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_fileLocation: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ fileLocation"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" volume_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" local_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputPeerNotifySettings: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputPeerNotifySettings"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" mute_until: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" sound: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" show_previews: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" events_mask: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputGeoChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputGeoChat"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputEncryptedFileEmpty: - to.add("{ inputEncryptedFileEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputEncryptedFileUploaded: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputEncryptedFileUploaded"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" md5_checksum: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputEncryptedFile: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputEncryptedFile"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputEncryptedFileBigUploaded: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputEncryptedFileBigUploaded"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_peerNotifySettingsEmpty: - to.add("{ peerNotifySettingsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_peerNotifySettings: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ peerNotifySettings"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" mute_until: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" sound: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" show_previews: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" events_mask: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contacts_link: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_link"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" my_link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" foreign_link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_sentMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sentMessage"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_sentMessageLink: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sentMessageLink"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputDocumentEmpty: - to.add("{ inputDocumentEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputDocument: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputDocument"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_chatLocated: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ chatLocated"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" distance: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputNotifyPeer: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputNotifyPeer"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputNotifyUsers: - to.add("{ inputNotifyUsers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputNotifyChats: - to.add("{ inputNotifyChats }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputNotifyAll: - to.add("{ inputNotifyAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputNotifyGeoChatPeer: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputNotifyGeoChatPeer"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_client_DH_inner_data: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ client_DH_inner_data"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" retry_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" g_b: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - case mtpc_inputMediaEmpty: to.add("{ inputMediaEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; @@ -2523,139 +3407,378 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_msgs_state_info: + case mtpc_encryptedFileEmpty: + to.add("{ encryptedFileEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_encryptedFile: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ msgs_state_info"); + to.add("{ encryptedFile"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" req_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" info: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_chatParticipantsForbidden: + case mtpc_photoEmpty: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ chatParticipantsForbidden"); + to.add("{ photoEmpty"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_chatParticipants: + case mtpc_photo: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ chatParticipants"); + to.add("{ photo"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" admin_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" participants: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" geo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" sizes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_contactStatus: + case mtpc_messages_sentEncryptedMessage: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contactStatus"); + to.add("{ messages_sentEncryptedMessage"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" status: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_rpc_answer_unknown: - to.add("{ rpc_answer_unknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_rpc_answer_dropped_running: - to.add("{ rpc_answer_dropped_running }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_rpc_answer_dropped: + case mtpc_messages_sentEncryptedFile: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ rpc_answer_dropped"); + to.add("{ messages_sentEncryptedFile"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" seq_no: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_msgs_all_info: + case mtpc_chatPhotoEmpty: + to.add("{ chatPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_chatPhoto: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ msgs_all_info"); + to.add("{ chatPhoto"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; - case 1: to.add(" info: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" photo_small: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" photo_big: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_contactSuggested: + case mtpc_privacyValueAllowContacts: + to.add("{ privacyValueAllowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_privacyValueAllowAll: + to.add("{ privacyValueAllowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_privacyValueAllowUsers: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contactSuggested"); + to.add("{ privacyValueAllowUsers"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" mutual_contacts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" users: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_http_wait: + case mtpc_privacyValueDisallowContacts: + to.add("{ privacyValueDisallowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_privacyValueDisallowAll: + to.add("{ privacyValueDisallowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_privacyValueDisallowUsers: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ http_wait"); + to.add("{ privacyValueDisallowUsers"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" max_delay: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" wait_after: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" max_wait: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" users: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_auth_exportedAuthorization: + case mtpc_contacts_myLinkEmpty: + to.add("{ contacts_myLinkEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_contacts_myLinkRequested: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ auth_exportedAuthorization"); + to.add("{ contacts_myLinkRequested"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" contact: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_myLinkContact: + to.add("{ contacts_myLinkContact }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_messages_dialogs: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_dialogs"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" dialogs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_dialogsSlice: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_dialogsSlice"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" dialogs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_located: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_located"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" results: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputAppEvent: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputAppEvent"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" time: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" peer: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" data: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputFile: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputFile"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" md5_checksum: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputFileBig: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputFileBig"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_sentMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_sentMessage"); to.add("\n").addSpaces(lev); } switch (stage) { case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_sentMessageLink: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_sentMessageLink"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_userFull: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ userFull"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" profile_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" blocked: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" real_first_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" real_last_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_encryptedMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ encryptedMessage"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_encryptedMessageService: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ encryptedMessageService"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_statedMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_statedMessage"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_inputPhotoEmpty: + to.add("{ inputPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_inputPhoto: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputPhoto"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -2691,356 +3814,15 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_inputPrivacyKeyStatusTimestamp: - to.add("{ inputPrivacyKeyStatusTimestamp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_contacts_blocked: + case mtpc_help_inviteText: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_blocked"); + to.add("{ help_inviteText"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" blocked: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contacts_blockedSlice: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_blockedSlice"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" blocked: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputPrivacyValueAllowContacts: - to.add("{ inputPrivacyValueAllowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputPrivacyValueAllowAll: - to.add("{ inputPrivacyValueAllowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputPrivacyValueAllowUsers: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputPrivacyValueAllowUsers"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputPrivacyValueDisallowContacts: - to.add("{ inputPrivacyValueDisallowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputPrivacyValueDisallowAll: - to.add("{ inputPrivacyValueDisallowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputPrivacyValueDisallowUsers: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputPrivacyValueDisallowUsers"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contact: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contact"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" mutual: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_peerNotifyEventsEmpty: - to.add("{ peerNotifyEventsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_peerNotifyEventsAll: - to.add("{ peerNotifyEventsAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_messages_statedMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_statedMessage"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_statedMessageLink: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_statedMessageLink"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_dcOption: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ dcOption"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" hostname: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" ip_address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" port: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_account_sentChangePhoneCode: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_sentChangePhoneCode"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" send_call_timeout: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_importedContact: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ importedContact"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" client_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_chatEmpty: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ chatEmpty"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_chat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ chat"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" participants_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" left: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_chatForbidden: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ chatForbidden"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geoChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geoChat"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" venue: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" geo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 7: to.add(" participants_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 8: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 9: to.add(" checked_in: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 10: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_future_salts: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ future_salts"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" req_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" now: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" salts: "); ++stages.back(); types.push_back(mtpc_vector); vtypes.push_back(mtpc_future_salt); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_new_session_created: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ new_session_created"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" first_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" unique_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" server_salt: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_auth_sentCode: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_sentCode"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_registered: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" send_call_timeout: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" is_password: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_auth_sentAppCode: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_sentAppCode"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_registered: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" send_call_timeout: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" is_password: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_auth_authorization: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_authorization"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" expires: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_wallPaper: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ wallPaper"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" sizes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_wallPaperSolid: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ wallPaperSolid"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" bg_color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -3153,472 +3935,56 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_geoChatMessageEmpty: + case mtpc_updates_differenceEmpty: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geoChatMessageEmpty"); + to.add("{ updates_differenceEmpty"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_geoChatMessage: + case mtpc_updates_difference: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geoChatMessage"); + to.add("{ updates_difference"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" from_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geoChatMessageService: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geoChatMessageService"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" from_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" action: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_encryptedFileEmpty: - to.add("{ encryptedFileEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_encryptedFile: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ encryptedFile"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contactFound: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contactFound"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contacts_myLinkEmpty: - to.add("{ contacts_myLinkEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_contacts_myLinkRequested: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_myLinkRequested"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" contact: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_contacts_myLinkContact: - to.add("{ contacts_myLinkContact }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_messages_statedMessages: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_statedMessages"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_statedMessagesLinks: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_statedMessagesLinks"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_dialogs: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_dialogs"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" dialogs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_dialogsSlice: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_dialogsSlice"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" dialogs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" new_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" new_encrypted_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" other_updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" state: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_inputEncryptedChat: + case mtpc_updates_differenceSlice: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ inputEncryptedChat"); + to.add("{ updates_differenceSlice"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" new_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" new_encrypted_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" other_updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" intermediate_state: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_contacts_contactsNotModified: - to.add("{ contacts_contactsNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_contacts_contacts: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_contacts"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" contacts: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_userProfilePhotoEmpty: - to.add("{ userProfilePhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_userProfilePhoto: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ userProfilePhoto"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" photo_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" photo_small: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" photo_big: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_help_inviteText: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ help_inviteText"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_future_salt: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ future_salt"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" valid_since: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" valid_until: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" salt: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_encryptedMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ encryptedMessage"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_encryptedMessageService: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ encryptedMessageService"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_chat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_chat"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" chat: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geochats_messages: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_messages"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geochats_messagesSlice: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_messagesSlice"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_audioEmpty: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ audioEmpty"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_audio: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ audio"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" duration: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" mime_type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 7: to.add(" dc_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputAppEvent: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputAppEvent"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" time: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" peer: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" data: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_inputPhotoEmpty: - to.add("{ inputPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_inputPhoto: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputPhoto"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_server_DH_params_fail: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ server_DH_params_fail"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" new_nonce_hash: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_server_DH_params_ok: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ server_DH_params_ok"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" encrypted_answer: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_sendMessageTypingAction: - to.add("{ sendMessageTypingAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageCancelAction: - to.add("{ sendMessageCancelAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageRecordVideoAction: - to.add("{ sendMessageRecordVideoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageUploadVideoAction: - to.add("{ sendMessageUploadVideoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageRecordAudioAction: - to.add("{ sendMessageRecordAudioAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageUploadAudioAction: - to.add("{ sendMessageUploadAudioAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageUploadPhotoAction: - to.add("{ sendMessageUploadPhotoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageUploadDocumentAction: - to.add("{ sendMessageUploadDocumentAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageGeoLocationAction: - to.add("{ sendMessageGeoLocationAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_sendMessageChooseContactAction: - to.add("{ sendMessageChooseContactAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - case mtpc_pong: if (stage) { to.add(",\n").addSpaces(lev); @@ -3633,374 +3999,92 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_affectedHistory: + case mtpc_invokeAfterMsg: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_affectedHistory"); + to.add("{ invokeAfterMsg"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_photoEmpty: + case mtpc_invokeAfterMsgs: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ photoEmpty"); + to.add("{ invokeAfterMsgs"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; + case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_photo: + case mtpc_initConnection: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ photo"); + to.add("{ initConnection"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" access_hash: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" geo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" sizes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" api_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" device_model: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" system_version: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" app_version: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" lang_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_nearestDc: + case mtpc_users_getUsers: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ nearestDc"); + to.add("{ users_getUsers"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" country: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" this_dc: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" nearest_dc: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_photoSizeEmpty: + case mtpc_account_getPrivacy: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ photoSizeEmpty"); + to.add("{ account_getPrivacy"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" key: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_photoSize: + case mtpc_account_setPrivacy: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ photoSize"); + to.add("{ account_setPrivacy"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" key: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" rules: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_photoCachedSize: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ photoCachedSize"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_chatParticipant: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ chatParticipant"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" inviter_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updates_state: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updates_state"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" qts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" unread_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_photos_photos: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ photos_photos"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" photos: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_photos_photosSlice: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ photos_photosSlice"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" photos: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_chatFull: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_chatFull"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" full_chat: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_dialog: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ dialog"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" top_message: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" unread_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_privacyValueAllowContacts: - to.add("{ privacyValueAllowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_privacyValueAllowAll: - to.add("{ privacyValueAllowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_privacyValueAllowUsers: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ privacyValueAllowUsers"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" users: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_privacyValueDisallowContacts: - to.add("{ privacyValueDisallowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_privacyValueDisallowAll: - to.add("{ privacyValueDisallowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_privacyValueDisallowUsers: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ privacyValueDisallowUsers"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" users: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updatesTooLong: - to.add("{ updatesTooLong }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_updateShortMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updateShortMessage"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" from_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updateShortChatMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updateShortChatMessage"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" from_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updateShort: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updateShort"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" update: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updatesCombined: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updatesCombined"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" seq_start: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updates: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ updates"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_getDhConfig: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_getDhConfig"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" random_length: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_account_getAccountTTL: - to.add("{ account_getAccountTTL }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_contacts_getSuggested: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_getSuggested"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_help_getConfig: - to.add("{ help_getConfig }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - case mtpc_messages_requestEncryption: if (stage) { to.add(",\n").addSpaces(lev); @@ -4031,42 +4115,60 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_rpc_drop_answer: + case mtpc_contacts_getContacts: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ rpc_drop_answer"); + to.add("{ contacts_getContacts"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" req_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_contacts_importContacts: + case mtpc_contacts_search: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_importContacts"); + to.add("{ contacts_search"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" contacts: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" replace: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_contacts_deleteContact: + case mtpc_upload_getFile: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_deleteContact"); + to.add("{ upload_getFile"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_photos_uploadProfilePhoto: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photos_uploadProfilePhoto"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" geo_point: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -4088,21 +4190,6 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_sendMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sendMessage"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - case mtpc_auth_exportAuthorization: if (stage) { to.add(",\n").addSpaces(lev); @@ -4116,11 +4203,77 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_getMessages: + case mtpc_contacts_importContacts: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_getMessages"); + to.add("{ contacts_importContacts"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" contacts: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" replace: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_rpc_drop_answer: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ rpc_drop_answer"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" req_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_auth_checkPhone: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_checkPhone"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_getAllStickers: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_getAllStickers"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_getSuggested: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_getSuggested"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_getChats: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_getChats"); to.add("\n").addSpaces(lev); } switch (stage) { @@ -4129,38 +4282,31 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_getHistory: + case mtpc_messages_forwardMessages: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_getHistory"); + to.add("{ messages_forwardMessages"); to.add("\n").addSpaces(lev); } switch (stage) { case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_messages_search: + case mtpc_messages_sendBroadcast: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_search"); + to.add("{ messages_sendBroadcast"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" filter: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" min_date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" max_date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 7: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" contacts: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -4179,39 +4325,24 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_req_pq: + case mtpc_messages_getFullChat: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ req_pq"); + to.add("{ messages_getFullChat"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_updates_getDifference: + case mtpc_geochats_getFullChat: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ updates_getDifference"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" qts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_account_getNotifySettings: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_getNotifySettings"); + to.add("{ geochats_getFullChat"); to.add("\n").addSpaces(lev); } switch (stage) { @@ -4321,155 +4452,81 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_contacts_getStatuses: - to.add("{ contacts_getStatuses }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_photos_uploadProfilePhoto: + case mtpc_geochats_getRecents: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ photos_uploadProfilePhoto"); + to.add("{ geochats_getRecents"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" geo_point: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_messages_readHistory: + case mtpc_geochats_search: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_readHistory"); + to.add("{ geochats_search"); to.add("\n").addSpaces(lev); } switch (stage) { case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" read_contents: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" filter: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" min_date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" max_date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 7: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_messages_deleteHistory: + case mtpc_geochats_getHistory: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_deleteHistory"); + to.add("{ geochats_getHistory"); to.add("\n").addSpaces(lev); } switch (stage) { case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_help_getAppUpdate: + case mtpc_messages_getDhConfig: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ help_getAppUpdate"); + to.add("{ messages_getDhConfig"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" device_model: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" system_version: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" app_version: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" lang_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" random_length: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_geochats_getLocated: + case mtpc_set_client_DH_params: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_getLocated"); + to.add("{ set_client_DH_params"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" geo_point: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" radius: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_get_future_salts: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ get_future_salts"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" num: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_auth_checkPhone: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_checkPhone"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_auth_signUp: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_signUp"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" phone_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" first_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" last_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_auth_signIn: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_signIn"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" phone_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_auth_importAuthorization: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_importAuthorization"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" encrypted_data: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -4500,146 +4557,30 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_account_updateProfile: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_updateProfile"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" first_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" last_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } + case mtpc_help_getConfig: + to.add("{ help_getConfig }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - case mtpc_contacts_importCard: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_importCard"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" export_card: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } + case mtpc_help_getSupport: + to.add("{ help_getSupport }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - case mtpc_account_updateUsername: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_updateUsername"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" username: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } + case mtpc_updates_getState: + to.add("{ updates_getState }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - case mtpc_contacts_resolveUsername: + case mtpc_help_getAppUpdate: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_resolveUsername"); + to.add("{ help_getAppUpdate"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" username: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_account_changePhone: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_changePhone"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" phone_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_sendEncrypted: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sendEncrypted"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" data: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_sendEncryptedFile: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sendEncryptedFile"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" data: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_sendEncryptedService: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sendEncryptedService"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" data: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_upload_getFile: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ upload_getFile"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_getDialogs: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_getDialogs"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" device_model: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" system_version: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" app_version: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" lang_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -4700,103 +4641,29 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_contacts_getContacts: + case mtpc_contacts_deleteContact: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_getContacts"); + to.add("{ contacts_deleteContact"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_geochats_checkin: + case mtpc_photos_updateProfilePhoto: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_checkin"); + to.add("{ photos_updateProfilePhoto"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geochats_editChatTitle: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_editChatTitle"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geochats_editChatPhoto: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_editChatPhoto"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geochats_sendMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_sendMessage"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geochats_sendMedia: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_sendMedia"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geochats_createGeoChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_createGeoChat"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" geo_point: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" venue: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -4817,20 +4684,23 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_photos_updateProfilePhoto: + case mtpc_users_getFullUser: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ photos_updateProfilePhoto"); + to.add("{ users_getFullUser"); to.add("\n").addSpaces(lev); } switch (stage) { case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; + case mtpc_help_getNearestDc: + to.add("{ help_getNearestDc }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + case mtpc_help_getInviteText: if (stage) { to.add(",\n").addSpaces(lev); @@ -4844,134 +4714,74 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_help_getNearestDc: - to.add("{ help_getNearestDc }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_geochats_getRecents: + case mtpc_get_future_salts: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_getRecents"); + to.add("{ get_future_salts"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" num: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_geochats_search: + case mtpc_messages_sendEncrypted: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_search"); + to.add("{ messages_sendEncrypted"); to.add("\n").addSpaces(lev); } switch (stage) { case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" filter: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" min_date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" max_date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 6: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 7: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" data: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_geochats_getHistory: + case mtpc_messages_sendEncryptedFile: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_getHistory"); + to.add("{ messages_sendEncryptedFile"); to.add("\n").addSpaces(lev); } switch (stage) { case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" data: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_set_client_DH_params: + case mtpc_messages_sendEncryptedService: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ set_client_DH_params"); + to.add("{ messages_sendEncryptedService"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" server_nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" encrypted_data: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" data: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_invokeAfterMsg: + case mtpc_account_sendChangePhoneCode: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ invokeAfterMsg"); + to.add("{ account_sendChangePhoneCode"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_invokeAfterMsgs: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ invokeAfterMsgs"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" msg_ids: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); break; - case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_initConnection: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ initConnection"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" api_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" device_model: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" system_version: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 3: to.add(" app_version: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 4: to.add(" lang_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 5: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_account_getWallPapers: - to.add("{ account_getWallPapers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_users_getFullUser: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ users_getFullUser"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; @@ -4994,33 +4804,6 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_account_getPrivacy: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_getPrivacy"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" key: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_account_setPrivacy: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_setPrivacy"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" key: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" rules: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - case mtpc_destroy_session: if (stage) { to.add(",\n").addSpaces(lev); @@ -5034,134 +4817,23 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_getChats: + case mtpc_messages_getDialogs: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_getChats"); + to.add("{ messages_getDialogs"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; + case 0: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; - case mtpc_help_getSupport: - to.add("{ help_getSupport }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_contacts_search: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_search"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_ping: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ ping"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" ping_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_ping_delay_disconnect: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ ping_delay_disconnect"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" ping_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" disconnect_delay: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_account_sendChangePhoneCode: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_sendChangePhoneCode"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_forwardMessages: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_forwardMessages"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_messages_sendBroadcast: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sendBroadcast"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" contacts: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; - case 1: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; - case 2: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_updates_getState: - to.add("{ updates_getState }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); - break; - - case mtpc_messages_getFullChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_getFullChat"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } - break; - - case mtpc_geochats_getFullChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_getFullChat"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; - } + case mtpc_account_getAccountTTL: + to.add("{ account_getAccountTTL }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; case mtpc_register_saveDeveloperInfo: @@ -5502,15 +5174,389 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_users_getUsers: + case mtpc_account_getNotifySettings: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ users_getUsers"); + to.add("{ account_getNotifySettings"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); break; + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_getLocated: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_getLocated"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" geo_point: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" radius: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_getStatuses: + to.add("{ contacts_getStatuses }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_messages_sendMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_sendMessage"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_auth_signUp: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_signUp"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" phone_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" first_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" last_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_auth_signIn: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_signIn"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" phone_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_auth_importAuthorization: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_importAuthorization"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_readHistory: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_readHistory"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" read_contents: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_deleteHistory: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_deleteHistory"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_req_pq: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ req_pq"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_checkin: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_checkin"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_editChatTitle: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_editChatTitle"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_editChatPhoto: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_editChatPhoto"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_sendMessage: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_sendMessage"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_sendMedia: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_sendMedia"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_geochats_createGeoChat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_createGeoChat"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" geo_point: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" venue: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_getMessages: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_getMessages"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_getHistory: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_getHistory"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_messages_search: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_search"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" filter: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); break; + case 3: to.add(" min_date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 4: to.add(" max_date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 5: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 6: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 7: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_account_getWallPapers: + to.add("{ account_getWallPapers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); + break; + + case mtpc_account_updateProfile: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_updateProfile"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" first_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" last_name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_importCard: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_importCard"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" export_card: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_account_updateUsername: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_updateUsername"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" username: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_contacts_resolveUsername: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_resolveUsername"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" username: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_account_changePhone: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_changePhone"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" phone_number: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" phone_code_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" phone_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_updates_getDifference: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ updates_getDifference"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + case 2: to.add(" qts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_ping: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ ping"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" ping_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; + } + break; + + case mtpc_ping_delay_disconnect: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ ping_delay_disconnect"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" ping_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); break; + case 1: to.add(" disconnect_delay: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); break; } break; diff --git a/Telegram/SourceFiles/mtproto/mtpScheme.h b/Telegram/SourceFiles/mtproto/mtpScheme.h index 4ccd815c2..d477e8686 100644 --- a/Telegram/SourceFiles/mtproto/mtpScheme.h +++ b/Telegram/SourceFiles/mtproto/mtpScheme.h @@ -357,6 +357,9 @@ enum { mtpc_documentAttributeVideo = 0x5910cccb, mtpc_documentAttributeAudio = 0x51448e5, mtpc_documentAttributeFilename = 0x15590068, + mtpc_stickerPack = 0x12b299d4, + mtpc_messages_allStickersNotModified = 0xe86602c3, + mtpc_messages_allStickers = 0xdcef3102, mtpc_invokeAfterMsg = 0xcb9f372d, mtpc_invokeAfterMsgs = 0x3dc4b4f0, mtpc_auth_checkPhone = 0x6fe51dfb, @@ -463,7 +466,8 @@ enum { mtpc_account_setAccountTTL = 0x2442485e, mtpc_contacts_resolveUsername = 0xbf0131c, mtpc_account_sendChangePhoneCode = 0xa407a8f4, - mtpc_account_changePhone = 0x70c32edb + mtpc_account_changePhone = 0x70c32edb, + mtpc_messages_getAllStickers = 0xaa3bc868 }; // Type forward declarations @@ -962,6 +966,12 @@ class MTPDdocumentAttributeVideo; class MTPDdocumentAttributeAudio; class MTPDdocumentAttributeFilename; +class MTPstickerPack; +class MTPDstickerPack; + +class MTPmessages_allStickers; +class MTPDmessages_allStickers; + // Boxed types definitions typedef MTPBoxed MTPResPQ; @@ -1092,6 +1102,8 @@ typedef MTPBoxed MTPaccount_PrivacyRules; typedef MTPBoxed MTPAccountDaysTTL; typedef MTPBoxed MTPaccount_SentChangePhoneCode; typedef MTPBoxed MTPDocumentAttribute; +typedef MTPBoxed MTPStickerPack; +typedef MTPBoxed MTPmessages_AllStickers; // Type classes definitions @@ -7133,6 +7145,75 @@ private: }; typedef MTPBoxed MTPDocumentAttribute; +class MTPstickerPack : private mtpDataOwner { +public: + MTPstickerPack(); + MTPstickerPack(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_stickerPack) : mtpDataOwner(0) { + read(from, end, cons); + } + + MTPDstickerPack &_stickerPack() { + if (!data) throw mtpErrorUninitialized(); + split(); + return *(MTPDstickerPack*)data; + } + const MTPDstickerPack &c_stickerPack() const { + if (!data) throw mtpErrorUninitialized(); + return *(const MTPDstickerPack*)data; + } + + uint32 innerLength() const; + mtpTypeId type() const; + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_stickerPack); + void write(mtpBuffer &to) const; + + typedef void ResponseType; + +private: + explicit MTPstickerPack(MTPDstickerPack *_data); + + friend MTPstickerPack MTP_stickerPack(const MTPstring &_emoticon, const MTPVector &_documents); +}; +typedef MTPBoxed MTPStickerPack; + +class MTPmessages_allStickers : private mtpDataOwner { +public: + MTPmessages_allStickers() : mtpDataOwner(0), _type(0) { + } + MTPmessages_allStickers(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) : mtpDataOwner(0), _type(0) { + read(from, end, cons); + } + + MTPDmessages_allStickers &_messages_allStickers() { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_messages_allStickers) throw mtpErrorWrongTypeId(_type, mtpc_messages_allStickers); + split(); + return *(MTPDmessages_allStickers*)data; + } + const MTPDmessages_allStickers &c_messages_allStickers() const { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_messages_allStickers) throw mtpErrorWrongTypeId(_type, mtpc_messages_allStickers); + return *(const MTPDmessages_allStickers*)data; + } + + uint32 innerLength() const; + mtpTypeId type() const; + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons); + void write(mtpBuffer &to) const; + + typedef void ResponseType; + +private: + explicit MTPmessages_allStickers(mtpTypeId type); + explicit MTPmessages_allStickers(MTPDmessages_allStickers *_data); + + friend MTPmessages_allStickers MTP_messages_allStickersNotModified(); + friend MTPmessages_allStickers MTP_messages_allStickers(const MTPstring &_hash, const MTPVector &_packs, const MTPVector &_documents); + + mtpTypeId _type; +}; +typedef MTPBoxed MTPmessages_AllStickers; + // Type constructors with data class MTPDresPQ : public mtpDataImpl { @@ -9997,6 +10078,29 @@ public: MTPstring vfile_name; }; +class MTPDstickerPack : public mtpDataImpl { +public: + MTPDstickerPack() { + } + MTPDstickerPack(const MTPstring &_emoticon, const MTPVector &_documents) : vemoticon(_emoticon), vdocuments(_documents) { + } + + MTPstring vemoticon; + MTPVector vdocuments; +}; + +class MTPDmessages_allStickers : public mtpDataImpl { +public: + MTPDmessages_allStickers() { + } + MTPDmessages_allStickers(const MTPstring &_hash, const MTPVector &_packs, const MTPVector &_documents) : vhash(_hash), vpacks(_packs), vdocuments(_documents) { + } + + MTPstring vhash; + MTPVector vpacks; + MTPVector vdocuments; +}; + // RPC methods class MTPreq_pq { // RPC method 'req_pq' @@ -14855,6 +14959,45 @@ public: } }; +class MTPmessages_getAllStickers { // RPC method 'messages.getAllStickers' +public: + MTPstring vhash; + + MTPmessages_getAllStickers() { + } + MTPmessages_getAllStickers(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_getAllStickers) { + read(from, end, cons); + } + MTPmessages_getAllStickers(const MTPstring &_hash) : vhash(_hash) { + } + + uint32 innerLength() const { + return vhash.innerLength(); + } + mtpTypeId type() const { + return mtpc_messages_getAllStickers; + } + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_messages_getAllStickers) { + vhash.read(from, end); + } + void write(mtpBuffer &to) const { + vhash.write(to); + } + + typedef MTPmessages_AllStickers ResponseType; +}; +class MTPmessages_GetAllStickers : public MTPBoxed { +public: + MTPmessages_GetAllStickers() { + } + MTPmessages_GetAllStickers(const MTPmessages_getAllStickers &v) : MTPBoxed(v) { + } + MTPmessages_GetAllStickers(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = 0) : MTPBoxed(from, end, cons) { + } + MTPmessages_GetAllStickers(const MTPstring &_hash) : MTPBoxed(MTPmessages_getAllStickers(_hash)) { + } +}; + // Inline methods definition inline MTPresPQ::MTPresPQ() : mtpDataOwner(new MTPDresPQ()) { @@ -22980,6 +23123,88 @@ inline MTPdocumentAttribute MTP_documentAttributeFilename(const MTPstring &_file return MTPdocumentAttribute(new MTPDdocumentAttributeFilename(_file_name)); } +inline MTPstickerPack::MTPstickerPack() : mtpDataOwner(new MTPDstickerPack()) { +} + +inline uint32 MTPstickerPack::innerLength() const { + const MTPDstickerPack &v(c_stickerPack()); + return v.vemoticon.innerLength() + v.vdocuments.innerLength(); +} +inline mtpTypeId MTPstickerPack::type() const { + return mtpc_stickerPack; +} +inline void MTPstickerPack::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) { + if (cons != mtpc_stickerPack) throw mtpErrorUnexpected(cons, "MTPstickerPack"); + + if (!data) setData(new MTPDstickerPack()); + MTPDstickerPack &v(_stickerPack()); + v.vemoticon.read(from, end); + v.vdocuments.read(from, end); +} +inline void MTPstickerPack::write(mtpBuffer &to) const { + const MTPDstickerPack &v(c_stickerPack()); + v.vemoticon.write(to); + v.vdocuments.write(to); +} +inline MTPstickerPack::MTPstickerPack(MTPDstickerPack *_data) : mtpDataOwner(_data) { +} +inline MTPstickerPack MTP_stickerPack(const MTPstring &_emoticon, const MTPVector &_documents) { + return MTPstickerPack(new MTPDstickerPack(_emoticon, _documents)); +} + +inline uint32 MTPmessages_allStickers::innerLength() const { + switch (_type) { + case mtpc_messages_allStickers: { + const MTPDmessages_allStickers &v(c_messages_allStickers()); + return v.vhash.innerLength() + v.vpacks.innerLength() + v.vdocuments.innerLength(); + } + } + return 0; +} +inline mtpTypeId MTPmessages_allStickers::type() const { + if (!_type) throw mtpErrorUninitialized(); + return _type; +} +inline void MTPmessages_allStickers::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) { + if (cons != _type) setData(0); + switch (cons) { + case mtpc_messages_allStickersNotModified: _type = cons; break; + case mtpc_messages_allStickers: _type = cons; { + if (!data) setData(new MTPDmessages_allStickers()); + MTPDmessages_allStickers &v(_messages_allStickers()); + v.vhash.read(from, end); + v.vpacks.read(from, end); + v.vdocuments.read(from, end); + } break; + default: throw mtpErrorUnexpected(cons, "MTPmessages_allStickers"); + } +} +inline void MTPmessages_allStickers::write(mtpBuffer &to) const { + switch (_type) { + case mtpc_messages_allStickers: { + const MTPDmessages_allStickers &v(c_messages_allStickers()); + v.vhash.write(to); + v.vpacks.write(to); + v.vdocuments.write(to); + } break; + } +} +inline MTPmessages_allStickers::MTPmessages_allStickers(mtpTypeId type) : mtpDataOwner(0), _type(type) { + switch (type) { + case mtpc_messages_allStickersNotModified: break; + case mtpc_messages_allStickers: setData(new MTPDmessages_allStickers()); break; + default: throw mtpErrorBadTypeId(type, "MTPmessages_allStickers"); + } +} +inline MTPmessages_allStickers::MTPmessages_allStickers(MTPDmessages_allStickers *_data) : mtpDataOwner(_data), _type(mtpc_messages_allStickers) { +} +inline MTPmessages_allStickers MTP_messages_allStickersNotModified() { + return MTPmessages_allStickers(mtpc_messages_allStickersNotModified); +} +inline MTPmessages_allStickers MTP_messages_allStickers(const MTPstring &_hash, const MTPVector &_packs, const MTPVector &_documents) { + return MTPmessages_allStickers(new MTPDmessages_allStickers(_hash, _packs, _documents)); +} + // Human-readable text serialization #if (defined _DEBUG || defined _WITH_DEBUG) diff --git a/Telegram/SourceFiles/mtproto/scheme.tl b/Telegram/SourceFiles/mtproto/scheme.tl index f1a41272c..c7df91fd5 100644 --- a/Telegram/SourceFiles/mtproto/scheme.tl +++ b/Telegram/SourceFiles/mtproto/scheme.tl @@ -549,6 +549,11 @@ documentAttributeVideo#5910cccb duration:int w:int h:int = DocumentAttribute; documentAttributeAudio#51448e5 duration:int = DocumentAttribute; documentAttributeFilename#15590068 file_name:string = DocumentAttribute; +stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; + +messages.allStickersNotModified#e86602c3 = messages.AllStickers; +messages.allStickers#dcef3102 hash:string packs:Vector documents:Vector = messages.AllStickers; + ---functions--- invokeAfterMsg#cb9f372d msg_id:long query:!X = X; @@ -682,3 +687,5 @@ contacts.resolveUsername#bf0131c username:string = User; account.sendChangePhoneCode#a407a8f4 phone_number:string = account.SentChangePhoneCode; account.changePhone#70c32edb phone_number:string phone_code_hash:string phone_code:string = User; + +messages.getAllStickers#aa3bc868 hash:string = messages.AllStickers; \ No newline at end of file diff --git a/Telegram/SourceFiles/overviewwidget.cpp b/Telegram/SourceFiles/overviewwidget.cpp index 29cea6a74..925076363 100644 --- a/Telegram/SourceFiles/overviewwidget.cpp +++ b/Telegram/SourceFiles/overviewwidget.cpp @@ -850,6 +850,8 @@ void OverviewInner::onUpdateSelected() { textlnkOver(lnk); App::hoveredLinkItem(lnk ? item : 0); updateMsg(App::hoveredLinkItem()); + } else { + App::mousedItem(item); } fixItemIndex(_dragItemIndex, _dragItem); @@ -1089,6 +1091,23 @@ void OverviewInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { _menu->addAction(lang(lng_context_select_msg), this, SLOT(selectMessage()))->setEnabled(true); } App::contextItem(App::hoveredLinkItem()); + } else if (App::mousedItem() && App::mousedItem()->id == _mousedItem) { + _menu = new ContextMenu(_overview); + _menu->addAction(lang(lng_context_to_msg), this, SLOT(goToMessage()))->setEnabled(true); + if (isUponSelected > 1) { + _menu->addAction(lang(lng_context_forward_selected), _overview, SLOT(onForwardSelected())); + _menu->addAction(lang(lng_context_delete_selected), _overview, SLOT(onDeleteSelected())); + _menu->addAction(lang(lng_context_clear_selection), _overview, SLOT(onClearSelected())); + } else { + if (isUponSelected != -2) { + if (dynamic_cast(App::mousedItem())) { + _menu->addAction(lang(lng_context_forward_msg), this, SLOT(forwardMessage()))->setEnabled(true); + } + _menu->addAction(lang(lng_context_delete_msg), this, SLOT(deleteMessage()))->setEnabled(true); + } + _menu->addAction(lang(lng_context_select_msg), this, SLOT(selectMessage()))->setEnabled(true); + } + App::contextItem(App::mousedItem()); } if (_menu) { _menu->deleteOnHide(); diff --git a/Telegram/SourceFiles/settings.cpp b/Telegram/SourceFiles/settings.cpp index 3137c28ad..c7e1500c6 100644 --- a/Telegram/SourceFiles/settings.cpp +++ b/Telegram/SourceFiles/settings.cpp @@ -72,6 +72,10 @@ DBIEmojiTab gEmojiTab = dbietRecent; RecentEmojiPack gRecentEmojis; RecentEmojiPreload gRecentEmojisPreload; +AllStickers gStickers; +QByteArray gStickersHash; +RecentStickerPack gRecentStickers; + int32 gLang = -2; // auto QString gLangFile; @@ -147,7 +151,7 @@ void settingsParseArgs(int argc, char *argv[]) { const RecentEmojiPack &cGetRecentEmojis() { if (cRecentEmojis().isEmpty()) { RecentEmojiPack r; - if (!cRecentEmojisPreload().isEmpty()) { + if (false && !cRecentEmojisPreload().isEmpty()) { RecentEmojiPreload p(cRecentEmojisPreload()); cSetRecentEmojisPreload(RecentEmojiPreload()); r.reserve(p.size()); diff --git a/Telegram/SourceFiles/settings.h b/Telegram/SourceFiles/settings.h index ff7c04607..4c769b8c2 100644 --- a/Telegram/SourceFiles/settings.h +++ b/Telegram/SourceFiles/settings.h @@ -145,6 +145,14 @@ DeclareSetting(RecentEmojiPreload, RecentEmojisPreload); const RecentEmojiPack &cGetRecentEmojis(); +struct DocumentData; +typedef QVector StickerPack; +typedef QMap AllStickers; +DeclareSetting(AllStickers, Stickers); +DeclareSetting(QByteArray, StickersHash); +typedef QList > RecentStickerPack; +DeclareSetting(RecentStickerPack, RecentStickers); + DeclareSetting(int32, Lang); DeclareSetting(QString, LangFile); diff --git a/Telegram/SourceFiles/settingswidget.cpp b/Telegram/SourceFiles/settingswidget.cpp index 232dcc786..7e181e153 100644 --- a/Telegram/SourceFiles/settingswidget.cpp +++ b/Telegram/SourceFiles/settingswidget.cpp @@ -160,10 +160,11 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent), _catsAndDogs(this, lang(lng_settings_cats_and_dogs), cCatsAndDogs()), // local storage - _localImagesClear(this, lang(lng_local_images_clear)), - _imagesClearingWidth(st::linkFont->m.width(lang(lng_local_images_clearing))), - _imagesClearedWidth(st::linkFont->m.width(lang(lng_local_images_cleared))), - _imagesClearFailedWidth(st::linkFont->m.width(lang(lng_local_images_clear_failed))), + _localStorageClear(this, lang(lng_local_storage_clear)), + _localStorageHeight(1), + _storageClearingWidth(st::linkFont->m.width(lang(lng_local_storage_clearing))), + _storageClearedWidth(st::linkFont->m.width(lang(lng_local_storage_cleared))), + _storageClearFailedWidth(st::linkFont->m.width(lang(lng_local_storage_clear_failed))), // advanced _connectionType(this, lng_connection_auto(lt_type, QString())), @@ -249,11 +250,11 @@ SettingsInner::SettingsInner(SettingsWidget *parent) : QWidget(parent), connect(&_catsAndDogs, SIGNAL(changed()), this, SLOT(onCatsAndDogs())); // local storage - connect(&_localImagesClear, SIGNAL(clicked()), this, SLOT(onLocalImagesClear())); - switch (App::wnd()->localImagesState()) { - case Window::TempDirEmpty: _imagesClearState = TempDirEmpty; break; - case Window::TempDirExists: _imagesClearState = TempDirExists; break; - case Window::TempDirRemoving: _imagesClearState = TempDirClearing; break; + connect(&_localStorageClear, SIGNAL(clicked()), this, SLOT(onLocalStorageClear())); + switch (App::wnd()->localStorageState()) { + case Window::TempDirEmpty: _storageClearState = TempDirEmpty; break; + case Window::TempDirExists: _storageClearState = TempDirExists; break; + case Window::TempDirRemoving: _storageClearState = TempDirClearing; break; } // advanced @@ -481,27 +482,45 @@ void SettingsInner::paintEvent(QPaintEvent *e) { p.setFont(st::setHeaderFont->f); p.setPen(st::setHeaderColor->p); p.drawText(_left + st::setHeaderLeft, top + st::setHeaderTop + st::setHeaderFont->ascent, lang(lng_settings_section_cache)); - top += st::setHeaderSkip; - QString localImagesText = lang(lng_settings_no_images_cached); - int32 cnt = Local::hasImages(); - if (cnt) { - localImagesText = lng_settings_images_cached(lt_count, cnt, lt_size, formatSizeText(Local::storageFilesSize())); - } p.setFont(st::linkFont->f); p.setPen(st::black->p); - p.drawText(_left + st::setHeaderLeft, top + st::linkFont->ascent, localImagesText); QString clearText; int32 clearWidth = 0; - switch (_imagesClearState) { - case TempDirClearing: clearText = lang(lng_local_images_clearing); clearWidth = _imagesClearingWidth; break; - case TempDirCleared: clearText = lang(lng_local_images_cleared); clearWidth = _imagesClearedWidth; break; - case TempDirClearFailed: clearText = lang(lng_local_images_clear_failed); clearWidth = _imagesClearFailedWidth; break; + switch (_storageClearState) { + case TempDirClearing: clearText = lang(lng_local_storage_clearing); clearWidth = _storageClearingWidth; break; + case TempDirCleared: clearText = lang(lng_local_storage_cleared); clearWidth = _storageClearedWidth; break; + case TempDirClearFailed: clearText = lang(lng_local_storage_clear_failed); clearWidth = _storageClearFailedWidth; break; } if (clearWidth) { - p.drawText(_left + st::setWidth - clearWidth, top + st::linkFont->ascent, clearText); + p.drawText(_left + st::setWidth - clearWidth, top + st::setHeaderTop + st::setHeaderFont->ascent, clearText); } - top += _localImagesClear.height(); + + top += st::setHeaderSkip; + + int32 cntImages = Local::hasImages() + Local::hasStickers(), cntAudios = Local::hasAudios(); + if (cntImages > 0 && cntAudios > 0) { + if (_localStorageHeight != 2) { + cntAudios = 0; + QTimer::singleShot(0, this, SLOT(onUpdateLocalStorage())); + } + } else { + if (_localStorageHeight != 1) { + QTimer::singleShot(0, this, SLOT(onUpdateLocalStorage())); + } + } + if (cntImages > 0) { + QString cnt = lng_settings_images_cached(lt_count, cntImages, lt_size, formatSizeText(Local::storageImagesSize() + Local::storageStickersSize())); + p.drawText(_left + st::setHeaderLeft, top + st::linkFont->ascent, cnt); + } + if (_localStorageHeight == 2) top += _localStorageClear.height() + st::setLittleSkip; + if (cntAudios > 0) { + QString cnt = lng_settings_audios_cached(lt_count, cntAudios, lt_size, formatSizeText(Local::storageAudiosSize())); + p.drawText(_left + st::setHeaderLeft, top + st::linkFont->ascent, cnt); + } else if (cntImages <= 0) { + p.drawText(_left + st::setHeaderLeft, top + st::linkFont->ascent, lang(lng_settings_no_data_cached)); + } + top += _localStorageClear.height(); } // advanced @@ -590,8 +609,15 @@ void SettingsInner::resizeEvent(QResizeEvent *e) { _catsAndDogs.move(_left, top); top += _catsAndDogs.height(); // local storage + _localStorageClear.move(_left + st::setWidth - _localStorageClear.width(), top + st::setHeaderTop + st::setHeaderFont->ascent - st::linkFont->ascent); top += st::setHeaderSkip; - _localImagesClear.move(_left + st::setWidth - _localImagesClear.width(), top); top += _localImagesClear.height(); + if ((Local::hasImages() || Local::hasStickers()) && Local::hasAudios()) { + _localStorageHeight = 2; + top += _localStorageClear.height() + st::setLittleSkip; + } else { + _localStorageHeight = 1; + } + top += _localStorageClear.height(); } // advanced @@ -816,14 +842,13 @@ void SettingsInner::showAll() { _dontAskDownloadPath.hide(); _downloadPathEdit.hide(); _downloadPathClear.hide(); - _localImagesClear.hide(); } // local storage - if (self() && _imagesClearState == TempDirExists) { - _localImagesClear.show(); + if (self() && _storageClearState == TempDirExists) { + _localStorageClear.show(); } else { - _localImagesClear.hide(); + _localStorageClear.hide(); } // advanced @@ -935,6 +960,12 @@ void SettingsInner::onSaveTestLang() { App::quit(); } +void SettingsInner::onUpdateLocalStorage() { + resizeEvent(0); + updateSize(width()); + update(); +} + void SettingsInner::onAutoUpdate() { cSetAutoUpdate(!cAutoUpdate()); App::writeConfig(); @@ -1210,9 +1241,9 @@ void SettingsInner::onDownloadPathClearSure() { update(); } -void SettingsInner::onLocalImagesClear() { - App::wnd()->tempDirDelete(Local::ClearManagerImages); - _imagesClearState = TempDirClearing; +void SettingsInner::onLocalStorageClear() { + App::wnd()->tempDirDelete(Local::ClearManagerStorage); + _storageClearState = TempDirClearing; showAll(); update(); } @@ -1220,8 +1251,8 @@ void SettingsInner::onLocalImagesClear() { void SettingsInner::onTempDirCleared(int task) { if (task & Local::ClearManagerDownloads) { _tempDirClearState = TempDirCleared; - } else if (task & Local::ClearManagerImages) { - _imagesClearState = TempDirCleared; + } else if (task & Local::ClearManagerStorage) { + _storageClearState = TempDirCleared; } showAll(); update(); @@ -1230,8 +1261,8 @@ void SettingsInner::onTempDirCleared(int task) { void SettingsInner::onTempDirClearFailed(int task) { if (task & Local::ClearManagerDownloads) { _tempDirClearState = TempDirClearFailed; - } else if (task & Local::ClearManagerImages) { - _imagesClearState = TempDirClearFailed; + } else if (task & Local::ClearManagerStorage) { + _storageClearState = TempDirClearFailed; } showAll(); update(); diff --git a/Telegram/SourceFiles/settingswidget.h b/Telegram/SourceFiles/settingswidget.h index f81b960c9..e982a3586 100644 --- a/Telegram/SourceFiles/settingswidget.h +++ b/Telegram/SourceFiles/settingswidget.h @@ -127,7 +127,7 @@ public slots: void onCatsAndDogs(); - void onLocalImagesClear(); + void onLocalStorageClear(); void onUpdateChecking(); void onUpdateLatest(); @@ -145,6 +145,8 @@ public slots: void onChangeLanguage(); void onSaveTestLang(); + void onUpdateLocalStorage(); + private: void doneResetSessions(const MTPBool &res); @@ -222,9 +224,10 @@ private: FlatCheckbox _catsAndDogs; // local storage - LinkButton _localImagesClear; - int32 _imagesClearingWidth, _imagesClearedWidth, _imagesClearFailedWidth; - TempDirClearState _imagesClearState; + LinkButton _localStorageClear; + int32 _localStorageHeight; + int32 _storageClearingWidth, _storageClearedWidth, _storageClearFailedWidth; + TempDirClearState _storageClearState; // advanced LinkButton _connectionType, _resetSessions; diff --git a/Telegram/SourceFiles/types.h b/Telegram/SourceFiles/types.h index fc0e4884e..22a145175 100644 --- a/Telegram/SourceFiles/types.h +++ b/Telegram/SourceFiles/types.h @@ -313,12 +313,13 @@ enum DBIScale { }; enum DBIEmojiTab { - dbietRecent = -1, - dbietPeople = 0, - dbietNature = 1, - dbietObjects = 2, - dbietPlaces = 3, - dbietSymbols = 4, + dbietRecent = -1, + dbietPeople = 0, + dbietNature = 1, + dbietObjects = 2, + dbietPlaces = 3, + dbietSymbols = 4, + dbietStickers = 666, }; enum DBIPlatform { diff --git a/Telegram/SourceFiles/window.cpp b/Telegram/SourceFiles/window.cpp index 48decd342..107b906f2 100644 --- a/Telegram/SourceFiles/window.cpp +++ b/Telegram/SourceFiles/window.cpp @@ -1044,11 +1044,11 @@ Window::TempDirState Window::tempDirState() { return QDir(cTempDir()).exists() ? TempDirExists : TempDirEmpty; } -Window::TempDirState Window::localImagesState() { - if (_clearManager && _clearManager->hasTask(Local::ClearManagerImages)) { +Window::TempDirState Window::localStorageState() { + if (_clearManager && _clearManager->hasTask(Local::ClearManagerStorage)) { return TempDirRemoving; } - return Local::hasImages() ? TempDirExists : TempDirEmpty; + return (Local::hasImages() || Local::hasStickers() || Local::hasAudios()) ? TempDirExists : TempDirEmpty; } void Window::tempDirDelete(int task) { diff --git a/Telegram/SourceFiles/window.h b/Telegram/SourceFiles/window.h index d13001fde..c63011430 100644 --- a/Telegram/SourceFiles/window.h +++ b/Telegram/SourceFiles/window.h @@ -201,7 +201,7 @@ public: TempDirEmpty, }; TempDirState tempDirState(); - TempDirState localImagesState(); + TempDirState localStorageState(); void tempDirDelete(int task); void quit();