From 1f7e39e184e0df2097bd42f772c4f58343c57980 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 19 Mar 2015 12:18:19 +0300 Subject: [PATCH] version 0.7.21.dev prepared - replies, mentions --- Telegram/Resources/lang.strings | 8 +- Telegram/Resources/style.txt | 42 +- Telegram/SourceFiles/apiwrap.cpp | 181 + Telegram/SourceFiles/apiwrap.h | 64 + Telegram/SourceFiles/app.cpp | 55 +- Telegram/SourceFiles/app.h | 8 +- Telegram/SourceFiles/application.cpp | 24 +- Telegram/SourceFiles/art/sprite.png | Bin 60895 -> 61791 bytes Telegram/SourceFiles/art/sprite_200x.png | Bin 107625 -> 109112 bytes Telegram/SourceFiles/boxes/photosendbox.cpp | 9 +- Telegram/SourceFiles/boxes/photosendbox.h | 3 +- Telegram/SourceFiles/config.h | 6 +- Telegram/SourceFiles/dropdown.cpp | 344 +- Telegram/SourceFiles/dropdown.h | 103 + Telegram/SourceFiles/gui/flattextarea.cpp | 73 + Telegram/SourceFiles/gui/flattextarea.h | 3 + Telegram/SourceFiles/gui/text.cpp | 50 +- Telegram/SourceFiles/gui/text.h | 26 + Telegram/SourceFiles/gui/twidget.h | 4 +- Telegram/SourceFiles/history.cpp | 1095 ++- Telegram/SourceFiles/history.h | 167 +- Telegram/SourceFiles/historywidget.cpp | 329 +- Telegram/SourceFiles/historywidget.h | 39 +- Telegram/SourceFiles/localimageloader.cpp | 20 +- Telegram/SourceFiles/localimageloader.h | 20 +- Telegram/SourceFiles/localstorage.cpp | 28 +- Telegram/SourceFiles/localstorage.h | 10 +- Telegram/SourceFiles/logs.cpp | 2 +- Telegram/SourceFiles/mainwidget.cpp | 113 +- Telegram/SourceFiles/mainwidget.h | 26 +- Telegram/SourceFiles/mtproto/generate.py | 18 +- Telegram/SourceFiles/mtproto/mtpConnection.h | 3 + Telegram/SourceFiles/mtproto/mtpScheme.cpp | 6446 +++++++++--------- Telegram/SourceFiles/mtproto/mtpScheme.h | 82 +- Telegram/SourceFiles/mtproto/scheme.tl | 12 +- Telegram/SourceFiles/overviewwidget.cpp | 4 +- Telegram/SourceFiles/profilewidget.cpp | 7 +- Telegram/SourceFiles/window.cpp | 47 +- Telegram/SourceFiles/window.h | 7 +- Telegram/Telegram.plist | 2 +- Telegram/Telegram.rc | Bin 5540 -> 5540 bytes Telegram/Telegram.vcxproj | 27 + Telegram/Telegram.vcxproj.filters | 15 + Telegram/Telegram.xcodeproj/project.pbxproj | 12 +- Telegram/Version.sh | 2 +- 45 files changed, 5860 insertions(+), 3676 deletions(-) create mode 100644 Telegram/SourceFiles/apiwrap.cpp create mode 100644 Telegram/SourceFiles/apiwrap.h diff --git a/Telegram/Resources/lang.strings b/Telegram/Resources/lang.strings index cf5e83d43b..c360a92679 100644 --- a/Telegram/Resources/lang.strings +++ b/Telegram/Resources/lang.strings @@ -91,6 +91,7 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org "lng_server_error" = "Internal server error."; "lng_flood_error" = "Too much tries. Please try again later."; "lng_deleted" = "Unknown"; +"lng_deleted_message" = "Deleted message"; "lng_intro" = "Welcome to the official [a href=\"https://telegram.org/\"]Telegram[/a] desktop app.\nIt's [b]fast[/b] and [b]secure[/b]."; "lng_start_msgs" = "START MESSAGING"; @@ -332,6 +333,7 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org "lng_action_created_chat" = "{from} created group «{title}»"; "lng_forwarded_from" = "Forwarded from"; +"lng_in_reply_to" = "In reply to"; "lng_attach_failed" = "Failed"; "lng_attach_file" = "File"; @@ -385,6 +387,8 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org "lng_context_copy_email" = "Copy email address"; "lng_context_open_hashtag" = "Search by hashtag"; "lng_context_copy_hashtag" = "Copy hashtag"; +"lng_context_open_mention" = "Open {user} profile"; +"lng_context_copy_mention" = "Copy mention"; "lng_context_open_image" = "Open Image"; "lng_context_save_image" = "Save Image As.."; "lng_context_forward_image" = "Forward Image"; @@ -403,8 +407,9 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org "lng_context_forward_file" = "Forward File"; "lng_context_delete_file" = "Delete File"; "lng_context_close_file" = "Close File"; -"lng_context_copy_text" = "Copy Message Text"; +"lng_context_copy_text" = "Copy Text"; "lng_context_to_msg" = "Go To Message"; +"lng_context_reply_msg" = "Reply"; "lng_context_forward_msg" = "Forward Message"; "lng_context_delete_msg" = "Delete Message"; "lng_context_select_msg" = "Select Message"; @@ -425,6 +430,7 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org "lng_forward_send_files_confirm" = "Send selected files to {recipient}?"; "lng_forward" = "Forward"; "lng_forward_send" = "Send"; +"lng_forward_messages" = "{count:_not_used_|Forwarded message|# forwarded messages}"; "lng_contact_phone" = "Phone number"; "lng_enter_contact_data" = "New Contact"; diff --git a/Telegram/Resources/style.txt b/Telegram/Resources/style.txt index b9b15011af..139d0c2452 100644 --- a/Telegram/Resources/style.txt +++ b/Telegram/Resources/style.txt @@ -784,6 +784,8 @@ msgInSelectOverlay: #358cd44c; msgStickerOverlay: #358cd47f; msgOutServiceColor: #3a8e26; msgInServiceColor: #0e7acd; +msgOutServiceSelColor: #367570; +msgInServiceSelColor: #0e7acd; msgShadow: 2px; msgInShadow: #748ea229; msgOutShadow: #3ac34740; @@ -794,6 +796,15 @@ msgOutDateColor: #6cc264; msgInSelectDateColor: #6a9cc5; msgOutSelectDateColor: #50a79c; +msgReplyPadding: margins(6px, 6px, 11px, 6px); +msgReplyBarPos: point(1px, 0px); +msgReplyBarSize: size(2px, 36px); +msgReplyBarSkip: 10px; +msgOutReplyBarColor: #5dc452; +msgInReplyBarColor: #2fa9e2; +msgOutReplyBarSelColor: #4da79f; +msgInReplyBarSelColor: #2fa9e2; + msgServiceSelectBG: #fff4; msgServiceRadius: 2px; @@ -878,7 +889,7 @@ introErrLabelTextStyle: textStyle(defaultTextStyle) { mediaMaxWidth: 250px; mediaFont: font(fsize); -mediaPadding: margins(7px, 6px, 11px, 6px); +mediaPadding: margins(7px, 6px, 7px, 6px); mediaThumbSize: 48px; mediaNameTop: 3px; mediaDetailsShift: 3px; @@ -960,6 +971,24 @@ btnAttachEmoji: iconedButton(btnAttachDocument) { width: 32px; } +replySkip: 52px; +replyColor: #377aae; +replyHeight: 49px; +replyTop: 8px; +replyBottom: 6px; +replyIconPos: point(13px, 15px); +replyIcon: sprite(174px, 195px, 24px, 24px); +replyCancel: iconedButton(btnDefIconed) { + icon: sprite(165px, 24px, 14px, 14px); + iconPos: point(17px, 17px); + downIcon: sprite(165px, 24px, 14px, 14px); + downIconPos: point(17px, 18px); + bgColor: white; + overBgColor: white; + width: 49px; + height: 49px; +} + historyScroll: flatScroll(scrollDef) { barColor: #89a0b47a; bgColor: #89a0b44c; @@ -1318,6 +1347,7 @@ dropdownShadow: sprite(241px, 46px, 6px, 6px); dropdownBorder: 1px; dropdownBorderColor: #ebebeb; dropdownBackground: white; +dropdownDuration: 150; dropdownAttachDocument: iconedButton(btnAttachDocument) { iconPos: point(14px, 13px); @@ -1714,3 +1744,13 @@ passcodeSubmit: flatButton(btnIntroNext) { font: font(19px); overFont: font(19px); } + +mentionHeight: 40px; +mentionScroll: flatScroll(scrollDef) { + topsh: 0; + bottomsh: 0; +} +mentionPadding: margins(8px, 5px, 8px, 5px); +mentionTop: 11px; +mentionFont: linkFont; +mentionPhotoSize: msgPhotoSize; diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp new file mode 100644 index 0000000000..240d9106df --- /dev/null +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -0,0 +1,181 @@ +/* +This file is part of Telegram Desktop, +the official desktop version of Telegram messaging app, see https://telegram.org + +Telegram Desktop is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +It is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE +Copyright (c) 2014 John Preston, https://desktop.telegram.org +*/ +#include "stdafx.h" +#include "style.h" +#include "lang.h" + +#include "application.h" +#include "window.h" +#include "mainwidget.h" +#include "apiwrap.h" + +#include "localstorage.h" + +ApiWrap::ApiWrap(QObject *parent) : QObject(parent) { + App::initBackground(); + + connect(&_replyToTimer, SIGNAL(timeout()), this, SLOT(resolveReplyTo())); +} + +void ApiWrap::init() { + App::initMedia(); +} + +void ApiWrap::itemRemoved(HistoryItem *item) { + if (HistoryReply *reply = item->toHistoryReply()) { + ReplyToRequests::iterator i = _replyToRequests.find(reply->replyToId()); + if (i != _replyToRequests.cend()) { + for (QList::iterator j = i->replies.begin(); j != i->replies.end();) { + if ((*j) == reply) { + j = i->replies.erase(j); + } else { + ++j; + } + } + if (i->replies.isEmpty()) { + _replyToRequests.erase(i); + } + } + } +} + +void ApiWrap::itemReplaced(HistoryItem *oldItem, HistoryItem *newItem) { + if (HistoryReply *reply = oldItem->toHistoryReply()) { + ReplyToRequests::iterator i = _replyToRequests.find(reply->replyToId()); + if (i != _replyToRequests.cend()) { + for (QList::iterator j = i->replies.begin(); j != i->replies.end();) { + if ((*j) == reply) { + if (HistoryReply *newReply = newItem->toHistoryReply()) { + *j = newReply; + ++j; + } else { + j = i->replies.erase(j); + } + } else { + ++j; + } + } + if (i->replies.isEmpty()) { + _replyToRequests.erase(i); + } + } + } +} + +void ApiWrap::requestReplyTo(HistoryReply *reply, MsgId to) { + ReplyToRequest &req(_replyToRequests[to]); + req.replies.append(reply); + if (!req.req) _replyToTimer.start(1); +} + +void ApiWrap::requestFullPeer(PeerData *peer) { + if (_fullRequests.contains(peer)) return; + mtpRequestId req; + if (peer->chat) { + req = MTP::send(MTPmessages_GetFullChat(MTP_int(App::chatFromPeer(peer->id))), rpcDone(&ApiWrap::gotChatFull, peer), rpcFail(&ApiWrap::gotPeerFailed, peer)); + } else { + req = MTP::send(MTPusers_GetFullUser(peer->asUser()->inputUser), rpcDone(&ApiWrap::gotUserFull, peer), rpcFail(&ApiWrap::gotPeerFailed, peer)); + } + _fullRequests.insert(peer, req); +} + +void ApiWrap::gotChatFull(PeerData *peer, const MTPmessages_ChatFull &result) { + const MTPDmessages_chatFull &d(result.c_messages_chatFull()); + App::feedUsers(d.vusers); + App::feedChats(d.vchats); + App::feedParticipants(d.vfull_chat.c_chatFull().vparticipants); + PhotoData *photo = App::feedPhoto(d.vfull_chat.c_chatFull().vchat_photo); + if (photo) { + ChatData *chat = peer->asChat(); + if (chat) { + chat->photoId = photo->id; + photo->chat = chat; + } + } + App::main()->gotNotifySetting(MTP_inputNotifyPeer(peer->input), d.vfull_chat.c_chatFull().vnotify_settings); + + _fullRequests.remove(peer); + emit fullPeerLoaded(peer); +} + +void ApiWrap::gotUserFull(PeerData *peer, const MTPUserFull &result) { + const MTPDuserFull &d(result.c_userFull()); + App::feedUsers(MTP_vector(1, d.vuser)); + App::feedUserLink(MTP_int(App::userFromPeer(peer->id)), d.vlink.c_contacts_link().vmy_link, d.vlink.c_contacts_link().vforeign_link); + App::main()->gotNotifySetting(MTP_inputNotifyPeer(peer->input), d.vnotify_settings); + + _fullRequests.remove(peer); + emit fullPeerLoaded(peer); +} + +bool ApiWrap::gotPeerFailed(PeerData *peer, const RPCError &err) { + _fullRequests.remove(peer); + return true; +} + +void ApiWrap::resolveReplyTo() { + if (_replyToRequests.isEmpty()) return; + + QVector ids; + ids.reserve(_replyToRequests.size()); + for (ReplyToRequests::const_iterator i = _replyToRequests.cbegin(), e = _replyToRequests.cend(); i != e; ++i) { + if (!i.value().req) { + ids.push_back(MTP_int(i.key())); + } + } + if (!ids.isEmpty()) { + mtpRequestId req = MTP::send(MTPmessages_GetMessages(MTP_vector(ids)), rpcDone(&ApiWrap::gotReplyTo)); + for (ReplyToRequests::iterator i = _replyToRequests.begin(), e = _replyToRequests.end(); i != e; ++i) { + i.value().req = req; + } + } +} + +void ApiWrap::gotReplyTo(const MTPmessages_Messages &msgs, mtpRequestId req) { + switch (msgs.type()) { + case mtpc_messages_messages: + App::feedUsers(msgs.c_messages_messages().vusers); + App::feedChats(msgs.c_messages_messages().vchats); + App::feedMsgs(msgs.c_messages_messages().vmessages, -1); + break; + + case mtpc_messages_messagesSlice: + App::feedUsers(msgs.c_messages_messagesSlice().vusers); + App::feedChats(msgs.c_messages_messagesSlice().vchats); + App::feedMsgs(msgs.c_messages_messagesSlice().vmessages, -1); + break; + } + for (ReplyToRequests::iterator i = _replyToRequests.begin(); i != _replyToRequests.cend();) { + if (i.value().req == req) { + for (QList::const_iterator j = i.value().replies.cbegin(), e = i.value().replies.cend(); j != e; ++j) { + if (*j) { + (*j)->updateReplyTo(true); + } else { + App::main()->updateReplyTo(); + } + } + i = _replyToRequests.erase(i); + } else { + ++i; + } + } +} + +ApiWrap::~ApiWrap() { + App::deinitMedia(false); +} diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h new file mode 100644 index 0000000000..b8e2e69dab --- /dev/null +++ b/Telegram/SourceFiles/apiwrap.h @@ -0,0 +1,64 @@ +/* +This file is part of Telegram Desktop, +the official desktop version of Telegram messaging app, see https://telegram.org + +Telegram Desktop is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +It is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE +Copyright (c) 2014 John Preston, https://desktop.telegram.org +*/ +#pragma once + +class ApiWrap : public QObject, public RPCSender { + Q_OBJECT + +public: + + ApiWrap(QObject *parent); + void init(); + + void itemRemoved(HistoryItem *item); + void itemReplaced(HistoryItem *oldItem, HistoryItem *newItem); + + void requestReplyTo(HistoryReply *reply, MsgId to); + + void requestFullPeer(PeerData *peer); + + ~ApiWrap(); + +signals: + + void fullPeerLoaded(PeerData *peer); + +public slots: + + void resolveReplyTo(); + +private: + + void gotReplyTo(const MTPmessages_Messages &result, mtpRequestId req); + struct ReplyToRequest { + ReplyToRequest() : req(0) { + } + mtpRequestId req; + QList replies; + }; + typedef QMap ReplyToRequests; + ReplyToRequests _replyToRequests; + SingleTimer _replyToTimer; + + void gotChatFull(PeerData *peer, const MTPmessages_ChatFull &result); + void gotUserFull(PeerData *peer, const MTPUserFull &result); + bool gotPeerFailed(PeerData *peer, const RPCError &err); + typedef QMap FullRequests; + FullRequests _fullRequests; + +}; diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index c9cbb82188..1450b26419 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -52,6 +52,8 @@ namespace { VideoItems videoItems; AudioItems audioItems; DocumentItems documentItems; + typedef QMap > RepliesTo; + RepliesTo repliesTo; Histories histories; @@ -118,6 +120,10 @@ namespace App { return app() ? app()->uploader() : 0; } + ApiWrap *api() { + return main() ? main()->api() : 0; + } + void showSettings() { Window *w(wnd()); if (w) w->showSettings(); @@ -590,7 +596,7 @@ namespace App { } } - void feedMsgs(const MTPVector &msgs, bool newMsgs) { + void feedMsgs(const MTPVector &msgs, int msgsState) { const QVector &v(msgs.c_vector().v); QMap msgsIds; for (int32 i = 0, l = v.size(); i < l; ++i) { @@ -602,7 +608,7 @@ namespace App { } } for (QMap::const_iterator i = msgsIds.cbegin(), e = msgsIds.cend(); i != e; ++i) { - histories().addToBack(v[*i], newMsgs ? 1 : 0); + histories().addToBack(v[*i], msgsState); } } @@ -1253,6 +1259,22 @@ namespace App { } void itemReplaced(HistoryItem *oldItem, HistoryItem *newItem) { + if (HistoryReply *r = oldItem->toHistoryReply()) { + QMap &replies(::repliesTo[r->replyToMessage()]); + replies.remove(r); + if (HistoryReply *n = newItem->toHistoryReply()) { + replies.insert(n, true); + } + } + RepliesTo::iterator i = ::repliesTo.find(oldItem); + if (i != ::repliesTo.cend() && oldItem != newItem) { + QMap replies = i.value(); + ::repliesTo.erase(i); + ::repliesTo[newItem] = replies; + for (QMap::iterator i = replies.begin(), e = replies.end(); i != e; ++i) { + i.key()->replyToReplaced(oldItem, newItem); + } + } newItem->history()->itemReplaced(oldItem, newItem); if (App::main()) App::main()->itemReplaced(oldItem, newItem); if (App::hoveredItem() == oldItem) App::hoveredItem(newItem); @@ -1311,6 +1333,13 @@ namespace App { } } historyItemDetached(item); + RepliesTo::iterator j = ::repliesTo.find(item); + if (j != ::repliesTo.cend()) { + for (QMap::const_iterator k = j.value().cbegin(), e = j.value().cend(); k != e; ++k) { + k.key()->replyToReplaced(item, 0); + } + ::repliesTo.erase(j); + } if (App::main() && !App::quiting()) { App::main()->itemRemoved(item); } @@ -1361,12 +1390,28 @@ namespace App { ::videoItems.clear(); ::audioItems.clear(); ::documentItems.clear(); + ::repliesTo.clear(); lastPhotos.clear(); lastPhotosMap.clear(); ::self = 0; if (App::wnd()) App::wnd()->updateGlobalMenu(); } -/* // don't delete history without deleting its' peerdata + + void historyRegReply(HistoryReply *reply, HistoryItem *to) { + ::repliesTo[to].insert(reply, true); + } + + void historyUnregReply(HistoryReply *reply, HistoryItem *to) { + RepliesTo::iterator i = ::repliesTo.find(to); + if (i != ::repliesTo.cend()) { + i.value().remove(reply); + if (i.value().isEmpty()) { + ::repliesTo.erase(i); + } + } + } + + /* // don't delete history without deleting its' peerdata void deleteHistory(const PeerId &peer) { Histories::iterator i = ::histories.find(peer); if (i != ::histories.end()) { @@ -1661,9 +1706,9 @@ namespace App { } } - void openUserByName(const QString &username) { + void openUserByName(const QString &username, bool toProfile) { if (App::main()) { - App::main()->openUserByName(username); + App::main()->openUserByName(username, toProfile); } } diff --git a/Telegram/SourceFiles/app.h b/Telegram/SourceFiles/app.h index 6bea352cf9..cb4d1f1b42 100644 --- a/Telegram/SourceFiles/app.h +++ b/Telegram/SourceFiles/app.h @@ -23,6 +23,7 @@ class Application; class Window; class MainWidget; class SettingsWidget; +class ApiWrap; class Font; class Color; class FileUploader; @@ -41,6 +42,7 @@ namespace App { SettingsWidget *settings(); bool passcoded(); FileUploader *uploader(); + ApiWrap *api(); void showSettings(); void logOut(); @@ -74,7 +76,7 @@ namespace App { void feedParticipants(const MTPChatParticipants &p); void feedParticipantAdd(const MTPDupdateChatParticipantAdd &d); void feedParticipantDelete(const MTPDupdateChatParticipantDelete &d); - void feedMsgs(const MTPVector &msgs, bool newMsgs = false); + void feedMsgs(const MTPVector &msgs, int msgsState = 0); // 2 - new read message, 1 - new unread message, 0 - not new message, -1 - searched message void feedWereRead(const QVector &msgsIds); void feedInboxRead(const PeerId &peer, int32 upTo); void feedOutboxRead(const PeerId &peer, int32 upTo); @@ -127,6 +129,8 @@ namespace App { void historyUnregItem(HistoryItem *item); void historyClearMsgs(); void historyClearItems(); + void historyRegReply(HistoryReply *reply, HistoryItem *to); + void historyUnregReply(HistoryReply *reply, HistoryItem *to); // void deleteHistory(const PeerId &peer); void historyRegRandom(uint64 randomId, MsgId itemId); @@ -181,7 +185,7 @@ namespace App { void setProxySettings(QTcpSocket &socket); void searchByHashtag(const QString &tag); - void openUserByName(const QString &username); + void openUserByName(const QString &username, bool toProfile = false); void openLocalUrl(const QString &url); void initBackground(int32 id = 0, const QImage &p = QImage(), bool nowrite = false); diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index caf40a10c3..3b4f093606 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -478,7 +478,7 @@ void Application::uploadProfilePhoto(const QImage &tosend, const PeerId &peerId) int32 filesize = 0; QByteArray data; - ReadyLocalMedia ready(ToPreparePhoto, file, filename, filesize, data, id, id, qsl("jpg"), peerId, photo, photoThumbs, MTP_documentEmpty(MTP_long(0)), jpeg, false); + ReadyLocalMedia ready(ToPreparePhoto, file, filename, filesize, data, id, id, qsl("jpg"), peerId, photo, photoThumbs, MTP_documentEmpty(MTP_long(0)), jpeg, false, 0); connect(App::uploader(), SIGNAL(photoReady(MsgId, const MTPInputFile &)), App::app(), SLOT(photoUpdated(MsgId, const MTPInputFile &)), Qt::UniqueConnection); @@ -671,30 +671,28 @@ void Application::startApp() { DEBUG_LOG(("Application Info: starting app..")); - Local::ReadMapState state = Local::readMap(QByteArray()); - if (state == Local::ReadMapPassNeeded) { - cSetHasPasscode(true); - } - - DEBUG_LOG(("Application Info: local map read..")); - window->createWinId(); window->init(); DEBUG_LOG(("Application Info: window created..")); - if (state != Local::ReadMapPassNeeded) { + initImageLinkManager(); + App::initMedia(); + + Local::ReadMapState state = Local::readMap(QByteArray()); + if (state == Local::ReadMapPassNeeded) { + cSetHasPasscode(true); + DEBUG_LOG(("Application Info: passcode nneded..")); + } else { + DEBUG_LOG(("Application Info: local map read..")); MTP::start(); } - + MTP::setStateChangedHandler(mtpStateChanged); MTP::setSessionResetHandler(mtpSessionReset); DEBUG_LOG(("Application Info: MTP started..")); - initImageLinkManager(); - App::initMedia(); - DEBUG_LOG(("Application Info: showing.")); if (state == Local::ReadMapPassNeeded) { window->setupPasscode(false); diff --git a/Telegram/SourceFiles/art/sprite.png b/Telegram/SourceFiles/art/sprite.png index 6c67e40626599f0ae2061f9905abb78902fd00c8..b2686c0a65561c7ea570d0fa88fb6642ccdadd0e 100644 GIT binary patch delta 45061 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%0D?pGj+ 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 R5e2_gNEOuOb7jo}{|Cz(8Pxy) delta 44231 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�*?@(=JH_H`gADC4=p8?AvxY$-mq(JeImK!Fg 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 literal 107625 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 diff --git a/Telegram/SourceFiles/boxes/photosendbox.cpp b/Telegram/SourceFiles/boxes/photosendbox.cpp index 11bcf1ac9d..b56a152e44 100644 --- a/Telegram/SourceFiles/boxes/photosendbox.cpp +++ b/Telegram/SourceFiles/boxes/photosendbox.cpp @@ -29,6 +29,7 @@ PhotoSendBox::PhotoSendBox(const ReadyLocalMedia &img) : _img(new ReadyLocalMedi _compressed(this, lang(lng_send_image_compressed), cCompressPastedImage()), _sendButton(this, lang(lng_send_button), st::btnSelectDone), _cancelButton(this, lang(lng_cancel), st::btnSelectCancel), + _replyTo(img.replyTo), a_opacity(0, 1) { connect(&_sendButton, SIGNAL(clicked()), this, SLOT(onSend())); connect(&_cancelButton, SIGNAL(clicked()), this, SLOT(onCancel())); @@ -95,12 +96,12 @@ PhotoSendBox::PhotoSendBox(const ReadyLocalMedia &img) : _img(new ReadyLocalMedi resize(_width, _height); } -PhotoSendBox::PhotoSendBox(const QString &phone, const QString &fname, const QString &lname) : _img(0), +PhotoSendBox::PhotoSendBox(const QString &phone, const QString &fname, const QString &lname, MsgId replyTo) : _img(0), _thumbx(0), _thumby(0), _thumbw(0), _thumbh(0), _namew(0), _textw(0), _compressed(this, lang(lng_send_image_compressed), true), _sendButton(this, lang(lng_send_button), st::btnSelectDone), _cancelButton(this, lang(lng_cancel), st::btnSelectCancel), -_phone(phone), _fname(fname), _lname(lname), +_phone(phone), _fname(fname), _lname(lname), _replyTo(replyTo), a_opacity(0, 1) { connect(&_sendButton, SIGNAL(clicked()), this, SLOT(onSend())); connect(&_cancelButton, SIGNAL(clicked()), this, SLOT(onCancel())); @@ -203,7 +204,7 @@ void PhotoSendBox::animStep(float64 ms) { void PhotoSendBox::onSend(bool ctrlShiftEnter) { if (!_img) { - if (App::main()) App::main()->confirmShareContact(ctrlShiftEnter, _phone, _fname, _lname); + if (App::main()) App::main()->confirmShareContact(ctrlShiftEnter, _phone, _fname, _lname, _replyTo); } else { if (!_compressed.isHidden()) { if (_compressed.checked() != cCompressPastedImage()) { @@ -215,7 +216,7 @@ void PhotoSendBox::onSend(bool ctrlShiftEnter) { _img->ctrlShiftEnter = ctrlShiftEnter; if (App::main()) App::main()->confirmSendImage(*_img); } else { - if (App::main()) App::main()->confirmSendImageUncompressed(ctrlShiftEnter); + if (App::main()) App::main()->confirmSendImageUncompressed(ctrlShiftEnter, _replyTo); } } emit closed(); diff --git a/Telegram/SourceFiles/boxes/photosendbox.h b/Telegram/SourceFiles/boxes/photosendbox.h index c94c15e1e0..7d6594eea4 100644 --- a/Telegram/SourceFiles/boxes/photosendbox.h +++ b/Telegram/SourceFiles/boxes/photosendbox.h @@ -26,7 +26,7 @@ class PhotoSendBox : public LayeredWidget { public: PhotoSendBox(const ReadyLocalMedia &img); - PhotoSendBox(const QString &phone, const QString &fname, const QString &lname); + PhotoSendBox(const QString &phone, const QString &fname, const QString &lname, MsgId replyTo); void parentResized(); void animStep(float64 ms); void keyPressEvent(QKeyEvent *e); @@ -50,6 +50,7 @@ private: QPixmap _thumb; QString _phone, _fname, _lname; + MsgId _replyTo; anim::fvalue a_opacity; diff --git a/Telegram/SourceFiles/config.h b/Telegram/SourceFiles/config.h index 796c644af0..39f7ec6f2d 100644 --- a/Telegram/SourceFiles/config.h +++ b/Telegram/SourceFiles/config.h @@ -17,9 +17,9 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org */ #pragma once -static const int32 AppVersion = 7020; -static const wchar_t *AppVersionStr = L"0.7.20"; -static const bool DevChannel = false; +static const int32 AppVersion = 7021; +static const wchar_t *AppVersionStr = L"0.7.21"; +static const bool DevChannel = true; static const wchar_t *AppNameOld = L"Telegram Win (Unofficial)"; static const wchar_t *AppName = L"Telegram Desktop"; diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp index f793170686..9260427e03 100644 --- a/Telegram/SourceFiles/dropdown.cpp +++ b/Telegram/SourceFiles/dropdown.cpp @@ -24,6 +24,7 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org #include "lang.h" #include "window.h" +#include "apiwrap.h" Dropdown::Dropdown(QWidget *parent) : TWidget(parent), _hiding(false), a_opacity(0), _shadow(st::dropdownShadow) { @@ -160,7 +161,7 @@ void Dropdown::showStart() { } bool Dropdown::animStep(float64 ms) { - float64 dt = ms / 150; + float64 dt = ms / st::dropdownDuration; bool res = true; if (dt >= 1) { a_opacity.finish(); @@ -311,7 +312,7 @@ void DragArea::showStart() { } bool DragArea::animStep(float64 ms) { - float64 dt = ms / 150; + float64 dt = ms / st::dropdownDuration; bool res = true; if (dt >= 1) { a_opacity.finish(); @@ -764,7 +765,7 @@ void EmojiPan::fastHide() { } bool EmojiPan::animStep(float64 ms) { - float64 dt = ms / 150; + float64 dt = ms / st::dropdownDuration; bool res = true; if (dt >= 1) { a_opacity.finish(); @@ -880,6 +881,341 @@ void EmojiPan::onTabChange() { } } +MentionsInner::MentionsInner(MentionsDropdown *parent, MentionRows *rows) : _parent(parent), _rows(rows), _sel(-1), _mouseSel(false) { +} + +void MentionsInner::paintEvent(QPaintEvent *e) { + QPainter p(this); + + int32 atwidth = st::mentionFont->m.width('@'), availwidth = width() - 2 * st::mentionPadding.left() - st::mentionPhotoSize - 2 * st::mentionPadding.right(); + + int32 from = qFloor(e->rect().top() / st::mentionHeight), to = qFloor(e->rect().bottom() / st::mentionHeight) + 1, last = _rows->size(); + for (int32 i = from; i < to; ++i) { + if (i >= last) break; + + if (i == _sel) p.fillRect(0, i * st::mentionHeight, width(), st::mentionHeight, st::dlgHoverBG->b); + + UserData *user = _rows->at(last - i - 1); + QString uname = user->username; + int32 unamewidth = atwidth + st::mentionFont->m.width(uname), namewidth = user->nameText.maxWidth(); + if (availwidth < unamewidth + namewidth) { + namewidth = (availwidth * namewidth) / (namewidth + unamewidth); + unamewidth = availwidth - namewidth; + uname = st::mentionFont->m.elidedText('@' + uname, Qt::ElideRight, unamewidth); + } else { + uname = '@' + uname; + } + user->photo->load(); + p.drawPixmap(st::mentionPadding.left(), i * st::mentionHeight + st::mentionPadding.top(), user->photo->pix(st::mentionPhotoSize)); + user->nameText.drawElided(p, 2 * st::mentionPadding.left() + st::mentionPhotoSize, i * st::mentionHeight + st::mentionTop, namewidth); + p.setFont(st::mentionFont->f); + p.drawText(2 * st::mentionPadding.left() + st::mentionPhotoSize + namewidth + st::mentionPadding.right(), i * st::mentionHeight + st::mentionTop + st::mentionFont->ascent, uname); + } + + p.fillRect(cWideMode() ? st::dlgShadow : 0, _parent->innerTop(), width() - (cWideMode() ? st::dlgShadow : 0), st::titleShadow, st::titleShadowColor->b); + p.fillRect(cWideMode() ? st::dlgShadow : 0, _parent->innerBottom() - st::titleShadow, width() - (cWideMode() ? st::dlgShadow : 0), st::titleShadow, st::titleShadowColor->b); +} + +void MentionsInner::mouseMoveEvent(QMouseEvent *e) { + _mousePos = mapToGlobal(e->pos()); + _mouseSel = true; + onUpdateSelected(true); +} + +void MentionsInner::clearSel() { + _mouseSel = false; + setSel(-1); +} + +bool MentionsInner::moveSel(int direction) { + _mouseSel = false; + if (_sel >= _rows->size() || _sel < 0) { + if (direction < 0) setSel(_rows->size() - 1, true); + return (_sel >= 0 && _sel < _rows->size()); + } + if (_sel > 0 || direction > 0) { + setSel((_sel + direction >= _rows->size()) ? -1 : (_sel + direction), true); + } + return true; +} + +bool MentionsInner::select() { + if (_sel >= 0 && _sel < _rows->size()) { + emit mentioned(_rows->at(_rows->size() - _sel - 1)->username); + return true; + } + return false; +} + +void MentionsInner::mousePressEvent(QMouseEvent *e) { + _mousePos = mapToGlobal(e->pos()); + _mouseSel = true; + onUpdateSelected(true); + if (e->button() == Qt::LeftButton) { + select(); + } +} + +void MentionsInner::enterEvent(QEvent *e) { + setMouseTracking(true); + _mousePos = QCursor::pos(); + onUpdateSelected(true); +} + +void MentionsInner::leaveEvent(QEvent *e) { + setMouseTracking(false); + if (_sel >= 0) { + setSel(-1); + } +} + +void MentionsInner::setSel(int sel, bool scroll) { + _sel = sel; + parentWidget()->update(); + if (scroll && _sel >= 0 && _sel < _rows->size()) emit mustScrollTo(_sel * st::mentionHeight, (_sel + 1) * st::mentionHeight); +} + +void MentionsInner::onUpdateSelected(bool force) { + QPoint mouse(mapFromGlobal(_mousePos)); + if ((!force && !rect().contains(mouse)) || !_mouseSel) return; + + int w = width(), mouseY = mouse.y(); + int32 sel = mouseY / int32(st::mentionHeight); + if (sel < 0 || sel >= _rows->size()) { + sel = -1; + } + if (sel != _sel) { + setSel(sel); + } +} + +void MentionsInner::onParentGeometryChanged() { + _mousePos = QCursor::pos(); + if (rect().contains(mapFromGlobal(_mousePos))) { + setMouseTracking(true); + onUpdateSelected(true); + } +} + +MentionsDropdown::MentionsDropdown(QWidget *parent) : QWidget(parent), +_scroll(this, st::mentionScroll), _inner(this, &_rows), _chat(0), _hiding(false), a_opacity(0), _shadow(st::dropdownShadow) { + _hideTimer.setSingleShot(true); + connect(&_hideTimer, SIGNAL(timeout()), this, SLOT(hideStart())); + connect(&_inner, SIGNAL(mentioned(QString)), this, SIGNAL(mentioned(QString))); + connect(&_inner, SIGNAL(mustScrollTo(int,int)), &_scroll, SLOT(scrollToY(int,int))); + + setFocusPolicy(Qt::NoFocus); + _scroll.setFocusPolicy(Qt::NoFocus); + _scroll.viewport()->setFocusPolicy(Qt::NoFocus); + + _inner.setGeometry(rect()); + _scroll.setGeometry(rect()); + + _scroll.setWidget(&_inner); + _scroll.show(); + _inner.show(); + + connect(&_scroll, SIGNAL(geometryChanged()), &_inner, SLOT(onParentGeometryChanged())); + connect(&_scroll, SIGNAL(scrolled()), &_inner, SLOT(onUpdateSelected())); + + if (cPlatform() == dbipMac) { + connect(App::wnd()->windowHandle(), SIGNAL(activeChanged()), this, SLOT(onWndActiveChanged())); + } +} + +void MentionsDropdown::paintEvent(QPaintEvent *e) { + QPainter p(this); + + if (animating()) { + p.setOpacity(a_opacity.current()); + p.drawPixmap(0, 0, _cache); + return; + } + + p.fillRect(rect(), st::white->b); + +} + +void MentionsDropdown::showFiltered(ChatData *chat, QString start) { + _chat = chat; + start = start.toLower(); + bool toDown = (_filter != start); + if (toDown) { + _filter = start; + } + + int32 now = unixtime(); + QMultiMap ordered; + MentionRows rows; + rows.reserve(_chat->participants.isEmpty() ? _chat->lastAuthors.size() : _chat->participants.size()); + if (_chat->participants.isEmpty()) { + if (_chat->count > 0) { + App::api()->requestFullPeer(_chat); + } + } else { + for (ChatData::Participants::const_iterator i = _chat->participants.cbegin(), e = _chat->participants.cend(); i != e; ++i) { + UserData *user = i.key(); + if (user->username.isEmpty()) continue; + if (!_filter.isEmpty() && !user->username.startsWith(_filter, Qt::CaseInsensitive)) continue; + ordered.insertMulti(App::onlineForSort(user->onlineTill, now), user); + } + } + for (MentionRows::const_iterator i = _chat->lastAuthors.cbegin(), e = _chat->lastAuthors.cend(); i != e; ++i) { + UserData *user = *i; + if (user->username.isEmpty()) continue; + if (!_filter.isEmpty() && !user->username.startsWith(_filter, Qt::CaseInsensitive)) continue; + rows.push_back(user); + if (!ordered.isEmpty()) { + ordered.remove(App::onlineForSort(user->onlineTill, now), user); + } + } + if (!ordered.isEmpty()) { + for (QMultiMap::const_iterator i = ordered.cend(), b = ordered.cbegin(); i != b;) { + --i; + rows.push_back(i.value()); + } + } + + if (rows.isEmpty()) { + if (!isHidden()) { + hideStart(); + _rows.clear(); + } + } else { + _rows = rows; + bool hidden = _hiding || isHidden(); + if (hidden) { + show(); + _scroll.show(); + } + recount(toDown); + if (hidden) { + hide(); + showStart(); + } + } +} + +void MentionsDropdown::setBoundings(QRect boundings) { + _boundings = boundings; + resize(_boundings.width(), height()); + _scroll.resize(size()); + _inner.resize(width(), _inner.height()); + recount(); +} + +void MentionsDropdown::recount(bool toDown) { + int32 h = _rows.size() * st::mentionHeight, oldst = _scroll.scrollTop(), st = oldst; + + if (_inner.height() != h) { + st += h - _inner.height(); + _inner.resize(width(), h); + } + if (h > _boundings.height()) h = _boundings.height(); + if (h > 5 * st::mentionHeight) h = 5 * st::mentionHeight; + if (height() != h) { + st += _scroll.height() - h; + setGeometry(0, _boundings.height() - h, width(), h); + _scroll.resize(width(), h); + } else if (y() != _boundings.height() - h) { + move(0, _boundings.height() - h); + } + if (toDown) st = _scroll.scrollTopMax(); + if (st != oldst) _scroll.scrollToY(st); + if (toDown) _inner.clearSel(); +} + +void MentionsDropdown::fastHide() { + if (animating()) { + anim::stop(this); + } + a_opacity = anim::fvalue(0, 0); + _hideTimer.stop(); + hideFinish(); +} + +void MentionsDropdown::hideStart() { + if (!_hiding) { + if (_cache.isNull()) { + _scroll.show(); + _cache = myGrab(this, rect()); + } + _scroll.hide(); + _hiding = true; + a_opacity.start(0); + anim::start(this); + } +} + +void MentionsDropdown::hideFinish() { + hide(); + _hiding = false; + _filter = qsl("-"); + _inner.clearSel(); +} + +void MentionsDropdown::showStart() { + if (!isHidden() && a_opacity.current() == 1 && !_hiding) { + return; + } + if (_cache.isNull()) { + _scroll.show(); + _cache = myGrab(this, rect()); + } + _scroll.hide(); + _hiding = false; + show(); + a_opacity.start(1); + anim::start(this); +} + +bool MentionsDropdown::animStep(float64 ms) { + float64 dt = ms / st::dropdownDuration; + bool res = true; + if (dt >= 1) { + a_opacity.finish(); + _cache = QPixmap(); + if (_hiding) { + hideFinish(); + } else { + _scroll.show(); + _inner.clearSel(); + } + res = false; + } else { + a_opacity.update(dt, anim::linear); + } + update(); + return res; +} + +int32 MentionsDropdown::innerTop() { + return _scroll.scrollTop(); +} + +int32 MentionsDropdown::innerBottom() { + return _scroll.scrollTop() + _scroll.height(); +} + +bool MentionsDropdown::eventFilter(QObject *obj, QEvent *e) { + if (isHidden()) return QWidget::eventFilter(obj, e); + if (e->type() == QEvent::KeyPress) { + QKeyEvent *ev = static_cast(e); + if (ev->key() == Qt::Key_Up) { + _inner.moveSel(-1); + return true; + } else if (ev->key() == Qt::Key_Down) { + return _inner.moveSel(1); + } else if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return) { + return _inner.select(); + } + } + return QWidget::eventFilter(obj, e); +} + +MentionsDropdown::~MentionsDropdown() { +} + //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); @@ -1124,7 +1460,7 @@ void EmojiPan::onTabChange() { //} // //bool StickerPan::animStep(float64 ms) { -// float64 dt = ms / 150; +// float64 dt = ms / st::dropdownDuration; // bool res = true; // if (dt >= 1) { // a_opacity.finish(); diff --git a/Telegram/SourceFiles/dropdown.h b/Telegram/SourceFiles/dropdown.h index e490b2c23c..e31ff84bda 100644 --- a/Telegram/SourceFiles/dropdown.h +++ b/Telegram/SourceFiles/dropdown.h @@ -227,6 +227,109 @@ private: }; +typedef QList MentionRows; + +class MentionsDropdown; +class MentionsInner : public QWidget { + Q_OBJECT + +public: + + MentionsInner(MentionsDropdown *parent, MentionRows *rows); + + void paintEvent(QPaintEvent *e); + + void enterEvent(QEvent *e); + void leaveEvent(QEvent *e); + + void mousePressEvent(QMouseEvent *e); + void mouseMoveEvent(QMouseEvent *e); + + void clearSel(); + bool moveSel(int direction); + bool select(); + +signals: + + void mentioned(QString username); + void mustScrollTo(int scrollToTop, int scrollToBottom); + +public slots: + + void onParentGeometryChanged(); + void onUpdateSelected(bool force = false); + +private: + + void setSel(int sel, bool scroll = false); + + MentionsDropdown *_parent; + MentionRows *_rows; + int32 _sel; + bool _mouseSel; + QPoint _mousePos; + +}; + +class MentionsDropdown : public QWidget, public Animated { + Q_OBJECT + +public: + + MentionsDropdown(QWidget *parent); + + void paintEvent(QPaintEvent *e); + + void fastHide(); + + void showFiltered(ChatData *chat, QString start); + void setBoundings(QRect boundings); + + bool animStep(float64 ms); + + int32 innerTop(); + int32 innerBottom(); + + bool eventFilter(QObject *obj, QEvent *e); + + ~MentionsDropdown(); + +signals: + + void mentioned(QString username); + +public slots: + + void hideStart(); + void hideFinish(); + + void showStart(); + +private: + + void recount(bool toDown = false); + + QPixmap _cache; + MentionRows _rows; + + ScrollArea _scroll; + MentionsInner _inner; + + ChatData *_chat; + QString _filter; + QRect _boundings; + + int32 _width, _height; + bool _hiding; + + anim::fvalue a_opacity; + + QTimer _hideTimer; + + BoxShadow _shadow; + +}; + //class StickerPanInner : public QWidget, public Animated { // Q_OBJECT // diff --git a/Telegram/SourceFiles/gui/flattextarea.cpp b/Telegram/SourceFiles/gui/flattextarea.cpp index a7d25975d9..04db563b4d 100644 --- a/Telegram/SourceFiles/gui/flattextarea.cpp +++ b/Telegram/SourceFiles/gui/flattextarea.cpp @@ -180,6 +180,79 @@ EmojiPtr FlatTextarea::getSingleEmoji() const { return 0; } +bool FlatTextarea::getMentionStart(QString &start) const { + int32 pos = textCursor().position(); + if (textCursor().anchor() != pos) return false; + + QTextDocument *doc(document()); + QTextBlock block = doc->findBlock(pos); + for (QTextBlock::Iterator iter = block.begin(); !iter.atEnd(); ++iter) { + QTextFragment fr(iter.fragment()); + if (!fr.isValid()) continue; + + int32 p = fr.position(), e = (p + fr.length()); + if (p >= pos || e < pos) continue; + + QTextCharFormat f = fr.charFormat(); + if (f.isImageFormat()) continue; + + QString t(fr.text()); + for (int i = pos - p; i > 0; --i) { + if (t.at(i - 1) == '@') { + start = t.mid(i, pos - p - i); + return (start.isEmpty() || start.at(0).isLetter()) && (i < 2 || !(t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_')); + } + if (pos - p - i > 31) break; + if (!t.at(i - 1).isLetterOrNumber() && t.at(i - 1) != '_') break; + } + return false; + } + return false; +} + +void FlatTextarea::onMentionInsert(QString mention) { + QTextCursor c(textCursor()); + int32 pos = c.position(); + + QTextDocument *doc(document()); + QTextBlock block = doc->findBlock(pos); + for (QTextBlock::Iterator iter = block.begin(); !iter.atEnd(); ++iter) { + QTextFragment fr(iter.fragment()); + if (!fr.isValid()) continue; + + int32 p = fr.position(), e = (p + fr.length()); + if (p >= pos || e < pos) continue; + + QTextCharFormat f = fr.charFormat(); + if (f.isImageFormat()) continue; + + QString t(fr.text()); + for (int i = pos - p; i > 0; --i) { + if (t.at(i - 1) == '@') { + if ((i == pos - p || t.at(i).isLetter()) && (i < 2 || !(t.at(i - 2).isLetterOrNumber() || t.at(i - 2) == '_'))) { + c.setPosition(p + i, QTextCursor::MoveAnchor); + int till = p + i; + for (; (till < e) && (till - p - i < mention.size()); ++till) { + if (t.at(till - p).toLower() != mention.at(till - p - i).toLower()) { + break; + } + } + if (till - p - i == mention.size() && till < e && t.at(till - p) == ' ') { + ++till; + } + c.setPosition(till, QTextCursor::KeepAnchor); + c.insertText(mention + ' '); + return; + } + break; + } + if (pos - p - i > 31) break; + if (!t.at(i - 1).isLetterOrNumber() && t.at(i - 1) != '_') break; + } + } + c.insertText('@' + mention + ' '); +} + void FlatTextarea::getSingleEmojiFragment(QString &text, QTextFragment &fragment) const { int32 end = textCursor().position(), start = end - 1; if (textCursor().anchor() != end) return; diff --git a/Telegram/SourceFiles/gui/flattextarea.h b/Telegram/SourceFiles/gui/flattextarea.h index cbe09a08ef..87faaaf405 100644 --- a/Telegram/SourceFiles/gui/flattextarea.h +++ b/Telegram/SourceFiles/gui/flattextarea.h @@ -49,6 +49,7 @@ public: QSize minimumSizeHint() const; EmojiPtr getSingleEmoji() const; + bool getMentionStart(QString &start) const; void removeSingleEmoji(); QString getText(int32 start = 0, int32 end = -1) const; bool hasText() const; @@ -66,6 +67,8 @@ public slots: void onUndoAvailable(bool avail); void onRedoAvailable(bool avail); + void onMentionInsert(QString mention); + signals: void changed(); diff --git a/Telegram/SourceFiles/gui/text.cpp b/Telegram/SourceFiles/gui/text.cpp index bbe794aafd..eb6edbedd9 100644 --- a/Telegram/SourceFiles/gui/text.cpp +++ b/Telegram/SourceFiles/gui/text.cpp @@ -137,6 +137,7 @@ namespace { const QRegularExpression reMailName(qsl("[a-zA-Z\\-_\\.0-9]{1,256}$")); const QRegularExpression reMailStart(qsl("^[a-zA-Z\\-_\\.0-9]{1,256}\\@")); const QRegularExpression reHashtag(qsl("(^|[\\s\\.,:;<>|'\"\\[\\]\\{\\}`\\~\\!\\%\\^\\*\\(\\)\\-\\+=\\x10])#[A-Za-z_\\.0-9]{2,20}([\\s\\.,:;<>|'\"\\[\\]\\{\\}`\\~\\!\\%\\^\\*\\(\\)\\-\\+=\\x10]|$)")); + const QRegularExpression reMention(qsl("(^|[\\s\\.,:;<>|'\"\\[\\]\\{\\}`\\~\\!\\%\\^\\*\\(\\)\\-\\+=\\x10])@[A-Za-z_0-9]{5,32}([\\s\\.,:;<>|'\"\\[\\]\\{\\}`\\~\\!\\%\\^\\*\\(\\)\\-\\+=\\x10]|$)")); QSet validProtocols, validTopDomains; void initLinkSets(); @@ -418,7 +419,10 @@ public: } void getLinkData(const QString &original, QString &result, int32 &fullDisplayed) { - if (!original.isEmpty() && original.at(0) == '#') { + if (!original.isEmpty() && original.at(0) == '@') { + result = original; + fullDisplayed = -3; // mention + } else if (!original.isEmpty() && original.at(0) == '#') { result = original; fullDisplayed = -2; // hashtag } else if (reMailStart.match(original).hasMatch()) { @@ -685,7 +689,9 @@ public: _t->_links.resize(lnkIndex); const TextLinkData &data(links[lnkIndex - maxLnkIndex - 1]); TextLinkPtr lnk; - if (data.fullDisplayed < -1) { // hashtag + if (data.fullDisplayed < -2) { // mention + lnk = TextLinkPtr(new MentionLink(data.url)); + } else if (data.fullDisplayed < -1) { // hashtag lnk = TextLinkPtr(new HashtagLink(data.url)); } else if (data.fullDisplayed < 0) { // email lnk = TextLinkPtr(new EmailLink(data.url)); @@ -716,7 +722,7 @@ private: TextLinkData(const QString &url = QString(), int32 fullDisplayed = 1) : url(url), fullDisplayed(fullDisplayed) { } QString url; - int32 fullDisplayed; // -2 - hashtag, -1 - email + int32 fullDisplayed; // -3 - mention, -2 - hashtag, -1 - email }; typedef QVector TextLinks; TextLinks links; @@ -849,6 +855,12 @@ void TextLink::onClick(Qt::MouseButton button) const { } } +void MentionLink::onClick(Qt::MouseButton button) const { + if (button == Qt::LeftButton || button == Qt::MiddleButton) { + App::openUserByName(_tag.mid(1), true); + } +} + void HashtagLink::onClick(Qt::MouseButton button) const { if (button == Qt::LeftButton || button == Qt::MiddleButton) { App::searchByHashtag(_tag); @@ -4137,7 +4149,8 @@ LinkRanges textParseLinks(const QString &text, bool rich) { QRegularExpressionMatch mDomain = reDomain.match(text, matchOffset); QRegularExpressionMatch mExplicitDomain = reExplicitDomain.match(text, matchOffset); QRegularExpressionMatch mHashtag = reHashtag.match(text, matchOffset); - if (!mDomain.hasMatch() && !mExplicitDomain.hasMatch() && !mHashtag.hasMatch()) break; + QRegularExpressionMatch mMention = reMention.match(text, matchOffset); + if (!mDomain.hasMatch() && !mExplicitDomain.hasMatch() && !mHashtag.hasMatch() && !mMention.hasMatch()) break; LinkRange link; int32 domainOffset = mDomain.hasMatch() ? mDomain.capturedStart() : INT_MAX, @@ -4145,7 +4158,9 @@ LinkRanges textParseLinks(const QString &text, bool rich) { explicitDomainOffset = mExplicitDomain.hasMatch() ? mExplicitDomain.capturedStart() : INT_MAX, explicitDomainEnd = mExplicitDomain.hasMatch() ? mExplicitDomain.capturedEnd() : INT_MAX, hashtagOffset = mHashtag.hasMatch() ? mHashtag.capturedStart() : INT_MAX, - hashtagEnd = mHashtag.hasMatch() ? mHashtag.capturedEnd() : INT_MAX; + hashtagEnd = mHashtag.hasMatch() ? mHashtag.capturedEnd() : INT_MAX, + mentionOffset = mMention.hasMatch() ? mMention.capturedStart() : INT_MAX, + mentionEnd = mMention.hasMatch() ? mMention.capturedEnd() : INT_MAX; if (mHashtag.hasMatch()) { if (!mHashtag.capturedRef(1).isEmpty()) { ++hashtagOffset; @@ -4154,12 +4169,35 @@ LinkRanges textParseLinks(const QString &text, bool rich) { --hashtagEnd; } } + if (mMention.hasMatch()) { + if (!mMention.capturedRef(1).isEmpty()) { + ++mentionOffset; + } + if (!mMention.capturedRef(2).isEmpty()) { + --mentionEnd; + } + if (!(start + mentionOffset + 1)->isLetter() || !(start + mentionEnd - 1)->isLetterOrNumber()) { + mentionOffset = mentionEnd = INT_MAX; + if (!mDomain.hasMatch() && !mExplicitDomain.hasMatch() && !mHashtag.hasMatch()) break; + } + } if (explicitDomainOffset < domainOffset) { domainOffset = explicitDomainOffset; domainEnd = explicitDomainEnd; mDomain = mExplicitDomain; } - if (hashtagOffset < domainOffset) { + if (mentionOffset < hashtagOffset && mentionOffset < domainOffset) { + if (mentionOffset > nextCmd) { + const QChar *after = textSkipCommand(start + nextCmd, start + len); + if (after > start + nextCmd && mentionOffset < (after - start)) { + nextCmd = offset = matchOffset = after - start; + continue; + } + } + + link.from = start + mentionOffset; + link.len = start + mentionEnd - link.from; + } else if (hashtagOffset < domainOffset) { if (hashtagOffset > nextCmd) { const QChar *after = textSkipCommand(start + nextCmd, start + len); if (after > start + nextCmd && hashtagOffset < (after - start)) { diff --git a/Telegram/SourceFiles/gui/text.h b/Telegram/SourceFiles/gui/text.h index 81f7bb8d7f..7f3e21376c 100644 --- a/Telegram/SourceFiles/gui/text.h +++ b/Telegram/SourceFiles/gui/text.h @@ -301,6 +301,32 @@ private: }; +class MentionLink : public ITextLink { +public: + + MentionLink(const QString &tag) : _tag(tag) { + } + + const QString &text() const { + return _tag; + } + + void onClick(Qt::MouseButton button) const; + + const QString &readable() const { + return _tag; + } + + QString encoded() const { + return _tag; + } + +private: + + QString _tag; + +}; + class HashtagLink : public ITextLink { public: diff --git a/Telegram/SourceFiles/gui/twidget.h b/Telegram/SourceFiles/gui/twidget.h index 033d238f9a..d71c5a03aa 100644 --- a/Telegram/SourceFiles/gui/twidget.h +++ b/Telegram/SourceFiles/gui/twidget.h @@ -25,10 +25,10 @@ public: TWidget(QWidget *parent = 0) : QWidget(parent) { } TWidget *tparent() { - return dynamic_cast(parentWidget()); + return qobject_cast(parentWidget()); } const TWidget *tparent() const { - return dynamic_cast(parentWidget()); + return qobject_cast(parentWidget()); } virtual void leaveToChildEvent(QEvent *e) { // e -- from enterEvent() of child TWidget diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp index 29e37916d2..742eb6e7b2 100644 --- a/Telegram/SourceFiles/history.cpp +++ b/Telegram/SourceFiles/history.cpp @@ -236,6 +236,13 @@ namespace { }; AnimatedGif animated; + + inline HistoryReply *toHistoryReply(HistoryItem *item) { + return item ? item->toHistoryReply() : 0; + } + inline const HistoryReply *toHistoryReply(const HistoryItem *item) { + return item ? item->toHistoryReply() : 0; + } } void historyInit() { @@ -791,6 +798,12 @@ void PeerLink::onClick(Qt::MouseButton button) const { } } +void MessageLink::onClick(Qt::MouseButton button) const { + if (button == Qt::LeftButton && App::main()) { + App::main()->showPeer(peer(), msgid()); + } +} + MsgId clientMsgId() { static MsgId current = -2000000000; return ++current; @@ -1206,8 +1219,10 @@ HistoryItem *History::createItem(HistoryBlock *block, const MTPmessage &msg, boo break; case mtpc_message: - if (msg.c_message().has_fwd_date() || msg.c_message().has_fwd_from_id()) { + if ((msg.c_message().has_fwd_date() && msg.c_message().vfwd_date.v > 0) || (msg.c_message().has_fwd_from_id() && msg.c_message().vfwd_from_id.v != 0)) { result = new HistoryForwarded(this, block, msg.c_message()); + } else if (msg.c_message().has_reply_to_msg_id() && msg.c_message().vreply_to_msg_id.v > 0) { + result = new HistoryReply(this, block, msg.c_message()); } else { result = new HistoryMessage(this, block, msg.c_message()); } @@ -1284,15 +1299,19 @@ HistoryItem *History::createItemForwarded(HistoryBlock *block, MsgId id, History return regItem(result); } -HistoryItem *History::createItemDocument(HistoryBlock *block, MsgId id, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc) { +HistoryItem *History::createItemDocument(HistoryBlock *block, MsgId id, int32 flags, MsgId replyTo, QDateTime date, int32 from, DocumentData *doc) { HistoryItem *result = 0; - result = new HistoryMessage(this, block, id, out, unread, date, from, doc); + if (flags & MTPDmessage::flag_reply_to_msg_id && replyTo > 0) { + result = new HistoryReply(this, block, id, flags, replyTo, date, from, doc); + } else { + result = new HistoryMessage(this, block, id, flags, date, from, doc); + } return regItem(result); } -HistoryItem *History::addToBackService(MsgId msgId, QDateTime date, const QString &text, bool out, bool unread, HistoryMedia *media, bool newMsg) { +HistoryItem *History::addToBackService(MsgId msgId, QDateTime date, const QString &text, int32 flags, HistoryMedia *media, bool newMsg) { HistoryBlock *to = 0; bool newBlock = isEmpty(); if (newBlock) { @@ -1301,7 +1320,7 @@ HistoryItem *History::addToBackService(MsgId msgId, QDateTime date, const QStrin to = back(); } - return doAddToBack(to, newBlock, regItem(new HistoryServiceMsg(this, to, msgId, date, text, out, unread, media)), newMsg); + return doAddToBack(to, newBlock, regItem(new HistoryServiceMsg(this, to, msgId, date, text, flags, media)), newMsg); } HistoryItem *History::addToBack(const MTPmessage &msg, bool newMsg) { @@ -1330,7 +1349,7 @@ HistoryItem *History::addToBackForwarded(MsgId id, HistoryMessage *item) { return doAddToBack(to, newBlock, createItemForwarded(to, id, item), true); } -HistoryItem *History::addToBackDocument(MsgId id, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc) { +HistoryItem *History::addToBackDocument(MsgId id, int32 flags, MsgId replyTo, QDateTime date, int32 from, DocumentData *doc) { HistoryBlock *to = 0; bool newBlock = isEmpty(); if (newBlock) { @@ -1338,7 +1357,7 @@ HistoryItem *History::addToBackDocument(MsgId id, bool out, bool unread, QDateTi } else { to = back(); } - return doAddToBack(to, newBlock, createItemDocument(to, id, out, unread, date, from, doc), true); + return doAddToBack(to, newBlock, createItemDocument(to, id, flags, replyTo, date, from, doc), true); } void History::createInitialDateBlock(const QDateTime &date) { @@ -1401,6 +1420,14 @@ HistoryItem *History::doAddToBack(HistoryBlock *to, bool newBlock, HistoryItem * } } } + if (peer->chat && adding->from()->id) { + QList *lastAuthors = &(peer->asChat()->lastAuthors); + int prev = lastAuthors->indexOf(adding->from()); + if (prev > 0) { + lastAuthors->removeAt(prev); + lastAuthors->push_front(adding->from()); + } + } return adding; } @@ -1427,7 +1454,7 @@ void History::newItemAdded(HistoryItem *item) { if (unreadBar) unreadBar->destroy(); } else if (item->unread()) { notifies.push_back(item); - App::main()->newUnreadMsg(this, item->id); + App::main()->newUnreadMsg(this, item); } if (dialogs.isEmpty()) { App::main()->createDialogAtTop(this, unreadCount); @@ -1491,7 +1518,8 @@ void History::addToFront(const QVector &slice) { addToH += block->height; ++skip; - if (loadedAtBottom()) { // add photos to overview + if (loadedAtBottom()) { // add photos to overview and authors to lastAuthors + QList *lastAuthors = peer->chat ? &(peer->asChat()->lastAuthors) : 0; for (int32 i = block->size(); i > 0; --i) { HistoryItem *item = (*block)[i - 1]; HistoryMedia *media = item->getMedia(true); @@ -1504,6 +1532,7 @@ void History::addToFront(const QVector &slice) { } } } + if (lastAuthors && item->from()->id && !lastAuthors->contains(item->from())) lastAuthors->push_back(item->from()); } if (App::wnd()) App::wnd()->mediaOverviewUpdated(peer); } @@ -1864,6 +1893,7 @@ void History::clear(bool leaveItems) { } height = 0; oldLoaded = false; + if (peer->chat) peer->asChat()->lastAuthors.clear(); } History::Parent::iterator History::erase(History::Parent::iterator i) { @@ -2057,27 +2087,26 @@ ItemAnimations &itemAnimations() { return _itemAnimations; } -HistoryItem::HistoryItem(History *history, HistoryBlock *block, MsgId msgId, bool out, bool unread, QDateTime msgDate, int32 from) : y(0) +HistoryItem::HistoryItem(History *history, HistoryBlock *block, MsgId msgId, int32 flags, QDateTime msgDate, int32 from) : y(0) , id(msgId) , date(msgDate) , _from(App::user(from)) , _fromVersion(_from->nameVersion) , _history(history) , _block(block) -, _out(out) -, _unread(unread) +, _flags(flags) { } void HistoryItem::markRead() { - if (_unread) { - if (_out) { + if (_flags & MTPDmessage_flag_unread) { + if (out()) { _history->outboxRead(this); } else { _history->inboxRead(this); } App::main()->msgUpdated(_history->peer->id, this); - _unread = false; + _flags &= ~int32(MTPDmessage_flag_unread); } } @@ -2145,11 +2174,14 @@ HistoryItem::~HistoryItem() { HistoryItem *regItem(HistoryItem *item, bool returnExisting) { if (!item) return 0; + HistoryItem *existing = App::historyRegItem(item); if (existing) { delete item; return returnExisting ? existing : 0; } + + item->initDimensions(); return item; } @@ -2185,11 +2217,22 @@ void HistoryPhoto::initDimensions(const HistoryItem *parent) { } _maxw = qMax(w, int32(st::minPhotoSize)); _minh = qMax(thumbh, int32(st::minPhotoSize)); - _height = resize(w, true, parent); + if (const HistoryReply *reply = toHistoryReply(parent)) { + _maxw += st::mediaPadding.left() + st::mediaPadding.right(); + _minh += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom() + st::mediaPadding.top() + st::mediaPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + _minh += st::msgPadding.top() + st::msgNameFont->height; + } + } } int32 HistoryPhoto::resize(int32 width, bool dontRecountText, const HistoryItem *parent) { + const HistoryReply *reply = toHistoryReply(parent); + pixw = qMin(width, _maxw); + if (reply) { + pixw -= st::mediaPadding.left() + st::mediaPadding.right(); + } int32 tw = convertScale(data->full->width()), th = convertScale(data->full->height()); if (tw > st::maxMediaSize) { @@ -2214,6 +2257,13 @@ int32 HistoryPhoto::resize(int32 width, bool dontRecountText, const HistoryItem if (pixh < 1) pixh = 1; w = qMax(pixw, int16(st::minPhotoSize)); _height = qMax(pixh, int16(st::minPhotoSize)); + if (reply) { + w += st::mediaPadding.left() + st::mediaPadding.right(); + _height += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom() + st::mediaPadding.top() + st::mediaPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + _height += st::msgPadding.top() + st::msgNameFont->height; + } + } return _height; } @@ -2232,7 +2282,25 @@ bool HistoryPhoto::hasPoint(int32 x, int32 y, const HistoryItem *parent, int32 w TextLinkPtr HistoryPhoto::getLink(int32 x, int32 y, const HistoryItem *parent, int32 width) const { if (width < 0) width = w; - if (x >= 0 && y >= 0 && x < width && y < _height) { + int skipx = 0, skipy = 0, height = _height; + if (const HistoryReply *reply = toHistoryReply(parent)) { + skipx = st::mediaPadding.left(); + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom() + st::mediaPadding.top(); + height -= st::mediaPadding.bottom(); + int replyFrom = 0; + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + if (x >= st::mediaPadding.left() && y >= st::msgPadding.top() && x < width - st::mediaPadding.left() - st::mediaPadding.right() && x < st::mediaPadding.left() + parent->from()->nameText.maxWidth() && y < replyFrom) { + return parent->from()->lnk; + } + } + if (x >= 0 && y >= replyFrom + st::msgReplyPadding.top() && x < width && y < skipy - st::msgReplyPadding.bottom() - st::mediaPadding.top()) { + return reply->replyToLink(); + } + width -= st::mediaPadding.left() + st::mediaPadding.right(); + } + if (x >= skipx && y >= skipy && x < skipx + width && y < height) { return openl; } return TextLinkPtr(); @@ -2278,6 +2346,26 @@ void HistoryPhoto::updateFrom(const MTPMessageMedia &media) { void HistoryPhoto::draw(QPainter &p, const HistoryItem *parent, bool selected, int32 width) const { if (width < 0) width = w; + int skipx = 0, skipy = 0, height = _height; + if (const HistoryReply *reply = toHistoryReply(parent)) { + skipx = st::mediaPadding.left(); + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom() + st::mediaPadding.top(); + + style::color bg(selected ? (parent->out() ? st::msgOutSelectBG : st::msgInSelectBG) : (parent->out() ? st::msgOutBG : st::msgInBG)); + p.fillRect(QRect(0, 0, width, _height), bg->b); + int replyFrom = 0; + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + p.setFont(st::msgNameFont->f); + p.setPen(parent->from()->color->p); + parent->from()->nameText.drawElided(p, st::mediaPadding.left(), st::msgPadding.top(), width - st::mediaPadding.left() - st::mediaPadding.right()); + } + reply->drawReplyTo(p, st::msgReplyPadding.left(), replyFrom, width - st::msgReplyPadding.left() - st::msgReplyPadding.right(), selected); + + width -= st::mediaPadding.left() + st::mediaPadding.right(); + height -= skipy + st::mediaPadding.bottom(); + } data->full->load(false, false); bool out = parent->out(); bool full = data->full->loaded(); @@ -2287,16 +2375,16 @@ void HistoryPhoto::draw(QPainter &p, const HistoryItem *parent, bool selected, i } else { pix = data->thumb->pixBlurredSingle(pixw, pixh); } - if (pixw < width || pixh < _height) { - p.fillRect(QRect(0, 0, width, _height), st::black->b); + if (pixw < width || pixh < height) { + p.fillRect(QRect(skipx, skipy, width, height), st::black->b); } - p.drawPixmap(QPoint((width - pixw) / 2, (_height - pixh) / 2), pix); + p.drawPixmap(QPoint(skipx + (width - pixw) / 2, skipy + (height - pixh) / 2), pix); if (!full) { uint64 dt = itemAnimations().animate(parent, getms()); int32 cnt = int32(st::photoLoaderCnt), period = int32(st::photoLoaderPeriod), t = dt % period, delta = int32(st::photoLoaderDelta); - int32 x = (width - st::photoLoader.width()) / 2, y = (_height - st::photoLoader.height()) / 2; - p.fillRect(x, y, st::photoLoader.width(), st::photoLoader.height(), st::photoLoaderBg->b); + int32 x = (width - st::photoLoader.width()) / 2, y = (height - st::photoLoader.height()) / 2; + p.fillRect(skipx + x, skipy + y, st::photoLoader.width(), st::photoLoader.height(), st::photoLoaderBg->b); x += (st::photoLoader.width() - cnt * st::photoLoaderPoint.width() - (cnt - 1) * st::photoLoaderSkip) / 2; y += (st::photoLoader.height() - st::photoLoaderPoint.height()) / 2; QColor c(st::white->c); @@ -2308,26 +2396,26 @@ void HistoryPhoto::draw(QPainter &p, const HistoryItem *parent, bool selected, i float64 alpha = (t >= st::photoLoaderDuration1 + st::photoLoaderDuration2) ? 0 : ((t > st::photoLoaderDuration1 ? ((st::photoLoaderDuration1 + st::photoLoaderDuration2 - t) / st::photoLoaderDuration2) : (t / st::photoLoaderDuration1))); c.setAlphaF(st::photoLoaderAlphaMin + alpha * (1 - st::photoLoaderAlphaMin)); b.setColor(c); - p.fillRect(x + i * (st::photoLoaderPoint.width() + st::photoLoaderSkip), y, st::photoLoaderPoint.width(), st::photoLoaderPoint.height(), b); + p.fillRect(skipx + x + i * (st::photoLoaderPoint.width() + st::photoLoaderSkip), skipy + y, st::photoLoaderPoint.width(), st::photoLoaderPoint.height(), b); } } if (selected) { - p.fillRect(0, 0, width, _height, textstyleCurrent()->selectOverlay->b); + p.fillRect(skipx, skipy, width, height, textstyleCurrent()->selectOverlay->b); } style::color shadow(selected ? st::msgInSelectShadow : st::msgInShadow); - p.fillRect(0, _height, width, st::msgShadow, shadow->b); + p.fillRect(0, _height, width + (skipx ? (st::mediaPadding.left() + st::mediaPadding.right()) : 0), st::msgShadow, shadow->b); // date QString time(parent->time()); if (time.isEmpty()) return; - int32 dateX = width - parent->timeWidth() - st::msgDateImgDelta - 2 * st::msgDateImgPadding.x(); - int32 dateY = _height - st::msgDateFont->height - 2 * st::msgDateImgPadding.y() - st::msgDateImgDelta; + int32 dateX = skipx + width - parent->timeWidth() - st::msgDateImgDelta - 2 * st::msgDateImgPadding.x(); + int32 dateY = skipy + height - st::msgDateFont->height - 2 * st::msgDateImgPadding.y() - st::msgDateImgDelta; if (parent->out()) { dateX -= st::msgCheckRect.pxWidth() + st::msgDateImgCheckSpace; } - int32 dateW = width - dateX - st::msgDateImgDelta; - int32 dateH = _height - dateY - st::msgDateImgDelta; + int32 dateW = skipx + width - dateX - st::msgDateImgDelta; + int32 dateH = skipy + height - dateY - st::msgDateImgDelta; p.fillRect(dateX, dateY, dateW, dateH, st::msgDateImgBg->b); if (selected) { @@ -2352,6 +2440,20 @@ void HistoryPhoto::draw(QPainter &p, const HistoryItem *parent, bool selected, i } } +ImagePtr HistoryPhoto::replyPreview() { + if (data->replyPreview->isNull() && !data->thumb->isNull()) { + if (data->thumb->loaded()) { + int w = data->thumb->width(), h = data->thumb->height(); + if (w <= 0) w = 1; + if (h <= 0) h = 1; + data->replyPreview = ImagePtr(w > h ? data->thumb->pix(w * st::msgReplyBarSize.height() / h, st::msgReplyBarSize.height()) : data->thumb->pix(st::msgReplyBarSize.height()), "PNG"); + } else { + data->thumb->load(); + } + } + return data->replyPreview; +} + QString formatSizeText(qint64 size) { if (size >= 1024 * 1024) { // more than 1 mb qint64 sizeTenthMb = (size * 10 / (1024 * 1024)); @@ -2427,7 +2529,15 @@ void HistoryVideo::initDimensions(const HistoryItem *parent) { if (!parent->out()) { // add Download / Save As button _maxw += st::mediaSaveDelta + _buttonWidth; } - _height = _minh = st::mediaPadding.top() + st::mediaThumbSize + st::mediaPadding.bottom(); + _minh = st::mediaPadding.top() + st::mediaThumbSize + st::mediaPadding.bottom(); + if (const HistoryReply *reply = toHistoryReply(parent)) { + _maxw += st::mediaPadding.left() + st::mediaPadding.right(); + _minh += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + _minh += st::msgPadding.top() + st::msgNameFont->height; + } + } + _height = _minh; } void HistoryVideo::regItem(HistoryItem *item) { @@ -2458,20 +2568,41 @@ TextLinkPtr HistoryVideo::getLink(int32 x, int32 y, const HistoryItem *parent, i if (width < 0) width = w; if (width < 1) return TextLinkPtr(); + const HistoryReply *reply = toHistoryReply(parent); + int skipy = 0, replyFrom = 0; + if (reply) { + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + } + } + bool out = parent->out(), hovered, pressed; if (width >= _maxw) { width = _maxw; } if (!out) { // draw Download / Save As button - int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = (_height - btnh) / 2; + int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = skipy + (_height - skipy - btnh) / 2; if (x >= btnx && y >= btny && x < btnx + btnw && y < btny + btnh) { return data->loader ? _cancell : _savel; } width -= btnw + st::mediaSaveDelta; } - if (x >= 0 && y >= 0 && x < width && y < _height && !data->loader && data->access) { + if (reply) { + if (!parent->out() && parent->history()->peer->chat) { + if (x >= st::mediaPadding.left() && y >= st::msgPadding.top() && x < width - st::mediaPadding.left() - st::mediaPadding.right() && x < st::mediaPadding.left() + parent->from()->nameText.maxWidth() && y < replyFrom) { + return parent->from()->lnk; + } + } + if (x >= 0 && y >= replyFrom + st::msgReplyPadding.top() && x < width && y < skipy - st::msgReplyPadding.bottom()) { + return reply->replyToLink(); + } + } + + if (x >= 0 && y >= skipy && x < width && y < _height && !data->loader && data->access) { return _openl; } return TextLinkPtr(); @@ -2485,6 +2616,16 @@ void HistoryVideo::draw(QPainter &p, const HistoryItem *parent, bool selected, i if (width < 0) width = w; if (width < 1) return; + const HistoryReply *reply = toHistoryReply(parent); + int skipy = 0, replyFrom = 0; + if (reply) { + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + } + } + data->thumb->checkload(); bool out = parent->out(), hovered, pressed; @@ -2497,7 +2638,7 @@ void HistoryVideo::draw(QPainter &p, const HistoryItem *parent, bool selected, i pressed = hovered && ((data->loader ? _cancell : _savel) == textlnkDown()); if (hovered && !pressed && textlnkDown()) hovered = false; - int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = (_height - btnh) / 2; + int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = skipy + (_height - skipy - btnh) / 2; p.fillRect(QRect(btnx, btny, btnw, btnh), (selected ? st::msgInSelectBG : (hovered ? st::mediaSaveButton.overBgColor : st::mediaSaveButton.bgColor))->b); style::color shadow(selected ? (out ? st::msgOutSelectShadow : st::msgInSelectShadow) : (out ? st::msgOutShadow : st::msgInShadow)); @@ -2517,14 +2658,23 @@ void HistoryVideo::draw(QPainter &p, const HistoryItem *parent, bool selected, i style::color shadow(selected ? (out ? st::msgOutSelectShadow : st::msgInSelectShadow) : (out ? st::msgOutShadow : st::msgInShadow)); p.fillRect(0, _height, width, st::msgShadow, shadow->b); + if (reply) { + if (!parent->out() && parent->history()->peer->chat) { + p.setFont(st::msgNameFont->f); + p.setPen(parent->from()->color->p); + parent->from()->nameText.drawElided(p, st::mediaPadding.left(), st::msgPadding.top(), width - st::mediaPadding.left() - st::mediaPadding.right()); + } + reply->drawReplyTo(p, st::msgReplyPadding.left(), replyFrom, width - st::msgReplyPadding.left() - st::msgReplyPadding.right(), selected); + } + if (_thumbw) { int32 rf(cIntRetinaFactor()); - p.drawPixmap(QPoint(st::mediaPadding.left(), st::mediaPadding.top()), data->thumb->pix(_thumbw), QRect(_thumbx * rf, _thumby * rf, st::mediaThumbSize * rf, st::mediaThumbSize * rf)); + p.drawPixmap(QPoint(st::mediaPadding.left(), skipy + st::mediaPadding.top()), data->thumb->pix(_thumbw), QRect(_thumbx * rf, _thumby * rf, st::mediaThumbSize * rf, st::mediaThumbSize * rf)); } else { - p.drawPixmap(QPoint(st::mediaPadding.left(), st::mediaPadding.top()), App::sprite(), (out ? st::mediaDocOutImg : st::mediaDocInImg)); + p.drawPixmap(QPoint(st::mediaPadding.left(), skipy + st::mediaPadding.top()), App::sprite(), (out ? st::mediaDocOutImg : st::mediaDocInImg)); } if (selected) { - p.fillRect(st::mediaPadding.left(), st::mediaPadding.top(), st::mediaThumbSize, st::mediaThumbSize, (out ? st::msgOutSelectOverlay : st::msgInSelectOverlay)->b); + p.fillRect(st::mediaPadding.left(), skipy + st::mediaPadding.top(), st::mediaThumbSize, st::mediaThumbSize, (out ? st::msgOutSelectOverlay : st::msgInSelectOverlay)->b); } int32 tleft = st::mediaPadding.left() + st::mediaThumbSize + st::mediaPadding.right(); @@ -2534,7 +2684,7 @@ void HistoryVideo::draw(QPainter &p, const HistoryItem *parent, bool selected, i p.setFont(st::mediaFont->f); p.setPen(st::black->c); - p.drawText(tleft, st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, lang(lng_media_video)); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, lang(lng_media_video)); QString statusText; @@ -2560,7 +2710,7 @@ void HistoryVideo::draw(QPainter &p, const HistoryItem *parent, bool selected, i statusText = _size; } } - p.drawText(tleft, st::mediaPadding.top() + st::mediaThumbSize - st::mediaDetailsShift - st::mediaFont->descent, statusText); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaThumbSize - st::mediaDetailsShift - st::mediaFont->descent, statusText); p.setFont(st::msgDateFont->f); @@ -2584,6 +2734,20 @@ void HistoryVideo::draw(QPainter &p, const HistoryItem *parent, bool selected, i } } +ImagePtr HistoryVideo::replyPreview() { + if (data->replyPreview->isNull() && !data->thumb->isNull()) { + if (data->thumb->loaded()) { + int w = data->thumb->width(), h = data->thumb->height(); + if (w <= 0) w = 1; + if (h <= 0) h = 1; + data->replyPreview = ImagePtr(w > h ? data->thumb->pix(w * st::msgReplyBarSize.height() / h, st::msgReplyBarSize.height()) : data->thumb->pix(st::msgReplyBarSize.height()), "PNG"); + } else { + data->thumb->load(); + } + } + return data->replyPreview; +} + HistoryAudio::HistoryAudio(const MTPDaudio &audio, int32 width) : HistoryMedia(width) , data(App::feedAudio(audio)) , _openl(new AudioOpenLink(data)) @@ -2609,13 +2773,31 @@ void HistoryAudio::initDimensions(const HistoryItem *parent) { _maxw += st::mediaSaveDelta + _buttonWidth; } - _height = _minh = st::mediaPadding.top() + st::mediaThumbSize + st::mediaPadding.bottom(); + _minh = st::mediaPadding.top() + st::mediaThumbSize + st::mediaPadding.bottom(); + if (const HistoryReply *reply = toHistoryReply(parent)) { + _maxw += st::mediaPadding.left() + st::mediaPadding.right(); + _minh += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + _minh += st::msgPadding.top() + st::msgNameFont->height; + } + } + _height = _minh; } void HistoryAudio::draw(QPainter &p, const HistoryItem *parent, bool selected, int32 width) const { if (width < 0) width = w; if (width < 1) return; + const HistoryReply *reply = toHistoryReply(parent); + int skipy = 0, replyFrom = 0; + if (reply) { + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + } + } + bool out = parent->out(), hovered, pressed, already = !data->already().isEmpty(), hasdata = !data->data.isEmpty(); if (width >= _maxw) { width = _maxw; @@ -2631,7 +2813,7 @@ void HistoryAudio::draw(QPainter &p, const HistoryItem *parent, bool selected, i pressed = hovered && ((data->loader ? _cancell : _savel) == textlnkDown()); if (hovered && !pressed && textlnkDown()) hovered = false; - int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = (_height - btnh) / 2; + int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = skipy + (_height - skipy - btnh) / 2; p.fillRect(QRect(btnx, btny, btnw, btnh), (selected ? st::msgInSelectBG : (hovered ? st::mediaSaveButton.overBgColor : st::mediaSaveButton.bgColor))->b); style::color shadow(selected ? (out ? st::msgOutSelectShadow : st::msgInSelectShadow) : (out ? st::msgOutShadow : st::msgInShadow)); @@ -2651,6 +2833,15 @@ void HistoryAudio::draw(QPainter &p, const HistoryItem *parent, bool selected, i style::color shadow(selected ? (out ? st::msgOutSelectShadow : st::msgInSelectShadow) : (out ? st::msgOutShadow : st::msgInShadow)); p.fillRect(0, _height, width, st::msgShadow, shadow->b); + if (reply) { + if (!parent->out() && parent->history()->peer->chat) { + p.setFont(st::msgNameFont->f); + p.setPen(parent->from()->color->p); + parent->from()->nameText.drawElided(p, st::mediaPadding.left(), st::msgPadding.top(), width - st::mediaPadding.left() - st::mediaPadding.right()); + } + reply->drawReplyTo(p, st::msgReplyPadding.left(), replyFrom, width - st::msgReplyPadding.left() - st::msgReplyPadding.right(), selected); + } + AudioData *playing = 0; VoiceMessageState playingState = VoiceMessageStopped; int64 playingPosition = 0, playingDuration = 0; @@ -2664,9 +2855,9 @@ void HistoryAudio::draw(QPainter &p, const HistoryItem *parent, bool selected, i } else { img = out ? st::mediaAudioOutImg : st::mediaAudioInImg; } - p.drawPixmap(QPoint(st::mediaPadding.left(), st::mediaPadding.top()), App::sprite(), img); + p.drawPixmap(QPoint(st::mediaPadding.left(), skipy + st::mediaPadding.top()), App::sprite(), img); if (selected) { - p.fillRect(st::mediaPadding.left(), st::mediaPadding.top(), st::mediaThumbSize, st::mediaThumbSize, textstyleCurrent()->selectOverlay->b); + p.fillRect(st::mediaPadding.left(), skipy + st::mediaPadding.top(), st::mediaThumbSize, st::mediaThumbSize, textstyleCurrent()->selectOverlay->b); } int32 tleft = st::mediaPadding.left() + st::mediaThumbSize + st::mediaPadding.right(); @@ -2676,7 +2867,7 @@ void HistoryAudio::draw(QPainter &p, const HistoryItem *parent, bool selected, i p.setFont(st::mediaFont->f); p.setPen(st::black->c); - p.drawText(tleft, st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, lang(lng_media_audio)); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, lang(lng_media_audio)); QString statusText; @@ -2709,7 +2900,7 @@ void HistoryAudio::draw(QPainter &p, const HistoryItem *parent, bool selected, i } } } - p.drawText(tleft, st::mediaPadding.top() + st::mediaThumbSize - st::mediaDetailsShift - st::mediaFont->descent, statusText); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaThumbSize - st::mediaDetailsShift - st::mediaFont->descent, statusText); p.setFont(st::msgDateFont->f); style::color date(selected ? (out ? st::msgOutSelectDateColor : st::msgInSelectDateColor) : (out ? st::msgOutDateColor : st::msgInDateColor)); @@ -2760,20 +2951,41 @@ TextLinkPtr HistoryAudio::getLink(int32 x, int32 y, const HistoryItem *parent, i if (width < 0) width = w; if (width < 1) return TextLinkPtr(); + const HistoryReply *reply = toHistoryReply(parent); + int skipy = 0, replyFrom = 0; + if (reply) { + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + } + } + bool out = parent->out(), hovered, pressed; if (width >= _maxw) { width = _maxw; } if (!out) { // draw Download / Save As button - int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = (_height - btnh) / 2; + int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = skipy + (_height - skipy - btnh) / 2; if (x >= btnx && y >= btny && x < btnx + btnw && y < btny + btnh) { return data->loader ? _cancell : _savel; } width -= btnw + st::mediaSaveDelta; } - if (x >= 0 && y >= 0 && x < width && y < _height && !data->loader && data->access) { + if (reply) { + if (!parent->out() && parent->history()->peer->chat) { + if (x >= st::mediaPadding.left() && y >= st::msgPadding.top() && x < width - st::mediaPadding.left() - st::mediaPadding.right() && x < st::mediaPadding.left() + parent->from()->nameText.maxWidth() && y < replyFrom) { + return parent->from()->lnk; + } + } + if (x >= 0 && y >= replyFrom + st::msgReplyPadding.top() && x < width && y < skipy - st::msgReplyPadding.bottom()) { + return reply->replyToLink(); + } + } + + if (x >= 0 && y >= skipy && x < width && y < _height && !data->loader && data->access) { return _openl; } return TextLinkPtr(); @@ -2825,7 +3037,6 @@ void HistoryDocument::initDimensions(const HistoryItem *parent) { if (parent == animated.msg) { _maxw = animated.w; _minh = animated.h; - _height = resize(w, true, parent); } else { _maxw = st::mediaMaxWidth; int32 tleft = st::mediaPadding.left() + st::mediaThumbSize + st::mediaPadding.right(); @@ -2835,7 +3046,15 @@ void HistoryDocument::initDimensions(const HistoryItem *parent) { if (!parent->out()) { // add Download / Save As button _maxw += st::mediaSaveDelta + _buttonWidth; } - _height = _minh = st::mediaPadding.top() + st::mediaThumbSize + st::mediaPadding.bottom(); + _minh = st::mediaPadding.top() + st::mediaThumbSize + st::mediaPadding.bottom(); + + if (const HistoryReply *reply = toHistoryReply(parent)) { + _maxw += st::mediaPadding.left() + st::mediaPadding.right(); + _minh += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + _minh += st::msgPadding.top() + st::msgNameFont->height; + } + } } } @@ -2864,6 +3083,16 @@ void HistoryDocument::draw(QPainter &p, const HistoryItem *parent, bool selected return; } + const HistoryReply *reply = toHistoryReply(parent); + int skipy = 0, replyFrom = 0; + if (reply) { + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + } + } + data->thumb->checkload(); if (width >= _maxw) { @@ -2875,7 +3104,7 @@ void HistoryDocument::draw(QPainter &p, const HistoryItem *parent, bool selected pressed = hovered && ((data->loader ? _cancell : _savel) == textlnkDown()); if (hovered && !pressed && textlnkDown()) hovered = false; - int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = (_height - btnh) / 2; + int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = skipy + (_height - skipy - btnh) / 2; p.fillRect(QRect(btnx, btny, btnw, btnh), (selected ? st::msgInSelectBG : (hovered ? st::mediaSaveButton.overBgColor : st::mediaSaveButton.bgColor))->b); style::color shadow(selected ? (out ? st::msgOutSelectShadow : st::msgInSelectShadow) : (out ? st::msgOutShadow : st::msgInShadow)); @@ -2895,14 +3124,23 @@ void HistoryDocument::draw(QPainter &p, const HistoryItem *parent, bool selected style::color shadow(selected ? (out ? st::msgOutSelectShadow : st::msgInSelectShadow) : (out ? st::msgOutShadow : st::msgInShadow)); p.fillRect(0, _height, width, st::msgShadow, shadow->b); + if (reply) { + if (!parent->out() && parent->history()->peer->chat) { + p.setFont(st::msgNameFont->f); + p.setPen(parent->from()->color->p); + parent->from()->nameText.drawElided(p, st::mediaPadding.left(), st::msgPadding.top(), width - st::mediaPadding.left() - st::mediaPadding.right()); + } + reply->drawReplyTo(p, st::msgReplyPadding.left(), replyFrom, width - st::msgReplyPadding.left() - st::msgReplyPadding.right(), selected); + } + if (_thumbw) { int32 rf(cIntRetinaFactor()); - p.drawPixmap(QPoint(st::mediaPadding.left(), st::mediaPadding.top()), data->thumb->pix(_thumbw), QRect(_thumbx * rf, _thumby * rf, st::mediaThumbSize * rf, st::mediaThumbSize * rf)); + p.drawPixmap(QPoint(st::mediaPadding.left(), skipy + st::mediaPadding.top()), data->thumb->pix(_thumbw), QRect(_thumbx * rf, _thumby * rf, st::mediaThumbSize * rf, st::mediaThumbSize * rf)); } else { - p.drawPixmap(QPoint(st::mediaPadding.left(), st::mediaPadding.top()), App::sprite(), (out ? st::mediaDocOutImg : st::mediaDocInImg)); + p.drawPixmap(QPoint(st::mediaPadding.left(), skipy + st::mediaPadding.top()), App::sprite(), (out ? st::mediaDocOutImg : st::mediaDocInImg)); } if (selected) { - p.fillRect(st::mediaPadding.left(), st::mediaPadding.top(), st::mediaThumbSize, st::mediaThumbSize, textstyleCurrent()->selectOverlay->b); + p.fillRect(st::mediaPadding.left(), skipy + st::mediaPadding.top(), st::mediaThumbSize, st::mediaThumbSize, textstyleCurrent()->selectOverlay->b); } int32 tleft = st::mediaPadding.left() + st::mediaThumbSize + st::mediaPadding.right(); @@ -2913,9 +3151,9 @@ void HistoryDocument::draw(QPainter &p, const HistoryItem *parent, bool selected p.setFont(st::mediaFont->f); p.setPen(st::black->c); if (twidth < _namew) { - p.drawText(tleft, st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, st::mediaFont->m.elidedText(_name, Qt::ElideRight, twidth)); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, st::mediaFont->m.elidedText(_name, Qt::ElideRight, twidth)); } else { - p.drawText(tleft, st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, _name); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, _name); } QString statusText; @@ -2942,7 +3180,7 @@ void HistoryDocument::draw(QPainter &p, const HistoryItem *parent, bool selected statusText = _size; } } - p.drawText(tleft, st::mediaPadding.top() + st::mediaThumbSize - st::mediaDetailsShift - st::mediaFont->descent, statusText); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaThumbSize - st::mediaDetailsShift - st::mediaFont->descent, statusText); p.setFont(st::msgDateFont->f); @@ -2991,6 +3229,8 @@ int32 HistoryDocument::resize(int32 width, bool dontRecountText, const HistoryIt _height = (w * _height / animated.w); if (_height <= 0) _height = 1; } + } else { + _height = _minh; } return _height; } @@ -3043,15 +3283,36 @@ TextLinkPtr HistoryDocument::getLink(int32 x, int32 y, const HistoryItem *parent return (x >= 0 && y >= 0 && x < width && y < h) ? _openl : TextLinkPtr(); } + const HistoryReply *reply = toHistoryReply(parent); + int skipy = 0, replyFrom = 0; + if (reply) { + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + } + } + if (!out) { // draw Download / Save As button - int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = (_height - btnh) / 2; + int32 btnw = _buttonWidth, btnh = st::mediaSaveButton.height, btnx = width - _buttonWidth, btny = skipy + (_height - skipy - btnh) / 2; if (x >= btnx && y >= btny && x < btnx + btnw && y < btny + btnh) { return data->loader ? _cancell : _savel; } width -= btnw + st::mediaSaveDelta; } - if (x >= 0 && y >= 0 && x < width && y < _height && !data->loader && data->access) { + if (reply) { + if (!parent->out() && parent->history()->peer->chat) { + if (x >= st::mediaPadding.left() && y >= st::msgPadding.top() && x < width - st::mediaPadding.left() - st::mediaPadding.right() && x < st::mediaPadding.left() + parent->from()->nameText.maxWidth() && y < replyFrom) { + return parent->from()->lnk; + } + } + if (x >= 0 && y >= replyFrom + st::msgReplyPadding.top() && x < width && y < skipy - st::msgReplyPadding.bottom()) { + return reply->replyToLink(); + } + } + + if (x >= 0 && y >= skipy && x < width && y < _height && !data->loader && data->access) { return _openl; } return TextLinkPtr(); @@ -3061,8 +3322,22 @@ HistoryMedia *HistoryDocument::clone() const { return new HistoryDocument(*this); } +ImagePtr HistoryDocument::replyPreview() { + if (data->replyPreview->isNull() && !data->thumb->isNull()) { + if (data->thumb->loaded()) { + int w = data->thumb->width(), h = data->thumb->height(); + if (w <= 0) w = 1; + if (h <= 0) h = 1; + data->replyPreview = ImagePtr(w > h ? data->thumb->pix(w * st::msgReplyBarSize.height() / h, st::msgReplyBarSize.height()) : data->thumb->pix(st::msgReplyBarSize.height()), "PNG"); + } else { + data->thumb->load(); + } + } + return data->replyPreview; +} + HistorySticker::HistorySticker(DocumentData *document, int32 width) : HistoryMedia(width) -, pixw(1), pixh(1), data(document) +, pixw(1), pixh(1), data(document), lastw(width) { data->thumb->load(); updateStickerEmoji(); @@ -3098,7 +3373,11 @@ void HistorySticker::initDimensions(const HistoryItem *parent) { if (pixh < 1) pixh = 1; _maxw = qMax(pixw, int16(st::minPhotoSize)); _minh = qMax(pixh, int16(st::minPhotoSize)); - _height = resize(w, true, parent); + if (const HistoryReply *reply = toHistoryReply(parent)) { + _maxw += reply->replyToWidth(); + } + _height = _minh; + w = qMin(lastw, _maxw); } void HistorySticker::draw(QPainter &p, const HistoryItem *parent, bool selected, int32 width) const { @@ -3106,6 +3385,15 @@ void HistorySticker::draw(QPainter &p, const HistoryItem *parent, bool selected, if (width < 1) return; if (width > _maxw) width = _maxw; + int32 usew = _maxw, usex = 0; + const HistoryReply *reply = toHistoryReply(parent); + if (reply) { + usew -= reply->replyToWidth(); + if (parent->out()) { + usex = width - usew; + } + } + bool out = parent->out(), hovered, pressed, already = !data->already().isEmpty(), hasdata = !data->data.isEmpty(); if (!data->loader && data->status != FileFailed && !already && !hasdata) { data->save(QString()); @@ -3119,27 +3407,27 @@ void HistorySticker::draw(QPainter &p, const HistoryItem *parent, bool selected, } if (selected) { if (data->sticker->isNull()) { - p.drawPixmap(QPoint((_maxw - pixw) / 2, (_minh - pixh) / 2), data->thumb->pixBlurredColored(st::msgStickerOverlay, pixw, pixh)); + p.drawPixmap(QPoint(usex + (usew - pixw) / 2, (_minh - pixh) / 2), data->thumb->pixBlurredColored(st::msgStickerOverlay, pixw, pixh)); } else { - p.drawPixmap(QPoint((_maxw - pixw) / 2, (_minh - pixh) / 2), data->sticker->pixColored(st::msgStickerOverlay, pixw, pixh)); + p.drawPixmap(QPoint(usex + (usew - pixw) / 2, (_minh - pixh) / 2), data->sticker->pixColored(st::msgStickerOverlay, pixw, pixh)); } } else { if (data->sticker->isNull()) { - p.drawPixmap(QPoint((_maxw - pixw) / 2, (_minh - pixh) / 2), data->thumb->pixBlurred(pixw, pixh)); + p.drawPixmap(QPoint(usex + (usew - pixw) / 2, (_minh - pixh) / 2), data->thumb->pixBlurred(pixw, pixh)); } else { - p.drawPixmap(QPoint((_maxw - pixw) / 2, (_minh - pixh) / 2), data->sticker->pix(pixw, pixh)); + p.drawPixmap(QPoint(usex + (usew - pixw) / 2, (_minh - pixh) / 2), data->sticker->pix(pixw, pixh)); } } // date QString time(parent->time()); if (time.isEmpty()) return; - int32 dateX = width - parent->timeWidth() - st::msgDateImgDelta - 2 * st::msgDateImgPadding.x(); + int32 dateX = usex + usew - parent->timeWidth() - st::msgDateImgDelta - 2 * st::msgDateImgPadding.x(); int32 dateY = _height - st::msgDateFont->height - 2 * st::msgDateImgPadding.y() - st::msgDateImgDelta; if (parent->out()) { dateX -= st::msgCheckRect.pxWidth() + st::msgDateImgCheckSpace; } - int32 dateW = width - dateX - st::msgDateImgDelta; + int32 dateW = usex + usew - dateX - st::msgDateImgDelta; int32 dateH = _height - dateY - st::msgDateImgDelta; p.fillRect(dateX, dateY, dateW, dateH, st::msgDateImgBg->b); @@ -3163,6 +3451,28 @@ void HistorySticker::draw(QPainter &p, const HistoryItem *parent, bool selected, } p.drawPixmap(iconPos, App::sprite(), *iconRect); } + + if (reply) { + int32 rw = width - usew, rh = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + int32 rx = parent->out() ? 0 : usew, ry = _height - rh; + + p.setPen(Qt::NoPen); + QRect r(rx, ry, rw, rh); + p.setBrush(App::msgServiceBG()->b); + p.drawRoundedRect(r, st::msgServiceRadius, st::msgServiceRadius); + if (selected) { + p.setBrush(textstyleCurrent()->selectOverlay->b); + p.drawRoundedRect(r, st::msgServiceRadius, st::msgServiceRadius); + } + + reply->drawReplyTo(p, rx + st::msgReplyPadding.left(), ry, rw - st::msgReplyPadding.left() - st::msgReplyPadding.right(), selected, true); + } +} + +int32 HistorySticker::resize(int32 width, bool dontRecountText, const HistoryItem *parent) { + w = qMin(width, _maxw); + lastw = width; + return _height; } void HistorySticker::regItem(HistoryItem *item) { @@ -3180,12 +3490,6 @@ void HistorySticker::updateFrom(const MTPMessageMedia &media) { } } -int32 HistorySticker::resize(int32 width, bool dontRecountText, const HistoryItem *parent) { - w = _maxw; - _height = _minh; - return _height; -} - const QString HistorySticker::inDialogsText() const { return _emoji.isEmpty() ? lang(lng_in_dlg_sticker) : lng_in_dlg_sticker_emoji(lt_emoji, _emoji); } @@ -3203,6 +3507,20 @@ int32 HistorySticker::countHeight(const HistoryItem *parent, int32 width) const } TextLinkPtr HistorySticker::getLink(int32 x, int32 y, const HistoryItem *parent, int32 width) const { + if (width < 0) width = w; + if (width < 1) return TextLinkPtr(); + if (width > _maxw) width = _maxw; + + int32 usew = _maxw, usex = 0; + const HistoryReply *reply = toHistoryReply(parent); + if (reply) { + usew -= reply->replyToWidth(); + int32 rw = width - usew, rh = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + int32 rx = parent->out() ? 0 : usew, ry = _height - rh; + if (x >= rx && y >= ry && x < rx + rw && y < ry + rh) { + return reply->replyToLink(); + } + } return TextLinkPtr(); } @@ -3218,7 +3536,6 @@ HistoryContact::HistoryContact(int32 userId, const QString &first, const QString _maxw = st::mediaMaxWidth; name.setText(st::mediaFont, (first + ' ' + last).trimmed(), _textNameOptions); - _height = st::mediaPadding.top() + st::mediaThumbSize + st::mediaPadding.bottom(); phonew = st::mediaFont->m.width(phone); if (contact) { @@ -3241,11 +3558,15 @@ void HistoryContact::initDimensions(const HistoryItem *parent) { if (phonew + tleft + st::mediaPadding.right() > _maxw) { _maxw = phonew + tleft + st::mediaPadding.right(); } -} - -int32 HistoryContact::resize(int32 width, bool dontRecountText, const HistoryItem *parent) { - w = qMin(width, _maxw); - return _height; + _minh = st::mediaPadding.top() + st::mediaThumbSize + st::mediaPadding.bottom(); + if (const HistoryReply *reply = toHistoryReply(parent)) { + _maxw += st::mediaPadding.left() + st::mediaPadding.right(); + _minh += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + _minh += st::msgPadding.top() + st::msgNameFont->height; + } + } + _height = _minh; } const QString HistoryContact::inDialogsText() const { @@ -3263,7 +3584,29 @@ bool HistoryContact::hasPoint(int32 x, int32 y, const HistoryItem *parent, int32 TextLinkPtr HistoryContact::getLink(int32 x, int32 y, const HistoryItem *parent, int32 width) const { if (width < 0) width = w; - if (x >= 0 && y >= 0 && x < w && y < _height && contact) { + + const HistoryReply *reply = toHistoryReply(parent); + int skipy = 0, replyFrom = 0; + if (reply) { + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + } + } + + if (reply) { + if (!parent->out() && parent->history()->peer->chat) { + if (x >= st::mediaPadding.left() && y >= st::msgPadding.top() && x < width - st::mediaPadding.left() - st::mediaPadding.right() && x < st::mediaPadding.left() + parent->from()->nameText.maxWidth() && y < replyFrom) { + return parent->from()->lnk; + } + } + if (x >= 0 && y >= replyFrom + st::msgReplyPadding.top() && x < width && y < skipy - st::msgReplyPadding.bottom()) { + return reply->replyToLink(); + } + } + + if (x >= 0 && y >= skipy && x < w && y < _height && contact) { return contact->lnk; } return TextLinkPtr(); @@ -3284,6 +3627,16 @@ void HistoryContact::draw(QPainter &p, const HistoryItem *parent, bool selected, if (width < 0) width = w; if (width < 1) return; + const HistoryReply *reply = toHistoryReply(parent); + int skipy = 0, replyFrom = 0; + if (reply) { + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + } + } + bool out = parent->out(); if (width >= _maxw) { width = _maxw; @@ -3295,7 +3648,16 @@ void HistoryContact::draw(QPainter &p, const HistoryItem *parent, bool selected, style::color shadow(selected ? (out ? st::msgOutSelectShadow : st::msgInSelectShadow) : (out ? st::msgOutShadow : st::msgInShadow)); p.fillRect(0, _height, width, st::msgShadow, shadow->b); - p.drawPixmap(st::mediaPadding.left(), st::mediaPadding.top(), (contact ? contact->photo : userDefPhoto(1))->pix(st::mediaThumbSize)); + if (reply) { + if (!parent->out() && parent->history()->peer->chat) { + p.setFont(st::msgNameFont->f); + p.setPen(parent->from()->color->p); + parent->from()->nameText.drawElided(p, st::mediaPadding.left(), st::msgPadding.top(), width - st::mediaPadding.left() - st::mediaPadding.right()); + } + reply->drawReplyTo(p, st::msgReplyPadding.left(), replyFrom, width - st::msgReplyPadding.left() - st::msgReplyPadding.right(), selected); + } + + p.drawPixmap(st::mediaPadding.left(), skipy + st::mediaPadding.top(), (contact ? contact->photo : userDefPhoto(1))->pix(st::mediaThumbSize)); int32 tleft = st::mediaPadding.left() + st::mediaThumbSize + st::mediaPadding.right(); int32 twidth = width - tleft - st::mediaPadding.right(); @@ -3305,15 +3667,15 @@ void HistoryContact::draw(QPainter &p, const HistoryItem *parent, bool selected, p.setFont(st::mediaFont->f); p.setPen(st::black->c); if (twidth < phonew) { - p.drawText(tleft, st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, st::mediaFont->m.elidedText(phone, Qt::ElideRight, twidth)); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, st::mediaFont->m.elidedText(phone, Qt::ElideRight, twidth)); } else { - p.drawText(tleft, st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, phone); + p.drawText(tleft, skipy + st::mediaPadding.top() + st::mediaNameTop + st::mediaFont->ascent, phone); } style::color status(selected ? (out ? st::mediaOutSelectColor : st::mediaInSelectColor) : (out ? st::mediaOutColor : st::mediaInColor)); p.setPen(status->p); - name.drawElided(p, tleft, st::mediaPadding.top() + st::mediaThumbSize - st::mediaDetailsShift - st::mediaFont->height, secondwidth); + name.drawElided(p, tleft, skipy + st::mediaPadding.top() + st::mediaThumbSize - st::mediaDetailsShift - st::mediaFont->height, secondwidth); p.setFont(st::msgDateFont->f); @@ -3780,68 +4142,95 @@ void HistoryImageLink::initDimensions(const HistoryItem *parent) { w = thumbw; } _maxw = w; - _height = _minh = thumbh; + _minh = thumbh; + if (const HistoryReply *reply = toHistoryReply(parent)) { + _maxw += st::mediaPadding.left() + st::mediaPadding.right(); + _minh += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom() + st::mediaPadding.top() + st::mediaPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + _minh += st::msgPadding.top() + st::msgNameFont->height; + } + } } void HistoryImageLink::draw(QPainter &p, const HistoryItem *parent, bool selected, int32 width) const { if (width < 0) width = w; + int skipx = 0, skipy = 0, height = _height; + if (const HistoryReply *reply = toHistoryReply(parent)) { + skipx = st::mediaPadding.left(); + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom() + st::mediaPadding.top(); + + style::color bg(selected ? (parent->out() ? st::msgOutSelectBG : st::msgInSelectBG) : (parent->out() ? st::msgOutBG : st::msgInBG)); + p.fillRect(QRect(0, 0, width, _height), bg->b); + int replyFrom = 0; + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + p.setFont(st::msgNameFont->f); + p.setPen(parent->from()->color->p); + parent->from()->nameText.drawElided(p, st::mediaPadding.left(), st::msgPadding.top(), width - st::mediaPadding.left() - st::mediaPadding.right()); + } + reply->drawReplyTo(p, st::msgReplyPadding.left(), replyFrom, width - st::msgReplyPadding.left() - st::msgReplyPadding.right(), selected); + + width -= st::mediaPadding.left() + st::mediaPadding.right(); + height -= skipy + st::mediaPadding.bottom(); + } data->load(); bool out = parent->out(); QPixmap toDraw; if (data && !data->thumb->isNull()) { int32 w = data->thumb->width(), h = data->thumb->height(); - if (width * h == _height * w || (w == convertScale(fullWidth()) && h == convertScale(fullHeight()))) { - p.drawPixmap(QPoint(0, 0), data->thumb->pixSingle(width, _height)); + if (width * h == height * w || (w == convertScale(fullWidth()) && h == convertScale(fullHeight()))) { + p.drawPixmap(QPoint(skipx, skipy), data->thumb->pixSingle(width, height)); } else { - p.fillRect(QRect(0, 0, width, _height), st::black->b); - if (width * h > _height * w) { - int32 nw = _height * w / h; - p.drawPixmap(QPoint((width - nw) / 2, 0), data->thumb->pixSingle(nw, _height)); + p.fillRect(QRect(skipx, skipy, width, height), st::black->b); + if (width * h > height * w) { + int32 nw = height * w / h; + p.drawPixmap(QPoint(skipx + (width - nw) / 2, skipy), data->thumb->pixSingle(nw, height)); } else { int32 nh = width * h / w; - p.drawPixmap(QPoint(0, (_height - nh) / 2), data->thumb->pixSingle(width, nh)); + p.drawPixmap(QPoint(skipx, skipy + (height - nh) / 2), data->thumb->pixSingle(width, nh)); } } } else { - p.fillRect(QRect(0, 0, width, _height), st::black->b); + p.fillRect(QRect(skipx, skipy, width, height), st::black->b); } if (data) { switch (data->type) { - case YouTubeLink: p.drawPixmap(QPoint((width - st::youtubeIcon.pxWidth()) / 2, (_height - st::youtubeIcon.pxHeight()) / 2), App::sprite(), st::youtubeIcon); break; - case VimeoLink: p.drawPixmap(QPoint((width - st::youtubeIcon.pxWidth()) / 2, (_height - st::youtubeIcon.pxHeight()) / 2), App::sprite(), st::vimeoIcon); break; + case YouTubeLink: p.drawPixmap(QPoint(skipx + (width - st::youtubeIcon.pxWidth()) / 2, skipy + (height - st::youtubeIcon.pxHeight()) / 2), App::sprite(), st::youtubeIcon); break; + case VimeoLink: p.drawPixmap(QPoint(skipx + (width - st::youtubeIcon.pxWidth()) / 2, skipy + (height - st::youtubeIcon.pxHeight()) / 2), App::sprite(), st::vimeoIcon); break; } if (!data->title.isEmpty() || !data->duration.isEmpty()) { - p.fillRect(0, 0, width, st::msgDateFont->height + 2 * st::msgDateImgPadding.y(), st::msgDateImgBg->b); + p.fillRect(skipx, skipy, width, st::msgDateFont->height + 2 * st::msgDateImgPadding.y(), st::msgDateImgBg->b); p.setFont(st::msgDateFont->f); p.setPen(st::msgDateImgColor->p); int32 titleWidth = width - 2 * st::msgDateImgPadding.x(); if (!data->duration.isEmpty()) { int32 durationWidth = st::msgDateFont->m.width(data->duration); - p.drawText(width - st::msgDateImgPadding.x() - durationWidth, st::msgDateImgPadding.y() + st::msgDateFont->ascent, data->duration); + p.drawText(skipx + width - st::msgDateImgPadding.x() - durationWidth, skipy + st::msgDateImgPadding.y() + st::msgDateFont->ascent, data->duration); titleWidth -= durationWidth + st::msgDateImgPadding.x(); } if (!data->title.isEmpty()) { - p.drawText(st::msgDateImgPadding.x(), st::msgDateImgPadding.y() + st::msgDateFont->ascent, st::msgDateFont->m.elidedText(data->title, Qt::ElideRight, titleWidth)); + p.drawText(skipx + st::msgDateImgPadding.x(), skipy + st::msgDateImgPadding.y() + st::msgDateFont->ascent, st::msgDateFont->m.elidedText(data->title, Qt::ElideRight, titleWidth)); } } } if (selected) { - p.fillRect(0, 0, width, _height, textstyleCurrent()->selectOverlay->b); + p.fillRect(skipx, skipy, width, height, textstyleCurrent()->selectOverlay->b); } style::color shadow(selected ? st::msgInSelectShadow : st::msgInShadow); - p.fillRect(0, _height, width, st::msgShadow, shadow->b); + p.fillRect(0, _height, width + (skipx ? (st::mediaPadding.left() + st::mediaPadding.right()) : 0), st::msgShadow, shadow->b); // date QString time(parent->time()); if (time.isEmpty()) return; - int32 dateX = width - parent->timeWidth() - st::msgDateImgDelta - 2 * st::msgDateImgPadding.x(); - int32 dateY = _height - st::msgDateFont->height - 2 * st::msgDateImgPadding.y() - st::msgDateImgDelta; + int32 dateX = skipx + width - parent->timeWidth() - st::msgDateImgDelta - 2 * st::msgDateImgPadding.x(); + int32 dateY = skipy + height - st::msgDateFont->height - 2 * st::msgDateImgPadding.y() - st::msgDateImgDelta; if (parent->out()) { dateX -= st::msgCheckRect.pxWidth() + st::msgDateImgCheckSpace; } - int32 dateW = width - dateX - st::msgDateImgDelta; - int32 dateH = _height - dateY - st::msgDateImgDelta; + int32 dateW = skipx + width - dateX - st::msgDateImgDelta; + int32 dateH = skipy + height - dateY - st::msgDateImgDelta; p.fillRect(dateX, dateY, dateW, dateH, st::msgDateImgBg->b); if (selected) { @@ -3867,7 +4256,12 @@ void HistoryImageLink::draw(QPainter &p, const HistoryItem *parent, bool selecte } int32 HistoryImageLink::resize(int32 width, bool dontRecountText, const HistoryItem *parent) { + const HistoryReply *reply = toHistoryReply(parent); + w = qMin(width, _maxw); + if (reply) { + w -= st::mediaPadding.left() + st::mediaPadding.right(); + } int32 tw = convertScale(fullWidth()), th = convertScale(fullHeight()); if (tw > st::maxMediaSize) { @@ -3890,6 +4284,13 @@ int32 HistoryImageLink::resize(int32 width, bool dontRecountText, const HistoryI if (_height < st::minPhotoSize) { _height = st::minPhotoSize; } + if (reply) { + w += st::mediaPadding.left() + st::mediaPadding.right(); + _height += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom() + st::mediaPadding.top() + st::mediaPadding.bottom(); + if (!parent->out() && parent->history()->peer->chat) { + _height += st::msgPadding.top() + st::msgNameFont->height; + } + } return _height; } @@ -3924,7 +4325,25 @@ bool HistoryImageLink::hasPoint(int32 x, int32 y, const HistoryItem *parent, int TextLinkPtr HistoryImageLink::getLink(int32 x, int32 y, const HistoryItem *parent, int32 width) const { if (width < 0) width = w; - if (x >= 0 && y >= 0 && x < width && y < _height && data) { + int skipx = 0, skipy = 0, height = _height; + if (const HistoryReply *reply = toHistoryReply(parent)) { + skipx = st::mediaPadding.left(); + skipy = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom() + st::mediaPadding.top(); + height -= st::mediaPadding.bottom(); + int replyFrom = 0; + if (!parent->out() && parent->history()->peer->chat) { + replyFrom = st::msgPadding.top() + st::msgNameFont->height; + skipy += replyFrom; + if (x >= st::mediaPadding.left() && y >= st::msgPadding.top() && x < width - st::mediaPadding.left() - st::mediaPadding.right() && x < st::mediaPadding.left() + parent->from()->nameText.maxWidth() && y < replyFrom) { + return parent->from()->lnk; + } + } + if (x >= 0 && y >= replyFrom + st::msgReplyPadding.top() && x < width && y < skipy - st::msgReplyPadding.bottom() - st::mediaPadding.top()) { + return reply->replyToLink(); + } + width -= st::mediaPadding.left() + st::mediaPadding.right(); + } + if (x >= skipx && y >= skipy && x < skipx + width && y < height && data) { return link; } return TextLinkPtr(); @@ -3935,7 +4354,7 @@ HistoryMedia *HistoryImageLink::clone() const { } HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, const MTPDmessage &msg) : - HistoryItem(history, block, msg.vid.v, (msg.vflags.v & MTPDmessage_flag_out), (msg.vflags.v & MTPDmessage_flag_unread), ::date(msg.vdate), msg.vfrom_id.v) + HistoryItem(history, block, msg.vid.v, msg.vflags.v, ::date(msg.vdate), msg.vfrom_id.v) , _text(st::msgMinWidth) , _textWidth(0) , _textHeight(0) @@ -3946,8 +4365,8 @@ HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, const MTPD initDimensions(text); } -HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, bool out, bool unread, QDateTime date, int32 from, const QString &msg, const MTPMessageMedia &media) : - HistoryItem(history, block, msgId, out, unread, date, from) +HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, int32 flags, QDateTime date, int32 from, const QString &msg, const MTPMessageMedia &media) : +HistoryItem(history, block, msgId, flags, date, from) , _text(st::msgMinWidth) , _textWidth(0) , _textHeight(0) @@ -3958,8 +4377,8 @@ HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgI initDimensions(text); } -HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, bool out, bool unread, QDateTime date, int32 from, const QString &msg, HistoryMedia *fromMedia) : - HistoryItem(history, block, msgId, out, unread, date, from) +HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, int32 flags, QDateTime date, int32 from, const QString &msg, HistoryMedia *fromMedia) : +HistoryItem(history, block, msgId, flags, date, from) , _text(st::msgMinWidth) , _textWidth(0) , _textHeight(0) @@ -3972,8 +4391,8 @@ HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgI 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) +HistoryMessage::HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, int32 flags, QDateTime date, int32 from, DocumentData *doc) : +HistoryItem(history, block, msgId, flags, date, from) , _text(st::msgMinWidth) , _textWidth(0) , _textHeight(0) @@ -4050,7 +4469,6 @@ void HistoryMessage::initDimensions(const QString &text) { _timeWidth += st::msgDateSpace + (out() ? st::msgDateCheckSpace + st::msgCheckRect.pxWidth() : 0) - st::msgDateDelta.x(); _text.setText(st::msgFont, text + textcmdSkipBlock(_timeWidth, st::msgDateFont->height - st::msgDateDelta.y()), _historyTextOptions); } - initDimensions(); } void HistoryMessage::initDimensions(const HistoryItem *parent) { @@ -4068,7 +4486,7 @@ void HistoryMessage::initDimensions(const HistoryItem *parent) { void HistoryMessage::fromNameUpdated() const { if (_media) return; - int32 _namew = ((!_out && _history->peer->chat) ? _from->nameText.maxWidth() : 0) + st::msgPadding.left() + st::msgPadding.right(); + int32 _namew = ((!out() && _history->peer->chat) ? _from->nameText.maxWidth() : 0) + st::msgPadding.left() + st::msgPadding.right(); if (_namew > _maxw) _maxw = _namew; } @@ -4085,6 +4503,10 @@ QString HistoryMessage::selectedText(uint32 selection) const { return _text.original(selectedFrom, selectedTo); } +QString HistoryMessage::inDialogsText() const { + return _media ? _media->inDialogsText() : _text.original(0, 0xFFFF, false); +} + HistoryMedia *HistoryMessage::getMedia(bool inOverview) const { return _media; } @@ -4112,17 +4534,17 @@ void HistoryMessage::draw(QPainter &p, uint32 selection) const { fromNameUpdated(); _fromVersion = _from->nameVersion; } - int32 left = _out ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(), mwidth = st::msgMaxWidth; + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(), mwidth = st::msgMaxWidth; if (_media) { if (_media->maxWidth() > mwidth) mwidth = _media->maxWidth(); if (_media->currentWidth() < mwidth) mwidth = _media->currentWidth(); } if (width > mwidth) { - if (_out) left += width - mwidth; + if (out()) left += width - mwidth; width = mwidth; } - if (!_out && _history->peer->chat) { + if (!out() && _history->peer->chat) { p.drawPixmap(left, _height - st::msgMargin.bottom() - st::msgPhotoSize, _from->photo->pix(st::msgPhotoSize)); // width -= st::msgPhotoSkip; left += st::msgPhotoSkip; @@ -4130,10 +4552,13 @@ void HistoryMessage::draw(QPainter &p, uint32 selection) const { if (width < 1) return; if (width >= _maxw) { - if (_out) left += width - _maxw; + if (out()) left += width - _maxw; width = _maxw; } if (_media) { + if (st::msgMargin.top() + _media->height() + st::msgMargin.bottom() != _height) { + int a = 0; + } p.save(); p.translate(left, st::msgMargin.top()); _media->draw(p, this, selected); @@ -4141,13 +4566,13 @@ void HistoryMessage::draw(QPainter &p, uint32 selection) const { } else { QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); - style::color bg(selected ? (_out ? st::msgOutSelectBG : st::msgInSelectBG) : (_out ? st::msgOutBG : st::msgInBG)); + style::color bg(selected ? (out() ? st::msgOutSelectBG : st::msgInSelectBG) : (out() ? st::msgOutBG : st::msgInBG)); p.fillRect(r, bg->b); - style::color shadow(selected ? (_out ? st::msgOutSelectShadow : st::msgInSelectShadow) : (_out ? st::msgOutShadow : st::msgInShadow)); + style::color shadow(selected ? (out() ? st::msgOutSelectShadow : st::msgInSelectShadow) : (out() ? st::msgOutShadow : st::msgInShadow)); p.fillRect(left, _height - st::msgMargin.bottom(), width, st::msgShadow, shadow->b); - if (!_out && _history->peer->chat) { + if (!out() && _history->peer->chat) { p.setFont(st::msgNameFont->f); p.setPen(_from->color->p); _from->nameText.drawElided(p, r.left() + st::msgPadding.left(), r.top() + st::msgPadding.top(), width - st::msgPadding.left() - st::msgPadding.right()); @@ -4158,11 +4583,11 @@ void HistoryMessage::draw(QPainter &p, uint32 selection) const { p.setFont(st::msgDateFont->f); - style::color date(selected ? (_out ? st::msgOutSelectDateColor : st::msgInSelectDateColor) : (_out ? st::msgOutDateColor : st::msgInDateColor)); + style::color date(selected ? (out() ? st::msgOutSelectDateColor : st::msgInSelectDateColor) : (out() ? st::msgOutDateColor : st::msgInDateColor)); p.setPen(date->p); p.drawText(r.right() - st::msgPadding.right() + st::msgDateDelta.x() - _timeWidth + st::msgDateSpace, r.bottom() - st::msgPadding.bottom() + st::msgDateDelta.y() - st::msgDateFont->descent, _time); - if (_out) { + if (out()) { QPoint iconPos(r.right() + 5 - st::msgPadding.right() - st::msgCheckRect.pxWidth(), r.bottom() + 1 - st::msgPadding.bottom() + st::msgDateDelta.y() - st::msgCheckRect.pxHeight()); const QRect *iconRect; if (id > 0) { @@ -4211,7 +4636,7 @@ int32 HistoryMessage::resize(int32 width, bool dontRecountText, const HistoryIte } else { _height = _textHeight; } - if (!_out && _history->peer->chat) { + if (!out() && _history->peer->chat) { _height += st::msgNameFont->height; } _height += st::msgPadding.top() + st::msgPadding.bottom(); @@ -4221,23 +4646,23 @@ int32 HistoryMessage::resize(int32 width, bool dontRecountText, const HistoryIte } bool HistoryMessage::hasPoint(int32 x, int32 y) const { - int32 left = _out ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(), mwidth = st::msgMaxWidth; + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(), mwidth = st::msgMaxWidth; if (_media) { if (_media->maxWidth() > mwidth) mwidth = _media->maxWidth(); if (_media->currentWidth() < mwidth) mwidth = _media->currentWidth(); } if (width > mwidth) { - if (_out) left += width - mwidth; + if (out()) left += width - mwidth; width = mwidth; } - if (!_out && _history->peer->chat) { // from user left photo + if (!out() && _history->peer->chat) { // from user left photo left += st::msgPhotoSkip; } if (width < 1) return false; if (width >= _maxw) { - if (_out) left += width - _maxw; + if (out()) left += width - _maxw; width = _maxw; } if (_media) { @@ -4251,17 +4676,17 @@ void HistoryMessage::getState(TextLinkPtr &lnk, bool &inText, int32 x, int32 y) inText = false; lnk = TextLinkPtr(); - int32 left = _out ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(), mwidth = st::msgMaxWidth; + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(), mwidth = st::msgMaxWidth; if (_media) { if (_media->maxWidth() > mwidth) mwidth = _media->maxWidth(); if (_media->currentWidth() < mwidth) mwidth = _media->currentWidth(); } if (width > mwidth) { - if (_out) left += width - mwidth; + if (out()) left += width - mwidth; width = mwidth; } - if (!_out && _history->peer->chat) { // from user left photo + if (!out() && _history->peer->chat) { // from user left photo if (x >= left && x < left + st::msgPhotoSize && y >= _height - st::msgMargin.bottom() - st::msgPhotoSize && y < _height - st::msgMargin.bottom()) { lnk = _from->lnk; return; @@ -4272,7 +4697,7 @@ void HistoryMessage::getState(TextLinkPtr &lnk, bool &inText, int32 x, int32 y) if (width < 1) return; if (width >= _maxw) { - if (_out) left += width - _maxw; + if (out()) left += width - _maxw; width = _maxw; } if (_media) { @@ -4280,7 +4705,7 @@ void HistoryMessage::getState(TextLinkPtr &lnk, bool &inText, int32 x, int32 y) return; } QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); - if (!_out && _history->peer->chat) { // from user left name + if (!out() && _history->peer->chat) { // from user left name if (x >= r.left() + st::msgPadding.left() && y >= r.top() + st::msgPadding.top() && y < r.top() + st::msgPadding.top() + st::msgNameFont->height && x < r.right() - st::msgPadding.right() && x < r.left() + st::msgPadding.left() + _from->nameText.maxWidth()) { lnk = _from->lnk; return; @@ -4297,24 +4722,24 @@ void HistoryMessage::getSymbol(uint16 &symbol, bool &after, bool &upon, int32 x, upon = false; if (_media) return; - int32 left = _out ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); if (width > st::msgMaxWidth) { - if (_out) left += width - st::msgMaxWidth; + if (out()) left += width - st::msgMaxWidth; width = st::msgMaxWidth; } - if (!_out && _history->peer->chat) { // from user left photo + if (!out() && _history->peer->chat) { // from user left photo // width -= st::msgPhotoSkip; left += st::msgPhotoSkip; } if (width < 1) return; if (width >= _maxw) { - if (_out) left += width - _maxw; + if (out()) left += width - _maxw; width = _maxw; } QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); - if (!_out && _history->peer->chat) { // from user left name + if (!out() && _history->peer->chat) { // from user left name r.setTop(r.top() + st::msgNameFont->height); } QRect trect(r.marginsAdded(-st::msgPadding)); @@ -4324,7 +4749,7 @@ void HistoryMessage::getSymbol(uint16 &symbol, bool &after, bool &upon, int32 x, void HistoryMessage::drawInDialog(QPainter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const { if (cacheFor != this) { cacheFor = this; - QString msg(_media ? _media->inDialogsText() : _text.original(0, 0xFFFF, false)); + QString msg(inDialogsText()); if (_history->peer->chat || out()) { TextCustomTagsMap custom; custom.insert(QChar('c'), qMakePair(textcmdStartLink(1), textcmdStopLink())); @@ -4348,7 +4773,7 @@ QString HistoryMessage::notificationHeader() const { } QString HistoryMessage::notificationText() const { - QString msg(_media ? _media->inDialogsText() : _text.original(0, 0xFFFF, false)); + QString msg(inDialogsText()); if (msg.size() > 0xFF) msg = msg.mid(0, 0xFF) + qsl(".."); return msg; } @@ -4369,20 +4794,18 @@ HistoryMessage::~HistoryMessage() { delete _media; } -HistoryForwarded::HistoryForwarded(History *history, HistoryBlock *block, const MTPDmessage &msg) : HistoryMessage(history, block, msg.vid.v, (msg.vflags.v & MTPDmessage_flag_out), (msg.vflags.v & MTPDmessage_flag_unread), ::date(msg.vdate), msg.vfrom_id.v, textClean(qs(msg.vmessage)), msg.vmedia) +HistoryForwarded::HistoryForwarded(History *history, HistoryBlock *block, const MTPDmessage &msg) : HistoryMessage(history, block, msg.vid.v, msg.vflags.v, ::date(msg.vdate), msg.vfrom_id.v, textClean(qs(msg.vmessage)), msg.vmedia) , fwdDate(::date(msg.vfwd_date)) , fwdFrom(App::user(msg.vfwd_from_id.v)) -, fwdFromName(4096) , fwdFromVersion(fwdFrom->nameVersion) , fromWidth(st::msgServiceFont->m.width(lang(lng_forwarded_from)) + st::msgServiceFont->spacew) { fwdNameUpdated(); } -HistoryForwarded::HistoryForwarded(History *history, HistoryBlock *block, MsgId id, HistoryMessage *msg) : HistoryMessage(history, block, id, (history->peer->input.type() != mtpc_inputPeerSelf), (history->peer->input.type() != mtpc_inputPeerSelf), ::date(unixtime()), MTP::authedId(), msg->HistoryMessage::selectedText(FullItemSel), msg->getMedia()) -, fwdDate(dynamic_cast(msg) ? dynamic_cast(msg)->dateForwarded() : msg->date) -, fwdFrom(dynamic_cast(msg) ? dynamic_cast(msg)->fromForwarded() : msg->from()) -, fwdFromName(4096) +HistoryForwarded::HistoryForwarded(History *history, HistoryBlock *block, MsgId id, HistoryMessage *msg) : HistoryMessage(history, block, id, (history->peer->input.type() != mtpc_inputPeerSelf) ? (MTPDmessage_flag_out | MTPDmessage_flag_unread) : 0, ::date(unixtime()), MTP::authedId(), msg->HistoryMessage::selectedText(FullItemSel), msg->getMedia()) +, fwdDate(msg->dateForwarded()) +, fwdFrom(msg->fromForwarded()) , fwdFromVersion(fwdFrom->nameVersion) , fromWidth(st::msgServiceFont->m.width(lang(lng_forwarded_from)) + st::msgServiceFont->spacew) { @@ -4392,11 +4815,16 @@ HistoryForwarded::HistoryForwarded(History *history, HistoryBlock *block, MsgId QString HistoryForwarded::selectedText(uint32 selection) const { if (selection != FullItemSel) return HistoryMessage::selectedText(selection); QString result, original = HistoryMessage::selectedText(selection); - result.reserve(lang(lng_forwarded_from).size() + fwdFrom->name.size() + 3 + original.size()); - result.append('[').append(lang(lng_forwarded_from)).append(fwdFrom->name).append(qsl("]\n")).append(original); + result.reserve(lang(lng_forwarded_from).size() + fwdFrom->name.size() + 4 + original.size()); + result.append('[').append(lang(lng_forwarded_from)).append(' ').append(fwdFrom->name).append(qsl("]\n")).append(original); return result; } +void HistoryForwarded::initDimensions(const HistoryItem *parent) { + HistoryMessage::initDimensions(parent); + fwdNameUpdated(); +} + void HistoryForwarded::fwdNameUpdated() const { if (_media) return; fwdFromName.setText(st::msgServiceNameFont, App::peerName(fwdFrom), _textNameOptions); @@ -4414,7 +4842,8 @@ void HistoryForwarded::draw(QPainter &p, uint32 selection) const { void HistoryForwarded::drawMessageText(QPainter &p, const QRect &trect, uint32 selection) const { style::font serviceFont(st::msgServiceFont), serviceName(st::msgServiceNameFont); - p.setPen((_out ? st::msgOutServiceColor : st::msgInServiceColor)->p); + bool selected = (selection == FullItemSel); + p.setPen((selected ? (out() ? st::msgOutServiceSelColor : st::msgInServiceSelColor) : (out() ? st::msgOutServiceColor : st::msgInServiceColor))->p); p.setFont(serviceFont->f); int32 h1 = 0, h2 = serviceName->height, h = h1 + (h1 > h2 ? h1 : h2); @@ -4444,20 +4873,20 @@ int32 HistoryForwarded::resize(int32 width, bool dontRecountText, const HistoryI bool HistoryForwarded::hasPoint(int32 x, int32 y) const { if (!_media) { - int32 left = _out ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); if (width > st::msgMaxWidth) { - if (_out) left += width - st::msgMaxWidth; + if (out()) left += width - st::msgMaxWidth; width = st::msgMaxWidth; } - if (!_out && _history->peer->chat) { // from user left photo + if (!out() && _history->peer->chat) { // from user left photo // width -= st::msgPhotoSkip; left += st::msgPhotoSkip; } if (width < 1) return false; if (width >= _maxw) { - if (_out) left += width - _maxw; + if (out()) left += width - _maxw; width = _maxw; } QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); @@ -4471,13 +4900,13 @@ void HistoryForwarded::getState(TextLinkPtr &lnk, bool &inText, int32 x, int32 y inText = false; if (!_media) { - int32 left = _out ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); if (width > st::msgMaxWidth) { - if (_out) left += width - st::msgMaxWidth; + if (out()) left += width - st::msgMaxWidth; width = st::msgMaxWidth; } - if (!_out && _history->peer->chat) { // from user left photo + if (!out() && _history->peer->chat) { // from user left photo if (x >= left && x < left + st::msgPhotoSize) { return HistoryMessage::getState(lnk, inText, x, y); } @@ -4487,11 +4916,11 @@ void HistoryForwarded::getState(TextLinkPtr &lnk, bool &inText, int32 x, int32 y if (width < 1) return; if (width >= _maxw) { - if (_out) left += width - _maxw; + if (out()) left += width - _maxw; width = _maxw; } QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); - if (!_out && _history->peer->chat) { + if (!out() && _history->peer->chat) { style::font nameFont(st::msgNameFont); if (y >= r.top() + st::msgPadding.top() && y < r.top() + st::msgPadding.top() + nameFont->height) { return HistoryMessage::getState(lnk, inText, x, y); @@ -4518,24 +4947,24 @@ void HistoryForwarded::getSymbol(uint16 &symbol, bool &after, bool &upon, int32 upon = false; if (!_media) { - int32 left = _out ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); if (width > st::msgMaxWidth) { - if (_out) left += width - st::msgMaxWidth; + if (out()) left += width - st::msgMaxWidth; width = st::msgMaxWidth; } - if (!_out && _history->peer->chat) { // from user left photo + if (!out() && _history->peer->chat) { // from user left photo // width -= st::msgPhotoSkip; left += st::msgPhotoSkip; } if (width < 1) return; if (width >= _maxw) { - if (_out) left += width - _maxw; + if (out()) left += width - _maxw; width = _maxw; } QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); - if (!_out && _history->peer->chat) { + if (!out() && _history->peer->chat) { style::font nameFont(st::msgNameFont); if (y >= r.top() + st::msgPadding.top() && y < r.top() + st::msgPadding.top() + nameFont->height) { return HistoryMessage::getSymbol(symbol, after, upon, x, y); @@ -4550,6 +4979,311 @@ void HistoryForwarded::getSymbol(uint16 &symbol, bool &after, bool &upon, int32 return HistoryMessage::getSymbol(symbol, after, upon, x, y); } +HistoryReply::HistoryReply(History *history, HistoryBlock *block, const MTPDmessage &msg) : HistoryMessage(history, block, msg.vid.v, msg.vflags.v, ::date(msg.vdate), msg.vfrom_id.v, textClean(qs(msg.vmessage)), msg.vmedia) +, replyToMsgId(msg.vreply_to_msg_id.v) +, replyToMsg(0) +, replyToVersion(0) +, _maxReplyWidth(0) +{ + if (!updateReplyTo()) { + App::api()->requestReplyTo(this, replyToMsgId); + } +} + +HistoryReply::HistoryReply(History *history, HistoryBlock *block, MsgId msgId, int32 flags, MsgId replyTo, QDateTime date, int32 from, DocumentData *doc) : HistoryMessage(history, block, msgId, flags, date, from, doc) +, replyToMsgId(replyTo) +, replyToMsg(0) +, replyToVersion(0) +, _maxReplyWidth(0) +{ + if (!updateReplyTo()) { + App::api()->requestReplyTo(this, replyToMsgId); + } +} + +QString HistoryReply::selectedText(uint32 selection) const { + if (selection != FullItemSel || !replyToMsg) return HistoryMessage::selectedText(selection); + QString result, original = HistoryMessage::selectedText(selection); + result.reserve(lang(lng_in_reply_to).size() + replyToMsg->from()->name.size() + 4 + original.size()); + result.append('[').append(lang(lng_in_reply_to)).append(' ').append(replyToMsg->from()->name).append(qsl("]\n")).append(original); + return result; +} + +void HistoryReply::initDimensions(const HistoryItem *parent) { + if (!replyToMsg) { + _maxReplyWidth = st::msgReplyBarSkip + st::msgDateFont->m.width(lang(replyToMsgId ? lng_profile_loading : lng_deleted_message)) + st::msgPadding.left() + st::msgPadding.right(); + } + HistoryMessage::initDimensions(parent); + if (replyToMsg) { + replyToNameUpdated(); + } else if (!_media) { + int maxw = _maxReplyWidth - st::msgReplyPadding.left() - st::msgReplyPadding.right() + st::msgPadding.left() + st::msgPadding.right(); + if (maxw > _maxw) _maxw = maxw; + } +} + +bool HistoryReply::updateReplyTo(bool force) { + if (replyToMsg || !replyToMsgId) return true; + replyToMsg = App::histItemById(replyToMsgId); + if (replyToMsg) { + App::historyRegReply(this, replyToMsg); + replyToText.setText(st::msgFont, replyToMsg->inReplyText(), _textDlgOptions); + + replyToNameUpdated(); + + replyToLnk = TextLinkPtr(new MessageLink(replyToMsg->history()->peer->id, replyToMsg->id)); + } else if (force) { + replyToMsgId = 0; + } + if (force) { + initDimensions(); + if (App::main()) App::main()->msgUpdated(history()->peer->id, this); + } + return (replyToMsg || !replyToMsgId); +} + +void HistoryReply::replyToNameUpdated() const { + if (!replyToMsg) return; + replyToName.setText(st::msgServiceNameFont, App::peerName(replyToMsg->from()), _textNameOptions); + replyToVersion = replyToMsg->from()->nameVersion; + bool hasPreview = replyToMsg->getMedia() ? replyToMsg->getMedia()->hasReplyPreview() : false; + int previewSkip = hasPreview ? (st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() - st::msgReplyBarPos.x()) : 0; + + _maxReplyWidth = st::msgReplyPadding.left() + st::msgReplyBarSkip + previewSkip + replyToName.maxWidth() + st::msgReplyPadding.right(); + int32 _textw = st::msgReplyPadding.left() + st::msgReplyBarSkip + previewSkip + qMin(replyToText.maxWidth(), 2 * replyToName.maxWidth()) + st::msgReplyPadding.right(); + if (_textw > _maxReplyWidth) _maxReplyWidth = _textw; + if (!_media) { + int maxw = _maxReplyWidth - st::msgReplyPadding.left() - st::msgReplyPadding.right() + st::msgPadding.left() + st::msgPadding.right(); + if (maxw > _maxw) _maxw = maxw; + } +} + +int32 HistoryReply::replyToWidth() const { + return _maxReplyWidth; +} + +TextLinkPtr HistoryReply::replyToLink() const { + return replyToLnk; +} + +MsgId HistoryReply::replyToId() const { + return replyToMsgId; +} + +HistoryItem *HistoryReply::replyToMessage() const { + return replyToMsg; +} + +void HistoryReply::replyToReplaced(HistoryItem *oldItem, HistoryItem *newItem) { + if (replyToMsg == oldItem) { + replyToMsg = newItem; + if (!newItem) { + replyToMsgId = 0; + initDimensions(); + } + } +} + +void HistoryReply::draw(QPainter &p, uint32 selection) const { + if (replyToMsg && replyToMsg->from()->nameVersion > replyToVersion) { + replyToNameUpdated(); + } + HistoryMessage::draw(p, selection); +} + +void HistoryReply::drawReplyTo(QPainter &p, int32 x, int32 y, int32 w, bool selected, bool likeService) const { + style::color bar; + if (likeService) { + bar = st::white; + } else { + bar = (selected ? (out() ? st::msgOutReplyBarSelColor : st::msgInReplyBarSelColor) : (out() ? st::msgOutReplyBarColor : st::msgInReplyBarColor)); + } + p.fillRect(x + st::msgReplyBarPos.x(), y + st::msgReplyPadding.top() + st::msgReplyBarPos.y(), st::msgReplyBarSize.width(), st::msgReplyBarSize.height(), bar->b); + + if (w > st::msgReplyBarSkip) { + if (replyToMsg) { + bool hasPreview = replyToMsg->getMedia() ? replyToMsg->getMedia()->hasReplyPreview() : false; + int previewSkip = hasPreview ? (st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() - st::msgReplyBarPos.x()) : 0; + + if (hasPreview) { + ImagePtr replyPreview = replyToMsg->getMedia()->replyPreview(); + if (!replyPreview->isNull()) { + QRect to(x + st::msgReplyBarSkip, y + st::msgReplyPadding.top() + st::msgReplyBarPos.y(), st::msgReplyBarSize.height(), st::msgReplyBarSize.height()); + if (replyPreview->width() == replyPreview->height()) { + p.drawPixmap(to.x(), to.y(), replyPreview->pix()); + } else { + QRect from = (replyPreview->width() > replyPreview->height()) ? QRect((replyPreview->width() - replyPreview->height()) / 2, 0, replyPreview->height(), replyPreview->height()) : QRect(0, (replyPreview->height() - replyPreview->width()) / 2, replyPreview->width(), replyPreview->width()); + p.drawPixmap(to, replyPreview->pix(), from); + } + if (selected) { + p.fillRect(to, textstyleCurrent()->selectOverlay->b); + } + } + } + if (w > st::msgReplyBarSkip + previewSkip) { + if (likeService) { + p.setPen(st::white->p); + } else { + p.setPen((selected ? (out() ? st::msgOutServiceSelColor : st::msgInServiceSelColor) : (out() ? st::msgOutServiceColor : st::msgInServiceColor))->p); + } + replyToName.drawElided(p, x + st::msgReplyBarSkip + previewSkip, y + st::msgReplyPadding.top(), w - st::msgReplyBarSkip - previewSkip); + + if (likeService) { + } else if (replyToMsg->getMedia() || replyToMsg->serviceMsg()) { + style::color date(selected ? (out() ? st::msgOutSelectDateColor : st::msgInSelectDateColor) : (out() ? st::msgOutDateColor : st::msgInDateColor)); + p.setPen(date->p); + } else { + p.setPen(st::msgColor->p); + } + replyToText.drawElided(p, x + st::msgReplyBarSkip + previewSkip, y + st::msgReplyPadding.top() + st::msgServiceNameFont->height, w - st::msgReplyBarSkip - previewSkip); + } + } else { + p.setFont(st::msgDateFont->f); + style::color date(selected ? (out() ? st::msgOutSelectDateColor : st::msgInSelectDateColor) : (out() ? st::msgOutDateColor : st::msgInDateColor)); + if (likeService) { + p.setPen(st::white->p); + } else { + p.setPen(date->p); + } + p.drawText(x + st::msgReplyBarSkip, y + st::msgReplyPadding.top() + (st::msgReplyBarSize.height() - st::msgDateFont->height) / 2 + st::msgDateFont->ascent, st::msgDateFont->m.elidedText(lang(replyToMsgId ? lng_profile_loading : lng_deleted_message), Qt::ElideRight, w - st::msgReplyBarSkip)); + } + } +} + +void HistoryReply::drawMessageText(QPainter &p, const QRect &trect, uint32 selection) const { + int32 h = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + + drawReplyTo(p, trect.x(), trect.y(), trect.width(), (selection == FullItemSel)); + + QRect realtrect(trect); + realtrect.setY(trect.y() + h); + HistoryMessage::drawMessageText(p, realtrect, selection); +} + +int32 HistoryReply::resize(int32 width, bool dontRecountText, const HistoryItem *parent) { + HistoryMessage::resize(width, dontRecountText, parent); + if (!_media && !dontRecountText) { + _height += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + } + return _height; +} + +bool HistoryReply::hasPoint(int32 x, int32 y) const { + if (!_media) { + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); + if (width > st::msgMaxWidth) { + if (out()) left += width - st::msgMaxWidth; + width = st::msgMaxWidth; + } + + if (!out() && _history->peer->chat) { // from user left photo +// width -= st::msgPhotoSkip; + left += st::msgPhotoSkip; + } + if (width < 1) return false; + + if (width >= _maxw) { + if (out()) left += width - _maxw; + width = _maxw; + } + QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); + return r.contains(x, y); + } + return HistoryMessage::hasPoint(x, y); +} + +void HistoryReply::getState(TextLinkPtr &lnk, bool &inText, int32 x, int32 y) const { + lnk = TextLinkPtr(); + inText = false; + + if (!_media) { + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); + if (width > st::msgMaxWidth) { + if (out()) left += width - st::msgMaxWidth; + width = st::msgMaxWidth; + } + + if (!out() && _history->peer->chat) { // from user left photo + if (x >= left && x < left + st::msgPhotoSize) { + return HistoryMessage::getState(lnk, inText, x, y); + } +// width -= st::msgPhotoSkip; + left += st::msgPhotoSkip; + } + if (width < 1) return; + + if (width >= _maxw) { + if (out()) left += width - _maxw; + width = _maxw; + } + QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); + if (!out() && _history->peer->chat) { + style::font nameFont(st::msgNameFont); + if (y >= r.top() + st::msgPadding.top() && y < r.top() + st::msgPadding.top() + nameFont->height) { + return HistoryMessage::getState(lnk, inText, x, y); + } + r.setTop(r.top() + nameFont->height); + } + QRect trect(r.marginsAdded(-st::msgPadding)); + + int32 h = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + if (y >= trect.top() && y < trect.top() + h) { + if (replyToMsg && y >= trect.top() + st::msgReplyPadding.top() && y < trect.top() + st::msgReplyPadding.top() + st::msgReplyBarSize.height() && x >= trect.left() && x < trect.right()) { + lnk = replyToLnk; + } + return; + } + y -= h; + } + return HistoryMessage::getState(lnk, inText, x, y); +} + +void HistoryReply::getSymbol(uint16 &symbol, bool &after, bool &upon, int32 x, int32 y) const { + symbol = 0; + after = false; + upon = false; + + if (!_media) { + int32 left = out() ? st::msgMargin.right() : st::msgMargin.left(), width = _history->width - st::msgMargin.left() - st::msgMargin.right(); + if (width > st::msgMaxWidth) { + if (out()) left += width - st::msgMaxWidth; + width = st::msgMaxWidth; + } + + if (!out() && _history->peer->chat) { // from user left photo +// width -= st::msgPhotoSkip; + left += st::msgPhotoSkip; + } + if (width < 1) return; + + if (width >= _maxw) { + if (out()) left += width - _maxw; + width = _maxw; + } + QRect r(left, st::msgMargin.top(), width, _height - st::msgMargin.top() - st::msgMargin.bottom()); + if (!out() && _history->peer->chat) { + style::font nameFont(st::msgNameFont); + if (y >= r.top() + st::msgPadding.top() && y < r.top() + st::msgPadding.top() + nameFont->height) { + return HistoryMessage::getSymbol(symbol, after, upon, x, y); + } + r.setTop(r.top() + nameFont->height); + } + QRect trect(r.marginsAdded(-st::msgPadding)); + + int32 h = st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); + y -= h; + } + return HistoryMessage::getSymbol(symbol, after, upon, x, y); +} + +HistoryReply::~HistoryReply() { + if (replyToMsg) { + App::historyUnregReply(this, replyToMsg); + } else if (replyToMsgId) { + App::api()->itemRemoved(this); + } +} + void HistoryServiceMsg::setMessageByAction(const MTPmessageAction &action) { TextLinkPtr second; LangString text = lang(lng_message_empty); @@ -4614,20 +5348,18 @@ void HistoryServiceMsg::setMessageByAction(const MTPmessageAction &action) { } HistoryServiceMsg::HistoryServiceMsg(History *history, HistoryBlock *block, const MTPDmessageService &msg) : - HistoryItem(history, block, msg.vid.v, (msg.vflags.v & MTPDmessage_flag_out), (msg.vflags.v & MTPDmessage_flag_unread), ::date(msg.vdate), msg.vfrom_id.v) + HistoryItem(history, block, msg.vid.v, msg.vflags.v, ::date(msg.vdate), msg.vfrom_id.v) , _text(st::msgMinWidth) , _media(0) { setMessageByAction(msg.vaction); - initDimensions(); } -HistoryServiceMsg::HistoryServiceMsg(History *history, HistoryBlock *block, MsgId msgId, QDateTime date, const QString &msg, bool out, bool unread, HistoryMedia *media) : - HistoryItem(history, block, msgId, out, unread, date, 0) +HistoryServiceMsg::HistoryServiceMsg(History *history, HistoryBlock *block, MsgId msgId, QDateTime date, const QString &msg, int32 flags, HistoryMedia *media) : + HistoryItem(history, block, msgId, flags, date, 0) , _text(st::msgServiceFont, msg, _historySrvOptions, st::dlgMinWidth) , _media(media) { - initDimensions(); } void HistoryServiceMsg::initDimensions(const HistoryItem *parent) { @@ -4642,7 +5374,32 @@ QString HistoryServiceMsg::selectedText(uint32 selection) const { return _text.original(selectedFrom, selectedTo); } +QString HistoryServiceMsg::inDialogsText() const { + return _text.original(0, 0xFFFF, false); +} + +QString HistoryServiceMsg::inReplyText() const { + QString result = HistoryServiceMsg::inDialogsText(); + return result.trimmed().startsWith(from()->name) ? result.trimmed().mid(from()->name.size()).trimmed() : result; +} + void HistoryServiceMsg::draw(QPainter &p, uint32 selection) const { + if (id == _history->activeMsgId) { + uint64 ms = App::main() ? App::main()->animActiveTime() : 0; + if (ms) { + if (ms > st::activeFadeInDuration + st::activeFadeOutDuration) { + App::main()->stopAnimActive(); + } else { + textstyleSet(&st::inTextStyle); + float64 dt = (ms > st::activeFadeInDuration) ? (1 - (ms - st::activeFadeInDuration) / float64(st::activeFadeOutDuration)) : (ms / float64(st::activeFadeInDuration)); + float64 o = p.opacity(); + p.setOpacity(o * dt); + p.fillRect(0, 0, _history->width, _height, textstyleCurrent()->selectOverlay->b); + p.setOpacity(o); + } + } + } + textstyleSet(&st::serviceTextStyle); int32 left = st::msgServiceMargin.left(), width = _history->width - st::msgServiceMargin.left() - st::msgServiceMargin.left(), height = _height - st::msgServiceMargin.top() - st::msgServiceMargin.bottom(); // two small margins @@ -4699,7 +5456,7 @@ int32 HistoryServiceMsg::resize(int32 width, bool dontRecountText, const History } _height += st::msgServicePadding.top() + st::msgServicePadding.bottom() + st::msgServiceMargin.top() + st::msgServiceMargin.bottom(); if (_media) { - _height += st::msgServiceMargin.top() + _media->height(); + _height += st::msgServiceMargin.top() + _media->resize(_media->currentWidth()); } return _height; } @@ -4751,7 +5508,7 @@ void HistoryServiceMsg::getSymbol(uint16 &symbol, bool &after, bool &upon, int32 void HistoryServiceMsg::drawInDialog(QPainter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const { if (cacheFor != this) { cacheFor = this; - cache.setText(st::dlgHistFont, _text.original(0, 0xFFFF), _textDlgOptions); + cache.setText(st::dlgHistFont, inDialogsText(), _textDlgOptions); } QRect tr(r); p.setPen((act ? st::dlgActiveColor : st::dlgSystemColor)->p); @@ -4779,7 +5536,7 @@ HistoryItem *createDayServiceMsg(History *history, HistoryBlock *block, QDateTim return regItem(new HistoryDateMsg(history, block, date.date())); } -HistoryUnreadBar::HistoryUnreadBar(History *history, HistoryBlock *block, int32 count, const QDateTime &date) : HistoryItem(history, block, clientMsgId(), false, false, date, 0), freezed(false) { +HistoryUnreadBar::HistoryUnreadBar(History *history, HistoryBlock *block, int32 count, const QDateTime &date) : HistoryItem(history, block, clientMsgId(), 0, date, 0), freezed(false) { setCount(count); initDimensions(); } diff --git a/Telegram/SourceFiles/history.h b/Telegram/SourceFiles/history.h index 6421a57ec7..6e5896cf2b 100644 --- a/Telegram/SourceFiles/history.h +++ b/Telegram/SourceFiles/history.h @@ -164,6 +164,8 @@ struct ChatData : public PeerData { Participants participants; typedef QMap CanKick; CanKick cankick; + typedef QList LastAuthors; + LastAuthors lastAuthors; ImagePtr photoFull; PhotoId photoId; // geo @@ -176,6 +178,7 @@ struct PhotoData { } void forget() { thumb->forget(); + replyPreview->forget(); medium->forget(); full->forget(); } @@ -183,7 +186,7 @@ struct PhotoData { uint64 access; int32 user; int32 date; - ImagePtr thumb; + ImagePtr thumb, replyPreview; ImagePtr medium; ImagePtr full; ChatData *chat; // for chat photos connection @@ -223,6 +226,7 @@ struct VideoData { void forget() { thumb->forget(); + replyPreview->forget(); } void save(const QString &toFile); @@ -258,7 +262,7 @@ struct VideoData { int32 date; int32 duration; int32 w, h; - ImagePtr thumb; + ImagePtr thumb, replyPreview; int32 dc, size; // geo, caption @@ -406,6 +410,7 @@ struct DocumentData { void forget() { thumb->forget(); sticker->forget(); + replyPreview->forget(); } void save(const QString &toFile); @@ -443,7 +448,7 @@ struct DocumentData { uint64 access; int32 date; QString name, mime, alt; // alt - for stickers - ImagePtr thumb; + ImagePtr thumb, replyPreview; int32 dc; int32 size; @@ -639,13 +644,13 @@ 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 *createItemDocument(HistoryBlock *block, MsgId id, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc); + HistoryItem *createItemDocument(HistoryBlock *block, MsgId id, int32 flags, MsgId replyTo, 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 *addToBackService(MsgId msgId, QDateTime date, const QString &text, int32 flags = 0, 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 *addToBackDocument(MsgId id, bool out, bool unread, QDateTime date, int32 from, DocumentData *doc); + HistoryItem *addToBackDocument(MsgId id, int32 flags, MsgId replyTo, QDateTime date, int32 from, DocumentData *doc); void addToFront(const QVector &slice); void addToBack(const QVector &slice); @@ -711,6 +716,9 @@ struct History : public QList { notifies.pop_front(); } } + void popNotification(HistoryItem *item) { + if (!notifies.isEmpty() && notifies.back() == item) notifies.pop_back(); + } void itemReplaced(HistoryItem *old, HistoryItem *item) { if (!notifies.isEmpty()) { @@ -728,6 +736,7 @@ struct History : public QList { } QString draft; + MsgId draftToId; MessageCursor draftCursor; int32 lastWidth, lastScrollTop; bool mute; @@ -1099,11 +1108,13 @@ private: ItemAnimations &itemAnimations(); +class HistoryReply; // dynamic_cast optimize + class HistoryMedia; class HistoryItem : public HistoryElem { public: - HistoryItem(History *history, HistoryBlock *block, MsgId msgId, bool out, bool unread, QDateTime msgDate, int32 from); + HistoryItem(History *history, HistoryBlock *block, MsgId msgId, int32 flags, QDateTime msgDate, int32 from); enum { MsgType = 0, @@ -1118,10 +1129,7 @@ public: const History *history() const { return _history; } - UserData *from() { - return _from; - } - const UserData *from() const { + UserData *from() const { return _from; } HistoryBlock *block() { @@ -1137,11 +1145,14 @@ public: return !_block; } bool out() const { - return _out; + return _flags & MTPDmessage_flag_out; } bool unread() const { - if ((_out && (id > 0 && id <= _history->outboxReadTill)) || (!_out && id > 0 && id <= _history->inboxReadTill)) return false; - return _unread; + if ((out() && (id > 0 && id <= _history->outboxReadTill)) || (!out() && id > 0 && id <= _history->inboxReadTill)) return false; + return _flags & MTPDmessage_flag_unread; + } + bool notifyByFrom() const { + return _flags & MTPDmessage_flag_notify_by_from; } virtual bool needCheck() const { return true; @@ -1175,6 +1186,12 @@ public: virtual QString selectedText(uint32 selection) const { return qsl("[-]"); } + virtual QString inDialogsText() const { + return qsl("-"); + } + virtual QString inReplyText() const { + return inDialogsText(); + } virtual void drawInDialog(QPainter &p, const QRect &r, bool act, const HistoryItem *&cacheFor, Text &cache) const = 0; virtual QString notificationHeader() const { @@ -1199,6 +1216,13 @@ public: return false; } + virtual HistoryReply *toHistoryReply() { // dynamic_cast optimize + return 0; + } + virtual const HistoryReply *toHistoryReply() const { // dynamic_cast optimize + return 0; + } + virtual ~HistoryItem(); protected: @@ -1207,10 +1231,27 @@ protected: mutable int32 _fromVersion; History *_history; HistoryBlock *_block; - bool _out, _unread; + int32 _flags; }; +class MessageLink : public ITextLink { +public: + MessageLink(PeerId peer, MsgId msgid) : _peer(peer), _msgid(msgid) { + } + void onClick(Qt::MouseButton button) const; + PeerId peer() const { + return _peer; + } + MsgId msgid() const { + return _msgid; + } + +private: + PeerId _peer; + MsgId _msgid; +}; + HistoryItem *regItem(HistoryItem *item, bool returnExisting = false); class HistoryMedia : public HistoryElem { @@ -1254,8 +1295,15 @@ public: return false; } + virtual bool hasReplyPreview() const { + return false; + } + virtual ImagePtr replyPreview() { + return ImagePtr(); + } + int32 currentWidth() const { - return w; + return qMin(w, _maxw); } protected: @@ -1299,6 +1347,11 @@ public: return data->full->loading() ? true : !data->medium->loaded(); } + bool hasReplyPreview() const { + return !data->thumb->isNull(); + } + ImagePtr replyPreview(); + private: int16 pixw, pixh; PhotoData *data; @@ -1330,6 +1383,11 @@ public: void regItem(HistoryItem *item); void unregItem(HistoryItem *item); + bool hasReplyPreview() const { + return !data->thumb->isNull(); + } + ImagePtr replyPreview(); + private: VideoData *data; TextLinkPtr _openl, _savel, _cancell; @@ -1403,6 +1461,11 @@ public: void updateFrom(const MTPMessageMedia &media); + bool hasReplyPreview() const { + return !data->thumb->isNull(); + } + ImagePtr replyPreview(); + private: DocumentData *data; @@ -1449,6 +1512,7 @@ private: int16 pixw, pixh; DocumentData *data; QString _emoji; + int32 lastw; }; @@ -1459,7 +1523,6 @@ public: void initDimensions(const HistoryItem *parent); void draw(QPainter &p, const HistoryItem *parent, bool selected, int32 width) const; - int32 resize(int32 width, bool dontRecountText = false, const HistoryItem *parent = 0); HistoryMediaType type() const { return MediaTypeContact; } @@ -1560,9 +1623,9 @@ class HistoryMessage : public HistoryItem { 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); + HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, int32 flags, QDateTime date, int32 from, const QString &msg, const MTPMessageMedia &media); + HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, int32 flags, QDateTime date, int32 from, const QString &msg, HistoryMedia *media); + HistoryMessage(History *history, HistoryBlock *block, MsgId msgId, int32 flags, QDateTime date, int32 from, DocumentData *doc); void initMedia(const MTPMessageMedia &media, QString ¤tText); void initMediaFromDocument(DocumentData *doc); @@ -1593,6 +1656,7 @@ public: void updateStickerEmoji(); QString selectedText(uint32 selection) const; + QString inDialogsText() const; HistoryMedia *getMedia(bool inOverview = false) const; QString time() const { @@ -1605,6 +1669,13 @@ public: return _media ? _media->animating() : false; } + virtual QDateTime dateForwarded() const { // dynamic_cast optimize + return date; + } + virtual UserData *fromForwarded() const { // dynamic_cast optimize + return from(); + } + ~HistoryMessage(); protected: @@ -1625,6 +1696,7 @@ public: HistoryForwarded(History *history, HistoryBlock *block, const MTPDmessage &msg); HistoryForwarded(History *history, HistoryBlock *block, MsgId id, HistoryMessage *msg); + void initDimensions(const HistoryItem *parent = 0); void fwdNameUpdated() const; void draw(QPainter &p, uint32 selection) const; @@ -1652,11 +1724,62 @@ protected: }; +class HistoryReply : public HistoryMessage { +public: + + HistoryReply(History *history, HistoryBlock *block, const MTPDmessage &msg); + HistoryReply(History *history, HistoryBlock *block, MsgId msgId, int32 flags, MsgId replyTo, QDateTime date, int32 from, DocumentData *doc); + + void initDimensions(const HistoryItem *parent = 0); + bool updateReplyTo(bool force = false); + void replyToNameUpdated() const; + int32 replyToWidth() const; + + TextLinkPtr replyToLink() const; + + MsgId replyToId() const; + HistoryItem *replyToMessage() const; + void replyToReplaced(HistoryItem *oldItem, HistoryItem *newItem); + + void draw(QPainter &p, uint32 selection) const; + void drawReplyTo(QPainter &p, int32 x, int32 y, int32 w, bool selected, bool likeService = false) const; + void drawMessageText(QPainter &p, const QRect &trect, uint32 selection) const; + int32 resize(int32 width, bool dontRecountText = false, const HistoryItem *parent = 0); + bool hasPoint(int32 x, int32 y) const; + void getState(TextLinkPtr &lnk, bool &inText, int32 x, int32 y) const; + void getSymbol(uint16 &symbol, bool &after, bool &upon, int32 x, int32 y) const; + + UserData *replyTo() const { + return replyToMsg ? replyToMsg->from() : 0; + } + QString selectedText(uint32 selection) const; + + HistoryReply *toHistoryReply() { // dynamic_cast optimize + return this; + } + const HistoryReply *toHistoryReply() const { // dynamic_cast optimize + return this; + } + + ~HistoryReply(); + +protected: + + MsgId replyToMsgId; + HistoryItem *replyToMsg; + TextLinkPtr replyToLnk; + mutable Text replyToName, replyToText; + mutable int32 replyToVersion; + mutable int32 _maxReplyWidth; + int32 toWidth; + +}; + class HistoryServiceMsg : public HistoryItem { public: HistoryServiceMsg(History *history, HistoryBlock *block, const MTPDmessageService &msg); - HistoryServiceMsg(History *history, HistoryBlock *block, MsgId msgId, QDateTime date, const QString &msg, bool out = false, bool unread = false, HistoryMedia *media = 0); + HistoryServiceMsg(History *history, HistoryBlock *block, MsgId msgId, QDateTime date, const QString &msg, int32 flags = 0, HistoryMedia *media = 0); void initDimensions(const HistoryItem *parent = 0); @@ -1679,6 +1802,8 @@ public: return true; } QString selectedText(uint32 selection) const; + QString inDialogsText() const; + QString inReplyText() const; HistoryMedia *getMedia(bool inOverview = false) const; diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 5b28a48076..a38fd024ea 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -638,7 +638,8 @@ void HistoryList::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { } _contextMenuLnk = textlnkOver(); - PhotoLink *lnkPhoto = dynamic_cast(_contextMenuLnk.data()); + HistoryItem *item = App::hoveredItem() ? App::hoveredItem() : App::hoveredLinkItem(); + PhotoLink *lnkPhoto = dynamic_cast(_contextMenuLnk.data()); VideoLink *lnkVideo = dynamic_cast(_contextMenuLnk.data()); AudioLink *lnkAudio = dynamic_cast(_contextMenuLnk.data()); DocumentLink *lnkDocument = dynamic_cast(_contextMenuLnk.data()); @@ -647,6 +648,9 @@ void HistoryList::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (isUponSelected > 0) { _menu->addAction(lang(lng_context_copy_selected), this, SLOT(copySelectedText()))->setEnabled(true); } + if (item && item->id > 0 && isUponSelected != 2 && isUponSelected != -2) { + _menu->addAction(lang(lng_context_reply_msg), historyWidget, SLOT(onReplyToMessage())); + } if (lnkPhoto) { _menu->addAction(lang(lng_context_open_image), this, SLOT(openContextUrl()))->setEnabled(true); _menu->addAction(lang(lng_context_save_image), this, SLOT(saveContextImage()))->setEnabled(true); @@ -679,7 +683,6 @@ void HistoryList::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { App::contextItem(App::hoveredLinkItem()); } } else { // maybe cursor on some text history item? - HistoryItem *item = App::hoveredItem() ? App::hoveredItem() : App::hoveredLinkItem(); bool canDelete = (item && item->itemType() == HistoryItem::MsgType); bool canForward = canDelete && (item->id > 0) && !item->serviceMsg(); @@ -689,11 +692,20 @@ void HistoryList::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (isUponSelected > 0) { if (!_menu) _menu = new ContextMenu(this); _menu->addAction(lang(lng_context_copy_selected), this, SLOT(copySelectedText()))->setEnabled(true); - } else if (item && !isUponSelected && !_contextMenuLnk) { - QString contextMenuText = item->selectedText(FullItemSel); - if (!contextMenuText.isEmpty() && (!msg || !msg->getMedia() || msg->getMedia()->type() != MediaTypeSticker)) { + if (item && item->id > 0 && isUponSelected != 2) { + _menu->addAction(lang(lng_context_reply_msg), historyWidget, SLOT(onReplyToMessage())); + } + } else { + if (item && item->id > 0 && isUponSelected != -2) { if (!_menu) _menu = new ContextMenu(this); - _menu->addAction(lang(lng_context_copy_text), this, SLOT(copyContextText()))->setEnabled(true); + _menu->addAction(lang(lng_context_reply_msg), historyWidget, SLOT(onReplyToMessage())); + } + if (item && !isUponSelected && !_contextMenuLnk) { + QString contextMenuText = item->selectedText(FullItemSel); + if (!contextMenuText.isEmpty() && (!msg || !msg->getMedia() || msg->getMedia()->type() != MediaTypeSticker)) { + if (!_menu) _menu = new ContextMenu(this); + _menu->addAction(lang(lng_context_copy_text), this, SLOT(copyContextText()))->setEnabled(true); + } } } @@ -705,6 +717,10 @@ void HistoryList::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!_menu) _menu = new ContextMenu(historyWidget); _menu->addAction(lang(lng_context_open_email), this, SLOT(openContextUrl()))->setEnabled(true); _menu->addAction(lang(lng_context_copy_email), this, SLOT(copyContextUrl()))->setEnabled(true); + } else if (_contextMenuLnk && dynamic_cast(_contextMenuLnk.data())) { + if (!_menu) _menu = new ContextMenu(historyWidget); + _menu->addAction(lng_context_open_mention(lt_user, _contextMenuLnk->encoded()), this, SLOT(openContextUrl()))->setEnabled(true); + _menu->addAction(lang(lng_context_copy_mention), this, SLOT(copyContextUrl()))->setEnabled(true); } else if (_contextMenuLnk && dynamic_cast(_contextMenuLnk.data())) { if (!_menu) _menu = new ContextMenu(historyWidget); _menu->addAction(lang(lng_context_open_hashtag), this, SLOT(openContextUrl()))->setEnabled(true); @@ -1538,8 +1554,13 @@ HistoryHider::~HistoryHider() { } HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) +, _replyToId(0) +, _replyTo(0) +, _replyToNameVersion(0) +, _replyCancel(this, st::replyCancel) , _lastStickersUpdate(0) , _stickersUpdateRequest(0) +, _loadingMessages(false) , histRequestsCount(0) , histPeer(0) , _activeHist(0) @@ -1551,6 +1572,7 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) , hist(0) , _histInited(false) , _toHistoryEnd(this, st::historyToEnd) +, _attachMention(this) , _send(this, lang(lng_send_button), st::btnSend) , _attachDocument(this, st::btnAttachDocument) , _attachPhoto(this, st::btnAttachPhoto) @@ -1564,8 +1586,6 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) , _attachDragPhoto(this) , imageLoader(this) , _synthedTextUpdate(false) -, loadingChatId(0) -, loadingRequestId(0) , serviceImageCacheSize(0) , confirmImageId(0) , confirmWithText(false) @@ -1581,6 +1601,7 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) connect(&_scroll, SIGNAL(scrolled()), this, SLOT(onListScroll())); connect(&_toHistoryEnd, SIGNAL(clicked()), this, SLOT(onHistoryToEnd())); + connect(&_replyCancel, SIGNAL(clicked()), this, SLOT(onReplyCancel())); connect(&_send, SIGNAL(clicked()), this, SLOT(onSend())); connect(&_attachDocument, SIGNAL(clicked()), this, SLOT(onDocumentSelect())); connect(&_attachPhoto, SIGNAL(clicked()), this, SLOT(onPhotoSelect())); @@ -1609,7 +1630,9 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) _saveDraftTimer.setSingleShot(true); connect(&_saveDraftTimer, SIGNAL(timeout()), this, SLOT(onDraftSave())); connect(_field.verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(onDraftSaveDelayed())); - connect(&_field, SIGNAL(cursorPositionChanged()), this, SLOT(onDraftSaveDelayed())); + connect(&_field, SIGNAL(cursorPositionChanged()), this, SLOT(onFieldCursorChanged())); + + _replyCancel.hide(); _scroll.hide(); _scroll.move(0, 0); @@ -1618,6 +1641,10 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) _toHistoryEnd.hide(); + _attachMention.hide(); + connect(&_attachMention, SIGNAL(mentioned(QString)), &_field, SLOT(onMentionInsert(QString))); + _field.installEventFilter(&_attachMention); + _field.hide(); _field.resize(width() - _send.width() - _attachDocument.width() - _attachEmoji.width(), _send.height() - 2 * st::sendPadding); _send.hide(); @@ -1645,6 +1672,11 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) connect(&_attachDragPhoto, SIGNAL(dropped(QDropEvent*)), this, SLOT(onPhotoDrop(QDropEvent*))); } +void HistoryWidget::start() { + updateRecentStickers(); + connect(App::api(), SIGNAL(fullPeerLoaded(PeerData*)), this, SLOT(onPeerLoaded(PeerData*))); +} + void HistoryWidget::onTextChange() { updateTyping(); // updateStickerPan(); @@ -1678,12 +1710,12 @@ void HistoryWidget::onDraftSave(bool delayed) { writeDraft(); } -void HistoryWidget::writeDraft(const QString *text, const MessageCursor *cursor) { +void HistoryWidget::writeDraft(MsgId *replyTo, const QString *text, const MessageCursor *cursor) { bool save = hist && (_saveDraftStart > 0); _saveDraftStart = 0; _saveDraftTimer.stop(); if (_saveDraftText) { - if (save) Local::writeDraft(hist->peer->id, text ? (*text) : _field.getText()); + if (save) Local::writeDraft(hist->peer->id, Local::MessageDraft(replyTo ? (*replyTo) : _replyToId, text ? (*text) : _field.getText())); _saveDraftText = false; } if (save) Local::writeDraftPositions(hist->peer->id, cursor ? (*cursor) : MessageCursor(_field)); @@ -1748,26 +1780,6 @@ void HistoryWidget::activate() { } } -void HistoryWidget::chatLoaded(const MTPmessages_ChatFull &res) { - const MTPDmessages_chatFull &d(res.c_messages_chatFull()); - PeerId peerId = App::peerFromChat(d.vfull_chat.c_chatFull().vid); - if (peerId == loadingChatId) { - loadingRequestId = 0; - } - App::feedUsers(d.vusers); - App::feedChats(d.vchats); - App::feedParticipants(d.vfull_chat.c_chatFull().vparticipants); - PhotoData *photo = App::feedPhoto(d.vfull_chat.c_chatFull().vchat_photo); - if (photo) { - ChatData *chat = App::peer(peerId)->asChat(); - if (chat) { - chat->photoId = photo->id; - photo->chat = chat; - } - } - peerUpdated(App::chat(peerId)); -} - void HistoryWidget::updateStickers() { if (_lastStickersUpdate && getms(true) < _lastStickersUpdate + StickersUpdateTimeout) return; if (_stickersUpdateRequest) return; @@ -1949,8 +1961,9 @@ void HistoryWidget::showPeer(const PeerId &peer, MsgId msgId, bool force, bool l if (hist) { hist->draft = _field.getText(); hist->draftCursor.fillFrom(_field); + hist->draftToId = _replyToId; - writeDraft(&hist->draft, &hist->draftCursor); + writeDraft(&hist->draftToId, &hist->draft, &hist->draftCursor); if (hist->readyForWork() && _scroll.scrollTop() + 1 <= _scroll.scrollTopMax()) { hist->lastWidth = _list->width(); @@ -1961,6 +1974,11 @@ void HistoryWidget::showPeer(const PeerId &peer, MsgId msgId, bool force, bool l if (hist->unreadBar) hist->unreadBar->destroy(); } + if (_replyToId) { + _replyTo = 0; + _replyToId = 0; + _replyCancel.hide(); + } _scroll.setWidget(0); if (_list) _list->deleteLater(); _list = 0; @@ -2029,18 +2047,25 @@ void HistoryWidget::showPeer(const PeerId &peer, MsgId msgId, bool force, bool l App::main()->peerUpdated(histPeer); - if (!hist->draft.isEmpty()) { + if (hist->draftToId > 0 || !hist->draft.isEmpty()) { setFieldText(hist->draft); _field.setFocus(); hist->draftCursor.applyTo(_field, &_synthedTextUpdate); + _replyToId = hist->draftToId; } else { - QString draft = Local::readDraft(hist->peer->id); - setFieldText(draft); + Local::MessageDraft draft = Local::readDraft(hist->peer->id); + setFieldText(draft.text); _field.setFocus(); - if (!draft.isEmpty()) { + if (!draft.text.isEmpty()) { MessageCursor cur = Local::readDraftPositions(hist->peer->id); cur.applyTo(_field, &_synthedTextUpdate); } + _replyToId = draft.replyTo; + } + if (_replyToId) { + updateReplyTo(); + if (!_replyTo) App::api()->requestReplyTo(0, _replyToId); + resizeEvent(0); } connect(&_scroll, SIGNAL(geometryChanged()), _list, SLOT(onParentGeometryChanged())); @@ -2082,7 +2107,9 @@ void HistoryWidget::updateControlsVisibility() { _scroll.hide(); _send.hide(); _toHistoryEnd.hide(); + _attachMention.hide(); _field.hide(); + _replyCancel.hide(); _attachDocument.hide(); _attachPhoto.hide(); _attachEmoji.hide(); @@ -2108,10 +2135,12 @@ void HistoryWidget::updateControlsVisibility() { _attachEmoji.show(); if (_field.isHidden()) { _field.show(); + if (_replyToId) _replyCancel.show(); resizeEvent(0); update(); } } else { + _attachMention.hide(); _send.hide(); _attachDocument.hide(); _attachPhoto.hide(); @@ -2133,6 +2162,7 @@ void HistoryWidget::updateControlsVisibility() { loadMessages(); if (!hist->readyForWork()) { _scroll.hide(); + _attachMention.hide(); _send.hide(); _attachDocument.hide(); _attachPhoto.hide(); @@ -2141,6 +2171,7 @@ void HistoryWidget::updateControlsVisibility() { _emojiPan.hide(); // _stickerPan.hide(); _toHistoryEnd.hide(); + _replyCancel.hide(); if (!_field.isHidden()) { _field.hide(); update(); @@ -2149,7 +2180,7 @@ void HistoryWidget::updateControlsVisibility() { } } -void HistoryWidget::newUnreadMsg(History *history, MsgId msgId) { +void HistoryWidget::newUnreadMsg(History *history, HistoryItem *item) { if (App::wnd()->historyIsActive()) { if (hist == history && hist->readyForWork()) { historyWasRead(); @@ -2158,7 +2189,7 @@ void HistoryWidget::newUnreadMsg(History *history, MsgId msgId) { } } else { if (hist != history) { - App::wnd()->notifySchedule(history, msgId); + App::wnd()->notifySchedule(history, item); } history->setUnreadCount(history->unreadCount + 1); } @@ -2168,7 +2199,7 @@ void HistoryWidget::newUnreadMsg(History *history, MsgId msgId) { if (history->unreadBar) history->unreadBar->destroy(); } } - App::wnd()->notifySchedule(history, msgId); + App::wnd()->notifySchedule(history, item); history->setUnreadCount(history->unreadCount + 1); history->lastWidth = 0; } @@ -2324,7 +2355,7 @@ bool HistoryWidget::isActive() const { } void HistoryWidget::loadMessages() { - if (!hist) return; + if (!hist || _loadingMessages) return; if (hist->loadedAtTop()) { if (!hist->readyForWork()) { if (hist->activeMsgId) { @@ -2338,13 +2369,14 @@ void HistoryWidget::loadMessages() { return; } - int32 dh = 0; + _loadingMessages = true; if (histPreload.size()) { bool loaded = hist->readyForWork(); addMessagesToFront(histPreload); histPreload.clear(); checkUnreadLoaded(true); if (!loaded && hist->readyForWork()) { + _loadingMessages = false; return; } } @@ -2361,6 +2393,7 @@ void HistoryWidget::loadMessages() { } else { checkUnreadLoaded(true); } + _loadingMessages = false; } void HistoryWidget::loadMessagesDown() { @@ -2443,7 +2476,7 @@ void HistoryWidget::onHistoryToEnd() { } } -void HistoryWidget::onSend(bool ctrlShiftEnter) { +void HistoryWidget::onSend(bool ctrlShiftEnter, MsgId replyTo) { if (!hist) return; QString text = prepareMessage(_field.getText()); @@ -2451,18 +2484,19 @@ void HistoryWidget::onSend(bool ctrlShiftEnter) { App::main()->readServerHistory(hist, false); hist->loadAround(0); - App::main()->sendPreparedText(hist, prepareMessage(_field.getText())); + App::main()->sendPreparedText(hist, prepareMessage(_field.getText()), replyTo); setFieldText(QString()); _saveDraftText = true; _saveDraftStart = getms(); onDraftSave(); + if (!_attachMention.isHidden()) _attachMention.hideStart(); if (!_attachType.isHidden()) _attachType.hideStart(); if (!_emojiPan.isHidden()) _emojiPan.hideStart(); // if (!_stickerPan.isHidden()) _stickerPan.hideStart(); } - + if (replyTo < 0) onReplyCancel(); _field.setFocus(); } @@ -2539,10 +2573,11 @@ void HistoryWidget::onShareContact(const PeerId &peer, UserData *contact) { App::main()->showPeer(peer, 0, false, true); if (!hist) return; - shareContact(peer, contact->phone, contact->firstName, contact->lastName, int32(contact->id & 0xFFFFFFFF)); + shareContact(peer, contact->phone, contact->firstName, contact->lastName, _replyToId, int32(contact->id & 0xFFFFFFFF)); + onReplyCancel(); } -void HistoryWidget::shareContact(const PeerId &peer, const QString &phone, const QString &fname, const QString &lname, int32 userId) { +void HistoryWidget::shareContact(const PeerId &peer, const QString &phone, const QString &fname, const QString &lname, MsgId replyTo, int32 userId) { History *h = App::history(peer); App::main()->readServerHistory(h, false); @@ -2553,9 +2588,9 @@ void HistoryWidget::shareContact(const PeerId &peer, const QString &phone, const PeerData *p = App::peer(peer); int32 flags = (p->input.type() == mtpc_inputPeerSelf) ? 0 : (MTPDmessage_flag_unread | MTPDmessage_flag_out); // unread, out - h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(peer), MTPint(), MTPint(), MTPint(), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaContact(MTP_string(phone), MTP_string(fname), MTP_string(lname), MTP_int(userId)))); - - h->sendRequestId = MTP::send(MTPmessages_SendMedia(p->input, MTP_int(0), MTP_inputMediaContact(MTP_string(phone), MTP_string(fname), MTP_string(lname)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); + if (replyTo) flags |= MTPDmessage::flag_reply_to_msg_id; + h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(peer), MTPint(), MTPint(), MTP_int(_replyToId), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaContact(MTP_string(phone), MTP_string(fname), MTP_string(lname), MTP_int(userId)))); + h->sendRequestId = MTP::send(MTPmessages_SendMedia(p->input, MTP_int(replyTo), MTP_inputMediaContact(MTP_string(phone), MTP_string(fname), MTP_string(lname)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); App::historyRegRandom(randomId, newId); if (hist && histPeer && peer == histPeer->id) { @@ -2605,6 +2640,7 @@ void HistoryWidget::animShow(const QPixmap &bgAnimCache, const QPixmap &bgAnimTo _attachPhoto.hide(); _attachEmoji.hide(); _field.hide(); + _replyCancel.hide(); _send.hide(); a_coord = back ? anim::ivalue(-st::introSlideShift, 0) : anim::ivalue(st::introSlideShift, 0); a_alpha = anim::fvalue(0, 1); @@ -2984,20 +3020,39 @@ void HistoryWidget::updateOnlineDisplayTimer() { void HistoryWidget::onFieldResize() { _field.move(_attachDocument.x() + _attachDocument.width(), height() - _field.height() - st::sendPadding); + _replyCancel.move(width() - _replyCancel.width(), _field.y() - st::sendPadding - _replyCancel.height()); updateListSize(); + int backy = _scroll.y() + _scroll.height(); + update(0, backy, width(), height() - backy); } void HistoryWidget::onFieldFocused() { if (_list) _list->clearSelectedItems(true); } +void HistoryWidget::checkMentionDropdown() { + if (!hist || !hist->peer->chat) return; + + QString start; + if (_field.getMentionStart(start)) { + _attachMention.showFiltered(hist->peer->asChat(), start); + } else if (!_attachMention.isHidden()) { + _attachMention.hideStart(); + } +} + +void HistoryWidget::onFieldCursorChanged() { + checkMentionDropdown(); + onDraftSaveDelayed(); +} + void HistoryWidget::uploadImage(const QImage &img, bool withText) { if (!hist || confirmImageId) return; App::wnd()->activateWindow(); confirmImage = img; confirmWithText = withText; - confirmImageId = imageLoader.append(img, histPeer->id, ToPreparePhoto); + confirmImageId = imageLoader.append(img, histPeer->id, _replyToId, ToPreparePhoto); } void HistoryWidget::uploadFile(const QString &file, bool withText) { @@ -3005,44 +3060,47 @@ void HistoryWidget::uploadFile(const QString &file, bool withText) { App::wnd()->activateWindow(); confirmWithText = withText; - confirmImageId = imageLoader.append(file, histPeer->id, ToPrepareDocument); + confirmImageId = imageLoader.append(file, histPeer->id, _replyToId, ToPrepareDocument); } -void HistoryWidget::shareContactConfirmation(const QString &phone, const QString &fname, const QString &lname, bool withText) { +void HistoryWidget::shareContactConfirmation(const QString &phone, const QString &fname, const QString &lname, MsgId replyTo, bool withText) { if (!hist || confirmImageId) return; App::wnd()->activateWindow(); confirmWithText = withText; confirmImageId = 0xFFFFFFFFFFFFFFFFL; - App::wnd()->showLayer(new PhotoSendBox(phone, fname, lname)); + App::wnd()->showLayer(new PhotoSendBox(phone, fname, lname, replyTo)); } -void HistoryWidget::uploadConfirmImageUncompressed(bool ctrlShiftEnter) { +void HistoryWidget::uploadConfirmImageUncompressed(bool ctrlShiftEnter, MsgId replyTo) { if (!hist || !confirmImageId || confirmImage.isNull()) return; App::wnd()->activateWindow(); PeerId peerId = histPeer->id; if (confirmWithText) { - onSend(ctrlShiftEnter); + onSend(ctrlShiftEnter, replyTo); } - imageLoader.append(confirmImage, peerId, ToPrepareDocument, ctrlShiftEnter); + imageLoader.append(confirmImage, peerId, replyTo, ToPrepareDocument, ctrlShiftEnter); confirmImageId = 0; confirmWithText = false; confirmImage = QImage(); + onReplyCancel(); } void HistoryWidget::uploadMedias(const QStringList &files, ToPrepareMediaType type) { if (!hist) return; App::wnd()->activateWindow(); - imageLoader.append(files, histPeer->id, type); + imageLoader.append(files, histPeer->id, _replyToId, type); + onReplyCancel(); } void HistoryWidget::uploadMedia(const QByteArray &fileContent, ToPrepareMediaType type, PeerId peer) { if (!peer && !hist) return; App::wnd()->activateWindow(); - imageLoader.append(fileContent, peer ? peer : histPeer->id, type); + imageLoader.append(fileContent, peer ? peer : histPeer->id, _replyToId, type); + onReplyCancel(); } void HistoryWidget::onPhotoReady() { @@ -3062,25 +3120,26 @@ void HistoryWidget::onPhotoReady() { void HistoryWidget::onPhotoFailed(quint64 id) { } -void HistoryWidget::confirmShareContact(bool ctrlShiftEnter, const QString &phone, const QString &fname, const QString &lname) { +void HistoryWidget::confirmShareContact(bool ctrlShiftEnter, const QString &phone, const QString &fname, const QString &lname, MsgId replyTo) { if (!histPeer) return; PeerId peerId = histPeer->id; if (0xFFFFFFFFFFFFFFFFL == confirmImageId) { if (confirmWithText) { - onSend(ctrlShiftEnter); + onSend(ctrlShiftEnter, replyTo); } confirmImageId = 0; confirmWithText = false; confirmImage = QImage(); } - shareContact(peerId, phone, fname, lname); + shareContact(peerId, phone, fname, lname, replyTo); + onReplyCancel(); } void HistoryWidget::confirmSendImage(const ReadyLocalMedia &img) { if (img.id == confirmImageId) { if (confirmWithText) { - onSend(img.ctrlShiftEnter); + onSend(img.ctrlShiftEnter, img.replyTo); } confirmImageId = 0; confirmWithText = false; @@ -3102,11 +3161,13 @@ void HistoryWidget::confirmSendImage(const ReadyLocalMedia &img) { if (img.type == ToPreparePhoto) { h->loadAround(0); int32 flags = (h->peer->input.type() == mtpc_inputPeerSelf) ? 0 : (MTPDmessage_flag_unread | MTPDmessage_flag_out); // unread, out - h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(img.peer), MTPint(), MTPint(), MTPint(), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaPhoto(img.photo))); + if (img.replyTo) flags |= MTPDmessage::flag_reply_to_msg_id; + h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(img.peer), MTPint(), MTPint(), MTP_int(img.replyTo), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaPhoto(img.photo))); } else if (img.type == ToPrepareDocument) { h->loadAround(0); int32 flags = (h->peer->input.type() == mtpc_inputPeerSelf) ? 0 : (MTPDmessage_flag_unread | MTPDmessage_flag_out); // unread, out - h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(img.peer), MTPint(), MTPint(), MTPint(), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaDocument(img.document))); + if (img.replyTo) flags |= MTPDmessage::flag_reply_to_msg_id; + h->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(img.peer), MTPint(), MTPint(), MTP_int(img.replyTo), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaDocument(img.document))); } if (hist && histPeer && img.peer == histPeer->id) { @@ -3132,7 +3193,8 @@ void HistoryWidget::onPhotoUploaded(MsgId newId, const MTPInputFile &file) { uint64 randomId = MTP::nonce(); App::historyRegRandom(randomId, newId); History *hist = item->history(); - hist->sendRequestId = MTP::send(MTPmessages_SendMedia(item->history()->peer->input, MTP_int(0), MTP_inputMediaUploadedPhoto(file), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), App::main()->rpcFail(&MainWidget::sendPhotoFailed, randomId), 0, 0, hist->sendRequestId); + MsgId replyTo = item->toHistoryReply() ? item->toHistoryReply()->replyToId() : 0; + hist->sendRequestId = MTP::send(MTPmessages_SendMedia(item->history()->peer->input, MTP_int(replyTo), MTP_inputMediaUploadedPhoto(file), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), App::main()->rpcFail(&MainWidget::sendPhotoFailed, randomId), 0, 0, hist->sendRequestId); } } @@ -3167,7 +3229,8 @@ void HistoryWidget::onDocumentUploaded(MsgId newId, const MTPInputFile &file) { uint64 randomId = MTP::nonce(); App::historyRegRandom(randomId, newId); History *hist = item->history(); - hist->sendRequestId = MTP::send(MTPmessages_SendMedia(item->history()->peer->input, MTP_int(0), MTP_inputMediaUploadedDocument(file, MTP_string(document->mime), _composeDocumentAttributes(document)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); + MsgId replyTo = item->toHistoryReply() ? item->toHistoryReply()->replyToId() : 0; + hist->sendRequestId = MTP::send(MTPmessages_SendMedia(item->history()->peer->input, MTP_int(replyTo), MTP_inputMediaUploadedDocument(file, MTP_string(document->mime), _composeDocumentAttributes(document)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); } } } @@ -3188,7 +3251,8 @@ void HistoryWidget::onThumbDocumentUploaded(MsgId newId, const MTPInputFile &fil uint64 randomId = MTP::nonce(); App::historyRegRandom(randomId, newId); History *hist = item->history(); - hist->sendRequestId = MTP::send(MTPmessages_SendMedia(item->history()->peer->input, MTP_int(0), MTP_inputMediaUploadedThumbDocument(file, thumb, MTP_string(document->mime), _composeDocumentAttributes(document)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); + MsgId replyTo = item->toHistoryReply() ? item->toHistoryReply()->replyToId() : 0; + hist->sendRequestId = MTP::send(MTPmessages_SendMedia(item->history()->peer->input, MTP_int(replyTo), MTP_inputMediaUploadedThumbDocument(file, thumb, MTP_string(document->mime), _composeDocumentAttributes(document)), MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentFullDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); } } } @@ -3230,7 +3294,7 @@ void HistoryWidget::resizeEvent(QResizeEvent *e) { _attachPhoto.move(_attachDocument.x(), _attachDocument.y()); _field.move(_attachDocument.x() + _attachDocument.width(), height() - _field.height() - st::sendPadding); - + _replyCancel.move(width() - _replyCancel.width(), _field.y() - st::sendPadding - _replyCancel.height()); updateListSize(); _field.resize(width() - _send.width() - _attachDocument.width() - _attachEmoji.width(), _field.height()); @@ -3264,10 +3328,14 @@ void HistoryWidget::resizeEvent(QResizeEvent *e) { void HistoryWidget::itemRemoved(HistoryItem *item) { if (_list) _list->itemRemoved(item); + if (item == _replyTo) { + onReplyCancel(); + } } void HistoryWidget::itemReplaced(HistoryItem *oldItem, HistoryItem *newItem) { if (_list) _list->itemReplaced(oldItem, newItem); + if (_replyTo == oldItem) _replyTo = newItem; } void HistoryWidget::itemResized(HistoryItem *row) { @@ -3279,6 +3347,10 @@ void HistoryWidget::updateScrollColors() { _scroll.updateColors(App::historyScrollBarColor(), App::historyScrollBgColor(), App::historyScrollBarOverColor(), App::historyScrollBgOverColor()); } +MsgId HistoryWidget::replyToId() const { + return _replyToId; +} + void HistoryWidget::updateListSize(int32 addToY, bool initial, bool loadedDown, HistoryItem *resizedItem) { if (!hist || (!_histInited && !initial)) return; @@ -3288,9 +3360,13 @@ void HistoryWidget::updateListSize(int32 addToY, bool initial, bool loadedDown, } int32 newScrollHeight = height() - (hist->readyForWork() && (!histPeer->chat || !histPeer->asChat()->forbidden) ? (_field.height() + 2 * st::sendPadding) : 0); + if (_replyToId) { + newScrollHeight -= st::replyHeight; + } bool wasAtBottom = _scroll.scrollTop() + 1 > _scroll.scrollTopMax(), needResize = _scroll.width() != width() || _scroll.height() != newScrollHeight; if (needResize) { _scroll.resize(width(), newScrollHeight); + _attachMention.setBoundings(_scroll.geometry()); _toHistoryEnd.move((width() - _toHistoryEnd.width()) / 2, _scroll.y() + _scroll.height() - _toHistoryEnd.height() - st::historyToEndSkip); } @@ -3441,9 +3517,12 @@ void HistoryWidget::onStickerSend(DocumentData *sticker) { 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); + int32 flags = (histPeer->input.type() != mtpc_inputPeerSelf) ? (MTPDmessage_flag_out | MTPDmessage_flag_unread) : 0; + if (_replyToId) flags |= MTPDmessage::flag_reply_to_msg_id; + hist->addToBackDocument(newId, flags, _replyToId, date(MTP_int(unixtime())), MTP::authedId(), sticker); - hist->sendRequestId = MTP::send(MTPmessages_SendMedia(histPeer->input, MTP_int(0), 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); + hist->sendRequestId = MTP::send(MTPmessages_SendMedia(histPeer->input, MTP_int(_replyToId), 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); + onReplyCancel(); App::historyRegRandom(randomId, newId); App::main()->historyToDown(hist); @@ -3451,6 +3530,7 @@ void HistoryWidget::onStickerSend(DocumentData *sticker) { App::main()->dialogsToUp(); peerMessagesUpdated(histPeer->id); + if (!_attachMention.isHidden()) _attachMention.hideStart(); if (!_attachType.isHidden()) _attachType.hideStart(); if (!_emojiPan.isHidden()) _emojiPan.hideStart(); // if (!_stickerPan.isHidden()) _stickerPan.hideStart(); @@ -3465,18 +3545,56 @@ void HistoryWidget::setFieldText(const QString &text) { _synthedTextUpdate = false; } +void HistoryWidget::onReplyToMessage() { + HistoryItem *to = App::contextItem(); + if (!to || to->id <= 0) return; + + _replyTo = to; + _replyToId = to->id; + _replyToText.setText(st::msgFont, _replyTo->inDialogsText(), _textDlgOptions); + if (!_field.isHidden()) _replyCancel.show(); + updateReplyToName(); + resizeEvent(0); + update(); + + _saveDraftText = true; + _saveDraftStart = getms(); + onDraftSave(); + + _field.setFocus(); +} + +void HistoryWidget::onReplyCancel() { + if (!_replyToId) return; + _replyTo = 0; + _replyToId = 0; + _replyCancel.hide(); + resizeEvent(0); + update(); + + _saveDraftText = true; + _saveDraftStart = getms(); + onDraftSave(); +} + void HistoryWidget::onCancel() { if (App::main()) App::main()->showPeer(0); emit cancelled(); } +void HistoryWidget::onPeerLoaded(PeerData *data) { + peerUpdated(data); + if (data == histPeer) { + checkMentionDropdown(); + } +} + void HistoryWidget::peerUpdated(PeerData *data) { if (data && data == histPeer) { updateListSize(); if (!animating()) updateControlsVisibility(); - if (data->chat && data->asChat()->count > 0 && data->asChat()->participants.isEmpty() && (!loadingRequestId || loadingChatId != data->id)) { - loadingChatId = data->id; - loadingRequestId = MTP::send(MTPmessages_GetFullChat(App::peerToMTP(data->id).c_peerChat().vchat_id), rpcDone(&HistoryWidget::chatLoaded)); + if (data->chat && data->asChat()->count > 0 && data->asChat()->participants.isEmpty()) { + App::api()->requestFullPeer(data); } App::main()->updateOnlineDisplay(); } @@ -3512,7 +3630,7 @@ void HistoryWidget::onDeleteSelectedSure() { } if (!ids.isEmpty()) { - MTP::send(MTPmessages_DeleteMessages(MTP_vector(ids))); + App::main()->deleteMessages(ids); } onClearSelected(); @@ -3532,7 +3650,7 @@ void HistoryWidget::onDeleteContextSure() { } if (item->id > 0) { - MTP::send(MTPmessages_DeleteMessages(MTP_vector(1, MTP_int(item->id)))); + App::main()->deleteMessages(QVector(1, MTP_int(item->id))); } item->destroy(); if (App::main() && App::main()->peer() == peer()) { @@ -3588,6 +3706,65 @@ void HistoryWidget::updateTopBarSelection() { update(); } +void HistoryWidget::updateReplyTo(bool force) { + if (!_replyToId || _replyTo) return; + _replyTo = App::histItemById(_replyToId); + if (_replyTo) { + _replyToText.setText(st::msgFont, _replyTo->inDialogsText(), _textDlgOptions); + if (!_field.isHidden()) _replyCancel.show(); + updateReplyToName(); + int backy = _scroll.y() + _scroll.height(); + update(0, backy, width(), height() - backy); + } else if (force) { + onReplyCancel(); + } +} + +void HistoryWidget::updateReplyToName() { + if (!_replyTo) return; + _replyToName.setText(st::msgServiceNameFont, App::peerName(_replyTo->from()), _textNameOptions); + _replyToNameVersion = _replyTo->from()->nameVersion; +} + +void HistoryWidget::drawFieldBackground(QPainter &p) { + int32 backy = _field.y() - st::sendPadding, backh = _field.height() + 2 * st::sendPadding; + if (_replyToId) { + if (_replyTo && _replyTo->from()->nameVersion > _replyToNameVersion) { + updateReplyToName(); + } + backy -= st::replyHeight; + backh += st::replyHeight; + } + p.fillRect(0, backy, width(), backh, st::taMsgField.bgColor->b); + if (_replyToId) { + int32 replyLeft = st::replySkip; + p.drawPixmap(QPoint(st::replyIconPos.x(), backy + st::replyIconPos.y()), App::sprite(), st::replyIcon); + if (_replyTo) { + if (_replyTo->getMedia() && _replyTo->getMedia()->hasReplyPreview()) { + ImagePtr replyPreview = _replyTo->getMedia()->replyPreview(); + if (!replyPreview->isNull()) { + QRect to(replyLeft, backy + st::msgReplyPadding.top(), st::msgReplyBarSize.height(), st::msgReplyBarSize.height()); + if (replyPreview->width() == replyPreview->height()) { + p.drawPixmap(to.x(), to.y(), replyPreview->pix()); + } else { + QRect from = (replyPreview->width() > replyPreview->height()) ? QRect((replyPreview->width() - replyPreview->height()) / 2, 0, replyPreview->height(), replyPreview->height()) : QRect(0, (replyPreview->height() - replyPreview->width()) / 2, replyPreview->width(), replyPreview->width()); + p.drawPixmap(to, replyPreview->pix(), from); + } + } + replyLeft += st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() - st::msgReplyBarPos.x(); + } + p.setPen(st::replyColor->p); + _replyToName.drawElided(p, replyLeft, backy + st::msgReplyPadding.top(), width() - replyLeft - _replyCancel.width() - st::msgReplyPadding.right()); + p.setPen((_replyTo->getMedia() ? st::msgInDateColor : st::msgColor)->p); + _replyToText.drawElided(p, replyLeft, backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height, width() - replyLeft - _replyCancel.width() - st::msgReplyPadding.right()); + } else { + p.setFont(st::msgDateFont->f); + p.setPen(st::msgInDateColor->p); + p.drawText(replyLeft, backy + st::msgReplyPadding.top() + (st::msgReplyBarSize.height() - st::msgDateFont->height) / 2 + st::msgDateFont->ascent, st::msgDateFont->m.elidedText(lang(lng_profile_loading), Qt::ElideRight, width() - replyLeft - _replyCancel.width() - st::msgReplyPadding.right())); + } + } +} + void HistoryWidget::paintEvent(QPaintEvent *e) { QPainter p(this); QRect r(e->rect()); @@ -3635,7 +3812,7 @@ void HistoryWidget::paintEvent(QPaintEvent *e) { if (_list) { if (!_scroll.isHidden()) { if (!_field.isHidden()) { - p.fillRect(0, _field.y() - st::sendPadding, width(), _field.height() + 2 * st::sendPadding, st::taMsgField.bgColor->b); + drawFieldBackground(p); } } else { QPoint dogPos((width() - st::msgDogImg.pxWidth()) / 2, ((height() - _field.height() - 2 * st::sendPadding - st::msgDogImg.pxHeight()) * 4) / 9); diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index 951fea0a7d..72375ca2ca 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -252,6 +252,8 @@ public: HistoryWidget(QWidget *parent); + void start(); + void messagesReceived(const MTPmessages_Messages &messages, mtpRequestId requestId); void windowShown(); @@ -269,6 +271,7 @@ public: void contextMenuEvent(QContextMenuEvent *e); void updateTopBarSelection(); + void checkMentionDropdown(); void paintTopBar(QPainter &p, float64 over, int32 decreaseWidth); void topBarShadowParams(int32 &x, float64 &o); @@ -281,7 +284,7 @@ public: void peerMessagesUpdated(); void msgUpdated(PeerId peer, const HistoryItem *msg); - void newUnreadMsg(History *history, MsgId msgId); + void newUnreadMsg(History *history, HistoryItem *item); void historyToDown(History *history); void historyWasRead(bool force = true); @@ -295,11 +298,11 @@ public: void destroyData(); void uploadImage(const QImage &img, bool withText = false); void uploadFile(const QString &file, bool withText = false); // with confirmation - void shareContactConfirmation(const QString &phone, const QString &fname, const QString &lname, bool withText = false); - void uploadConfirmImageUncompressed(bool ctrlShiftEnter); + void shareContactConfirmation(const QString &phone, const QString &fname, const QString &lname, MsgId replyTo, bool withText = false); + void uploadConfirmImageUncompressed(bool ctrlShiftEnter, MsgId replyTo); void uploadMedias(const QStringList &files, ToPrepareMediaType type); void uploadMedia(const QByteArray &fileContent, ToPrepareMediaType type, PeerId peer = 0); - void confirmShareContact(bool ctrlShiftEnter, const QString &phone, const QString &fname, const QString &lname); + void confirmShareContact(bool ctrlShiftEnter, const QString &phone, const QString &fname, const QString &lname, MsgId replyTo); void confirmSendImage(const ReadyLocalMedia &img); void cancelSendImage(); @@ -312,7 +315,7 @@ public: void onShareContact(const PeerId &peer, UserData *contact); void onSendPaths(const PeerId &peer); - void shareContact(const PeerId &peer, const QString &phone, const QString &fname, const QString &lname, int32 userId = 0); + void shareContact(const PeerId &peer, const QString &phone, const QString &fname, const QString &lname, MsgId replyTo, int32 userId = 0); PeerData *peer() const; PeerData *activePeer() const; @@ -343,6 +346,9 @@ public: void updateScrollColors(); + MsgId replyToId() const; + void updateReplyTo(bool force = false); + ~HistoryWidget(); signals: @@ -353,8 +359,11 @@ signals: public slots: void onCancel(); + void onReplyToMessage(); + void onReplyCancel(); void peerUpdated(PeerData *data); + void onPeerLoaded(PeerData *data); void cancelTyping(); @@ -368,7 +377,7 @@ public slots: void onListScroll(); void onHistoryToEnd(); - void onSend(bool ctrlShiftEnter = false); + void onSend(bool ctrlShiftEnter = false, MsgId replyTo = -1); void onPhotoSelect(); void onDocumentSelect(); @@ -392,6 +401,7 @@ public slots: void onFieldFocused(); void onFieldResize(); + void onFieldCursorChanged(); void onScrollTimer(); void onForwardSelected(); @@ -409,11 +419,18 @@ public slots: private: + MsgId _replyToId; + HistoryItem *_replyTo; + Text _replyToName, _replyToText; + int32 _replyToNameVersion; + IconedButton _replyCancel; + void updateReplyToName(); + void drawFieldBackground(QPainter &p); + bool messagesFailed(const RPCError &error, mtpRequestId requestId); void updateListSize(int32 addToY = 0, bool initial = false, bool loadedDown = false, HistoryItem *resizedItem = 0); void addMessagesToFront(const QVector &messages); void addMessagesToBack(const QVector &messages); - void chatLoaded(const MTPmessages_ChatFull &res); void stickersGot(const MTPmessages_AllStickers &stickers); bool stickersFailed(const RPCError &error); @@ -421,7 +438,7 @@ private: uint64 _lastStickersUpdate; mtpRequestId _stickersUpdateRequest; - void writeDraft(const QString *text = 0, const MessageCursor *cursor = 0); + void writeDraft(MsgId *replyTo = 0, const QString *text = 0, const MessageCursor *cursor = 0); void setFieldText(const QString &text); QStringList getMediasFromMime(const QMimeData *d); @@ -429,6 +446,7 @@ private: void updateDragAreas(); + bool _loadingMessages; int32 histRequestsCount; PeerData *histPeer; History *_activeHist; @@ -446,6 +464,8 @@ private: IconedButton _toHistoryEnd; + MentionsDropdown _attachMention; + FlatButton _send; IconedButton _attachDocument, _attachPhoto, _attachEmoji; MessageField _field; @@ -461,9 +481,6 @@ private: LocalImageLoader imageLoader; bool _synthedTextUpdate; - PeerId loadingChatId; - mtpRequestId loadingRequestId; - int64 serviceImageCacheSize; QImage confirmImage; PhotoId confirmImageId; diff --git a/Telegram/SourceFiles/localimageloader.cpp b/Telegram/SourceFiles/localimageloader.cpp index 14fa312e14..bb5cb45901 100644 --- a/Telegram/SourceFiles/localimageloader.cpp +++ b/Telegram/SourceFiles/localimageloader.cpp @@ -41,6 +41,7 @@ void LocalImageLoaderPrivate::prepareImages() { ToPrepareMediaType type; bool animated = false; bool ctrlShiftEnter = false; + MsgId replyTo = 0; { QMutexLocker lock(loader->toPrepareMutex()); ToPrepareMedias &list(loader->toPrepareMedias()); @@ -53,6 +54,7 @@ void LocalImageLoaderPrivate::prepareImages() { id = list.front().id; type = list.front().type; ctrlShiftEnter = list.front().ctrlShiftEnter; + replyTo = list.front().replyTo; } if (img.isNull()) { @@ -212,7 +214,7 @@ void LocalImageLoaderPrivate::prepareImages() { { QMutexLocker lock(loader->readyMutex()); - loader->readyList().push_back(ReadyLocalMedia(type, file, filename, filesize, data, id, thumbId, thumbExt, peer, photo, photoThumbs, document, jpeg, ctrlShiftEnter)); + loader->readyList().push_back(ReadyLocalMedia(type, file, filename, filesize, data, id, thumbId, thumbExt, peer, photo, photoThumbs, document, jpeg, ctrlShiftEnter, replyTo)); } { @@ -234,11 +236,11 @@ LocalImageLoaderPrivate::~LocalImageLoaderPrivate() { LocalImageLoader::LocalImageLoader(QObject *parent) : QObject(parent), thread(0), priv(0) { } -void LocalImageLoader::append(const QStringList &files, const PeerId &peer, ToPrepareMediaType t) { +void LocalImageLoader::append(const QStringList &files, const PeerId &peer, MsgId replyTo, ToPrepareMediaType t) { { QMutexLocker lock(toPrepareMutex()); for (QStringList::const_iterator i = files.cbegin(), e = files.cend(); i != e; ++i) { - toPrepare.push_back(ToPrepareMedia(*i, peer, t, false)); + toPrepare.push_back(ToPrepareMedia(*i, peer, t, false, replyTo)); } } if (!thread) { @@ -249,11 +251,11 @@ void LocalImageLoader::append(const QStringList &files, const PeerId &peer, ToPr emit needToPrepare(); } -PhotoId LocalImageLoader::append(const QByteArray &img, const PeerId &peer, ToPrepareMediaType t) { +PhotoId LocalImageLoader::append(const QByteArray &img, const PeerId &peer, MsgId replyTo, ToPrepareMediaType t) { PhotoId result = 0; { QMutexLocker lock(toPrepareMutex()); - toPrepare.push_back(ToPrepareMedia(img, peer, t, false)); + toPrepare.push_back(ToPrepareMedia(img, peer, t, false, replyTo)); result = toPrepare.back().id; } if (!thread) { @@ -265,11 +267,11 @@ PhotoId LocalImageLoader::append(const QByteArray &img, const PeerId &peer, ToPr return result; } -PhotoId LocalImageLoader::append(const QImage &img, const PeerId &peer, ToPrepareMediaType t, bool ctrlShiftEnter) { +PhotoId LocalImageLoader::append(const QImage &img, const PeerId &peer, MsgId replyTo, ToPrepareMediaType t, bool ctrlShiftEnter) { PhotoId result = 0; { QMutexLocker lock(toPrepareMutex()); - toPrepare.push_back(ToPrepareMedia(img, peer, t, ctrlShiftEnter)); + toPrepare.push_back(ToPrepareMedia(img, peer, t, ctrlShiftEnter, replyTo)); result = toPrepare.back().id; } if (!thread) { @@ -281,11 +283,11 @@ PhotoId LocalImageLoader::append(const QImage &img, const PeerId &peer, ToPrepar return result; } -PhotoId LocalImageLoader::append(const QString &file, const PeerId &peer, ToPrepareMediaType t) { +PhotoId LocalImageLoader::append(const QString &file, const PeerId &peer, MsgId replyTo, ToPrepareMediaType t) { PhotoId result = 0; { QMutexLocker lock(toPrepareMutex()); - toPrepare.push_back(ToPrepareMedia(file, peer, t, false)); + toPrepare.push_back(ToPrepareMedia(file, peer, t, false, replyTo)); result = toPrepare.back().id; } if (!thread) { diff --git a/Telegram/SourceFiles/localimageloader.h b/Telegram/SourceFiles/localimageloader.h index 9ab1fa8c7d..4b651afb10 100644 --- a/Telegram/SourceFiles/localimageloader.h +++ b/Telegram/SourceFiles/localimageloader.h @@ -25,11 +25,11 @@ enum ToPrepareMediaType { }; struct ToPrepareMedia { - ToPrepareMedia(const QString &file, const PeerId &peer, ToPrepareMediaType t, bool ctrlShiftEnter) : id(MTP::nonce()), file(file), peer(peer), type(t), ctrlShiftEnter(ctrlShiftEnter) { + ToPrepareMedia(const QString &file, const PeerId &peer, ToPrepareMediaType t, bool ctrlShiftEnter, MsgId replyTo) : id(MTP::nonce()), file(file), peer(peer), type(t), ctrlShiftEnter(ctrlShiftEnter), replyTo(replyTo) { } - ToPrepareMedia(const QImage &img, const PeerId &peer, ToPrepareMediaType t, bool ctrlShiftEnter) : id(MTP::nonce()), img(img), peer(peer), type(t), ctrlShiftEnter(ctrlShiftEnter) { + ToPrepareMedia(const QImage &img, const PeerId &peer, ToPrepareMediaType t, bool ctrlShiftEnter, MsgId replyTo) : id(MTP::nonce()), img(img), peer(peer), type(t), ctrlShiftEnter(ctrlShiftEnter), replyTo(replyTo) { } - ToPrepareMedia(const QByteArray &data, const PeerId &peer, ToPrepareMediaType t, bool ctrlShiftEnter) : id(MTP::nonce()), data(data), peer(peer), type(t), ctrlShiftEnter(ctrlShiftEnter) { + ToPrepareMedia(const QByteArray &data, const PeerId &peer, ToPrepareMediaType t, bool ctrlShiftEnter, MsgId replyTo) : id(MTP::nonce()), data(data), peer(peer), type(t), ctrlShiftEnter(ctrlShiftEnter), replyTo(replyTo) { } PhotoId id; QString file; @@ -38,13 +38,14 @@ struct ToPrepareMedia { PeerId peer; ToPrepareMediaType type; bool ctrlShiftEnter; + MsgId replyTo; }; typedef QList ToPrepareMedias; typedef QMap LocalFileParts; struct ReadyLocalMedia { - ReadyLocalMedia(ToPrepareMediaType type, const QString &file, const QString &filename, int32 filesize, const QByteArray &data, const uint64 &id, const uint64 &thumbId, const QString &thumbExt, const PeerId &peer, const MTPPhoto &photo, const PreparedPhotoThumbs &photoThumbs, const MTPDocument &document, const QByteArray &jpeg, bool ctrlShiftEnter) : - type(type), file(file), filename(filename), filesize(filesize), data(data), thumbExt(thumbExt), id(id), thumbId(thumbId), peer(peer), photo(photo), document(document), photoThumbs(photoThumbs), ctrlShiftEnter(ctrlShiftEnter) { + ReadyLocalMedia(ToPrepareMediaType type, const QString &file, const QString &filename, int32 filesize, const QByteArray &data, const uint64 &id, const uint64 &thumbId, const QString &thumbExt, const PeerId &peer, const MTPPhoto &photo, const PreparedPhotoThumbs &photoThumbs, const MTPDocument &document, const QByteArray &jpeg, bool ctrlShiftEnter, MsgId replyTo) : + type(type), file(file), filename(filename), filesize(filesize), data(data), thumbExt(thumbExt), id(id), thumbId(thumbId), peer(peer), photo(photo), document(document), photoThumbs(photoThumbs), ctrlShiftEnter(ctrlShiftEnter), replyTo(replyTo) { if (!jpeg.isEmpty()) { int32 size = jpeg.size(); for (int32 i = 0, part = 0; i < size; i += UploadPartSize, ++part) { @@ -54,6 +55,7 @@ struct ReadyLocalMedia { hashMd5Hex(jpeg.constData(), jpeg.size(), jpeg_md5.data()); } } + MsgId replyTo; ToPrepareMediaType type; QString file, filename; int32 filesize; @@ -103,10 +105,10 @@ class LocalImageLoader : public QObject { public: LocalImageLoader(QObject *parent); - void append(const QStringList &files, const PeerId &peer, ToPrepareMediaType t = ToPrepareAuto); - PhotoId append(const QByteArray &img, const PeerId &peer, ToPrepareMediaType t = ToPrepareAuto); - PhotoId append(const QImage &img, const PeerId &peer, ToPrepareMediaType t = ToPreparePhoto, bool ctrlShiftEnter = false); - PhotoId append(const QString &file, const PeerId &peer, ToPrepareMediaType t = ToPrepareAuto); + void append(const QStringList &files, const PeerId &peer, MsgId replyTo, ToPrepareMediaType t); + PhotoId append(const QByteArray &img, const PeerId &peer, MsgId replyTo, ToPrepareMediaType t); + PhotoId append(const QImage &img, const PeerId &peer, MsgId replyTo, ToPrepareMediaType t, bool ctrlShiftEnter = false); + PhotoId append(const QString &file, const PeerId &peer, MsgId replyTo, ToPrepareMediaType t); QMutex *readyMutex(); ReadyLocalMedias &readyList(); diff --git a/Telegram/SourceFiles/localstorage.cpp b/Telegram/SourceFiles/localstorage.cpp index 15a66275d8..6e42954174 100644 --- a/Telegram/SourceFiles/localstorage.cpp +++ b/Telegram/SourceFiles/localstorage.cpp @@ -1558,7 +1558,7 @@ namespace Local { if (!QDir().exists(_basePath)) QDir().mkpath(_basePath); FileReadDescriptor settingsData; - if (!readFile(settingsData, qsl("settings"), SafePath)) { + if (!readFile(settingsData, cTestMode() ? qsl("settings_test") : qsl("settings"), SafePath)) { _readOldSettings(); _readOldUserSettings(false); // needed further in _readUserSettings _readOldMtpData(false); // needed further in _readMtpData @@ -1617,7 +1617,7 @@ namespace Local { if (!QDir().exists(_basePath)) QDir().mkpath(_basePath); - FileWriteDescriptor settings(qsl("settings"), SafePath); + FileWriteDescriptor settings(cTestMode() ? qsl("settings_test") : qsl("settings"), SafePath); if (_settingsSalt.isEmpty() || !_settingsKey.created()) { _settingsSalt.resize(LocalEncryptSaltSize); memset_rand(_settingsSalt.data(), _settingsSalt.size()); @@ -1735,10 +1735,10 @@ namespace Local { return _oldMapVersion; } - void writeDraft(const PeerId &peer, const QString &text) { + void writeDraft(const PeerId &peer, const MessageDraft &draft) { if (!_working()) return; - if (text.isEmpty()) { + if (draft.replyTo <= 0 && draft.text.isEmpty()) { DraftsMap::iterator i = _draftsMap.find(peer); if (i != _draftsMap.cend()) { clearKey(i.value()); @@ -1755,8 +1755,8 @@ namespace Local { _mapChanged = true; _writeMap(WriteMapFast); } - EncryptedDescriptor data(sizeof(quint64) + _stringSize(text)); - data.stream << quint64(peer) << text; + EncryptedDescriptor data(sizeof(quint64) + _stringSize(draft.text) + sizeof(qint32)); + data.stream << quint64(peer) << draft.text << qint32(draft.replyTo); FileWriteDescriptor file(i.value()); file.writeEncrypted(data); @@ -1764,24 +1764,26 @@ namespace Local { } } - QString readDraft(const PeerId &peer) { - if (!_draftsNotReadMap.remove(peer)) return QString(); + MessageDraft readDraft(const PeerId &peer) { + if (!_draftsNotReadMap.remove(peer)) return MessageDraft(); DraftsMap::iterator j = _draftsMap.find(peer); if (j == _draftsMap.cend()) { - return QString(); + return MessageDraft(); } FileReadDescriptor draft; if (!readEncryptedFile(draft, j.value())) { clearKey(j.value()); _draftsMap.erase(j); - return QString(); + return MessageDraft(); } quint64 draftPeer; QString draftText; + qint32 draftReplyTo = 0; draft.stream >> draftPeer >> draftText; - return (draftPeer == peer) ? draftText : QString(); + if (draft.version >= 7021) draft.stream >> draftReplyTo; + return (draftPeer == peer) ? MessageDraft(MsgId(draftReplyTo), draftText) : MessageDraft(); } void writeDraftPositions(const PeerId &peer, const MessageCursor &cur) { @@ -2092,6 +2094,7 @@ namespace Local { quint32 size = 0; for (RecentStickerPack::const_iterator i = recent.cbegin(); i != recent.cend(); ++i) { DocumentData *doc = i->first; + if (doc->status == FileFailed) continue; // id + value + access + date + namelen + name + mimelen + mime + dc + size + width + height + type + alt size += sizeof(quint64) + sizeof(qint16) + sizeof(quint64) + sizeof(qint32) + _stringSize(doc->name) + _stringSize(doc->mime) + sizeof(qint32) + sizeof(qint32) + sizeof(qint32) + sizeof(qint32) + sizeof(qint32) + _stringSize(doc->alt); @@ -2099,6 +2102,7 @@ namespace Local { EncryptedDescriptor data(size); for (RecentStickerPack::const_iterator i = recent.cbegin(); i != recent.cend(); ++i) { DocumentData *doc = i->first; + if (doc->status == FileFailed) continue; 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) << doc->alt; } @@ -2126,7 +2130,7 @@ namespace Local { qint32 date, dc, size, width, height, type; qint16 value; stickers.stream >> id >> value >> access >> date >> name >> mime >> dc >> size >> width >> height >> type; - if (stickers.version >= AppVersion) { + if (stickers.version >= 7021) { stickers.stream >> alt; } if (read.contains(id)) continue; diff --git a/Telegram/SourceFiles/localstorage.h b/Telegram/SourceFiles/localstorage.h index d9dc296282..e3d02caede 100644 --- a/Telegram/SourceFiles/localstorage.h +++ b/Telegram/SourceFiles/localstorage.h @@ -100,8 +100,14 @@ namespace Local { ReadMapState readMap(const QByteArray &pass); int32 oldMapVersion(); - void writeDraft(const PeerId &peer, const QString &text); - QString readDraft(const PeerId &peer); + struct MessageDraft { + MessageDraft(MsgId replyTo = 0, QString text = QString()) : replyTo(replyTo), text(text) { + } + MsgId replyTo; + QString text; + }; + void writeDraft(const PeerId &peer, const MessageDraft &draft); + MessageDraft readDraft(const PeerId &peer); void writeDraftPositions(const PeerId &peer, const MessageCursor &cur); MessageCursor readDraftPositions(const PeerId &peer); bool hasDraftPositions(const PeerId &peer); diff --git a/Telegram/SourceFiles/logs.cpp b/Telegram/SourceFiles/logs.cpp index bb0fe21a5d..968674f89e 100644 --- a/Telegram/SourceFiles/logs.cpp +++ b/Telegram/SourceFiles/logs.cpp @@ -40,7 +40,7 @@ namespace { QDateTime tm(QDateTime::currentDateTime()); QThread *thread = QThread::currentThread(); - MTPThread *mtpThread = dynamic_cast(thread); + MTPThread *mtpThread = qobject_cast(thread); uint32 threadId = mtpThread ? mtpThread->getThreadId() : 0; return QString("[%1 %2-%3]").arg(tm.toString("hh:mm:ss.zzz")).arg(QString("%1").arg(threadId, 2, 10, zero)).arg(++logEntry, 7, 10, zero); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 74c8dab2eb..c1a5fcaf32 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -350,11 +350,10 @@ MainWidget *TopBarWidget::main() { MainWidget::MainWidget(Window *window) : QWidget(window), _started(0), failedObjId(0), _dialogsWidth(st::dlgMinWidth), dialogs(this), history(this), profile(0), overview(0), _topBar(this), _forwardConfirm(0), hider(0), _mediaType(this), _mediaTypeMask(0), -updGoodPts(0), updLastPts(0), updPtsCount(0), updDate(0), updQts(-1), updSeq(0), updInited(false), _onlineRequest(0), _lastWasOnline(false), _lastSetOnline(0), _isIdle(false), -_failDifferenceTimeout(1), _lastUpdateTime(0), _cachedX(0), _cachedY(0), _background(0) { +updGoodPts(0), updLastPts(0), updPtsCount(0), updDate(0), updQts(-1), updSeq(0), updInited(false), updSkipPtsUpdateLevel(0), _onlineRequest(0), _lastWasOnline(false), _lastSetOnline(0), _isIdle(false), +_failDifferenceTimeout(1), _lastUpdateTime(0), _cachedX(0), _cachedY(0), _background(0), _api(new ApiWrap(this)) { setGeometry(QRect(0, st::titleHeight, App::wnd()->width(), App::wnd()->height() - st::titleHeight)); - App::initBackground(); updateScrollColors(); connect(window, SIGNAL(resized(const QSize &)), this, SLOT(onParentResize(const QSize &))); @@ -401,7 +400,7 @@ _failDifferenceTimeout(1), _lastUpdateTime(0), _cachedX(0), _cachedY(0), _backgr show(); setFocus(); - App::initMedia(); + _api->init(); } mtpRequestId MainWidget::onForward(const PeerId &peer, bool forwardSelected) { @@ -579,6 +578,10 @@ void MainWidget::deleteHistoryPart(PeerData *peer, const MTPmessages_AffectedHis MTP::send(MTPmessages_DeleteHistory(peer->input, d.voffset), rpcDone(&MainWidget::deleteHistoryPart, peer)); } +void MainWidget::deleteMessages(const QVector &ids) { + MTP::send(MTPmessages_DeleteMessages(MTP_vector(ids)), rpcDone(&MainWidget::msgsWereDeleted)); +} + void MainWidget::deletedContact(UserData *user, const MTPcontacts_Link &result) { const MTPDcontacts_link &d(result.c_contacts_link()); App::feedUsers(MTP_vector(1, d.vuser)); @@ -780,8 +783,9 @@ DialogsIndexed &MainWidget::contactsList() { return dialogs.contactsList(); } -void MainWidget::sendPreparedText(History *hist, const QString &text) { +void MainWidget::sendPreparedText(History *hist, const QString &text, MsgId replyTo) { QString sendingText, leftText = text; + if (replyTo < 0) replyTo = history.replyToId(); while (textSplit(sendingText, leftText, MaxMessageSize)) { MsgId newId = clientMsgId(); uint64 randomId = MTP::nonce(); @@ -789,9 +793,10 @@ void MainWidget::sendPreparedText(History *hist, const QString &text) { App::historyRegRandom(randomId, newId); MTPstring msgText(MTP_string(sendingText)); - int32 flags = (hist->peer->input.type() == mtpc_inputPeerSelf) ? 0 : (MTPDmessage_flag_unread | MTPDmessage_flag_out), replyToMsgId = 0; - hist->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(hist->peer->id), MTPint(), MTPint(), MTPint(), MTP_int(unixtime()), msgText, MTP_messageMediaEmpty())); - hist->sendRequestId = MTP::send(MTPmessages_SendMessage(hist->peer->input, MTP_int(replyToMsgId), msgText, MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); + int32 flags = (hist->peer->input.type() == mtpc_inputPeerSelf) ? 0 : (MTPDmessage_flag_unread | MTPDmessage_flag_out); + if (replyTo) flags |= MTPDmessage::flag_reply_to_msg_id; + hist->addToBack(MTP_message(MTP_int(flags), MTP_int(newId), MTP_int(MTP::authedId()), App::peerToMTP(hist->peer->id), MTPint(), MTPint(), MTP_int(replyTo), MTP_int(unixtime()), msgText, MTP_messageMediaEmpty())); + hist->sendRequestId = MTP::send(MTPmessages_SendMessage(hist->peer->input, MTP_int(replyTo), msgText, MTP_long(randomId)), App::main()->rpcDone(&MainWidget::sentDataReceived, randomId), RPCFailHandlerPtr(), 0, 0, hist->sendRequestId); } historyToDown(hist); @@ -800,10 +805,10 @@ void MainWidget::sendPreparedText(History *hist, const QString &text) { } } -void MainWidget::sendMessage(History *hist, const QString &text) { +void MainWidget::sendMessage(History *hist, const QString &text, MsgId replyTo) { readServerHistory(hist, false); hist->loadAround(0); - sendPreparedText(hist, history.prepareMessage(text)); + sendPreparedText(hist, history.prepareMessage(text), replyTo); } void MainWidget::readServerHistory(History *hist, bool force) { @@ -873,7 +878,7 @@ void MainWidget::overviewPreloaded(PeerData *peer, const MTPmessages_Messages &r const MTPDmessages_messages &d(result.c_messages_messages()); App::feedUsers(d.vusers); App::feedChats(d.vchats); - h->_overviewCount[type] = 0; + h->_overviewCount[type] = d.vmessages.c_vector().v.size(); } break; case mtpc_messages_messagesSlice: { @@ -937,6 +942,7 @@ void MainWidget::changingMsgId(HistoryItem *row, MsgId newId) { } void MainWidget::itemRemoved(HistoryItem *item) { + api()->itemRemoved(item); dialogs.itemRemoved(item); if (history.peer() == item->history()->peer) { history.itemRemoved(item); @@ -945,6 +951,7 @@ void MainWidget::itemRemoved(HistoryItem *item) { } void MainWidget::itemReplaced(HistoryItem *oldItem, HistoryItem *newItem) { + api()->itemReplaced(oldItem, newItem); dialogs.itemReplaced(oldItem, newItem); if (history.peer() == newItem->history()->peer) { history.itemReplaced(oldItem, newItem); @@ -1086,6 +1093,11 @@ void MainWidget::partWasRead(PeerData *peer, const MTPmessages_AffectedHistory & } } +void MainWidget::msgsWereDeleted(const MTPmessages_AffectedMessages &result) { + const MTPDmessages_affectedMessages &d(result.c_messages_affectedMessages()); + updPtsUpdated(d.vpts.v, d.vpts_count.v); +} + void MainWidget::videoLoadProgress(mtpFileLoader *loader) { VideoData *video = App::video(loader->objId()); if (video->loader) { @@ -1240,7 +1252,10 @@ void MainWidget::documentLoadProgress(mtpFileLoader *loader) { void MainWidget::documentLoadFailed(mtpFileLoader *loader, bool started) { loadFailed(loader, started, SLOT(documentLoadRetry())); DocumentData *document = App::document(loader->objId()); - if (document && document->loader) document->finish(); + if (document) { + if (document->loader) document->finish(); + document->status = FileFailed; + } } void MainWidget::documentLoadRetry() { @@ -1260,16 +1275,18 @@ void MainWidget::updateOnlineDisplay() { if (App::wnd()->settingsWidget()) App::wnd()->settingsWidget()->updateOnlineDisplay(); } -void MainWidget::confirmShareContact(bool ctrlShiftEnter, const QString &phone, const QString &fname, const QString &lname) { - history.confirmShareContact(ctrlShiftEnter, phone, fname, lname); +void MainWidget::confirmShareContact(bool ctrlShiftEnter, const QString &phone, const QString &fname, const QString &lname, MsgId replyTo) { + history.confirmShareContact(ctrlShiftEnter, phone, fname, lname, replyTo); } void MainWidget::confirmSendImage(const ReadyLocalMedia &img) { history.confirmSendImage(img); + history.onReplyCancel(); } -void MainWidget::confirmSendImageUncompressed(bool ctrlShiftEnter) { - history.uploadConfirmImageUncompressed(ctrlShiftEnter); +void MainWidget::confirmSendImageUncompressed(bool ctrlShiftEnter, MsgId replyTo) { + history.uploadConfirmImageUncompressed(ctrlShiftEnter, replyTo); + history.onReplyCancel(); } void MainWidget::cancelSendImage() { @@ -1402,6 +1419,14 @@ ImagePtr MainWidget::newBackgroundThumb() { return _background ? _background->thumb : ImagePtr(); } +ApiWrap *MainWidget::api() { + return _api; +} + +void MainWidget::updateReplyTo() { + history.updateReplyTo(true); +} + void MainWidget::setInnerFocus() { if (hider || !history.peer()) { if (hider && hider->wasOffered()) { @@ -1755,7 +1780,9 @@ void MainWidget::sentFullDataReceived(uint64 randomId, const MTPmessages_StatedM } } if (!randomId) { + ++updSkipPtsUpdateLevel; feedUpdate(MTP_updateNewMessage(d.vmessage, d.vpts, d.vpts_count)); + --updSkipPtsUpdateLevel; } } break; @@ -1774,7 +1801,9 @@ void MainWidget::sentFullDataReceived(uint64 randomId, const MTPmessages_StatedM } } if (!randomId) { + ++updSkipPtsUpdateLevel; feedUpdate(MTP_updateNewMessage(d.vmessage, d.vpts, d.vpts_count)); + --updSkipPtsUpdateLevel; } App::feedUserLinks(d.vlinks); } break; @@ -1794,7 +1823,7 @@ void MainWidget::sentFullDatasReceived(const MTPmessages_StatedMessages &result) App::feedUsers(d.vusers); App::feedChats(d.vchats); - App::feedMsgs(d.vmessages, true); + App::feedMsgs(d.vmessages, 1); history.peerMessagesUpdated(); } break; @@ -1810,7 +1839,7 @@ void MainWidget::sentFullDatasReceived(const MTPmessages_StatedMessages &result) App::feedUsers(d.vusers); App::feedChats(d.vchats); - App::feedMsgs(d.vmessages, true); + App::feedMsgs(d.vmessages, 1); history.peerMessagesUpdated(); App::feedUserLinks(d.vlinks); @@ -1841,8 +1870,8 @@ void MainWidget::dialogsToUp() { dialogs.dialogsToUp(); } -void MainWidget::newUnreadMsg(History *hist, MsgId msgId) { - history.newUnreadMsg(hist, msgId); +void MainWidget::newUnreadMsg(History *hist, HistoryItem *item) { + history.newUnreadMsg(hist, item); } void MainWidget::historyWasRead() { @@ -2184,6 +2213,7 @@ uint64 MainWidget::ptsKey(PtsSkippedQueue queue) { void MainWidget::applySkippedPtsUpdates() { if (_byPtsTimer.isActive()) _byPtsTimer.stop(); if (_byPtsQueue.isEmpty()) return; + ++updSkipPtsUpdateLevel; for (QMap::const_iterator i = _byPtsQueue.cbegin(), e = _byPtsQueue.cend(); i != e; ++i) { switch (i.value()) { case SkippedUpdate: feedUpdate(_byPtsUpdate.value(i.key())); break; @@ -2193,6 +2223,7 @@ void MainWidget::applySkippedPtsUpdates() { case SkippedStatedMessages: sentFullDatasReceived(_byPtsStatedMessages.value(i.key())); break; } } + --updSkipPtsUpdateLevel; clearSkippedPtsUpdates(); } @@ -2206,7 +2237,7 @@ void MainWidget::clearSkippedPtsUpdates() { } bool MainWidget::updPtsUpdated(int pts, int ptsCount) { // return false if need to save that update and apply later - if (!updInited) return true; + if (!updInited || updSkipPtsUpdateLevel) return true; updLastPts = qMax(updLastPts, pts); updPtsCount += ptsCount; @@ -2227,7 +2258,7 @@ void MainWidget::feedDifference(const MTPVector &users, const MTPVector App::feedUsers(users); App::feedChats(chats); feedMessageIds(other); - App::feedMsgs(msgs, true); + App::feedMsgs(msgs, 1); feedUpdates(other, true); history.peerMessagesUpdated(); } @@ -2286,7 +2317,7 @@ void MainWidget::start(const MTPUser &user) { _started = true; App::wnd()->sendServiceHistoryRequest(); Local::readRecentStickers(); - history.updateRecentStickers(); + history.start(); } bool MainWidget::started() { @@ -2300,18 +2331,27 @@ void MainWidget::openLocalUrl(const QString &url) { } } -void MainWidget::openUserByName(const QString &username) { +void MainWidget::openUserByName(const QString &username, bool toProfile) { UserData *user = App::userByName(username); if (user) { - emit showPeerAsync(user->id, 0, false, true); + if (toProfile) { + showPeerProfile(user); + } else { + emit showPeerAsync(user->id, 0, false, true); + } } else { - MTP::send(MTPcontacts_ResolveUsername(MTP_string(username)), rpcDone(&MainWidget::usernameResolveDone), rpcFail(&MainWidget::usernameResolveFail, username)); + MTP::send(MTPcontacts_ResolveUsername(MTP_string(username)), rpcDone(&MainWidget::usernameResolveDone, toProfile), rpcFail(&MainWidget::usernameResolveFail, username)); } } -void MainWidget::usernameResolveDone(const MTPUser &user) { +void MainWidget::usernameResolveDone(bool toProfile, const MTPUser &user) { App::wnd()->hideLayer(); - showPeer(App::feedUsers(MTP_vector(1, user))->id, 0, false, true); + UserData *u = App::feedUsers(MTP_vector(1, user)); + if (toProfile) { + showPeerProfile(u); + } else { + showPeer(u->id, 0, false, true); + } } bool MainWidget::usernameResolveFail(QString name, const RPCError &error) { @@ -2535,7 +2575,7 @@ MainWidget::~MainWidget() { delete hider; MTP::clearGlobalHandlers(); - App::deinitMedia(false); + delete _api; if (App::wnd()) App::wnd()->noMain(this); } @@ -2664,10 +2704,9 @@ void MainWidget::handleUpdates(const MTPUpdates &updates) { _byPtsUpdates.insert(ptsKey(SkippedUpdates), updates); return; } - - if (!App::userLoaded(d.vfrom_id.v)) return getDifference(); - int32 flags = MTPDmessage_flag_unread; - HistoryItem *item = App::histories().addToBack(MTP_message(MTP_int(flags), d.vid, d.vfrom_id, MTP_peerUser(MTP_int(MTP::authedId())), MTPint(), MTPint(), MTPint(), d.vdate, d.vmessage, MTP_messageMediaEmpty())); + if (!App::userLoaded(d.vuser_id.v)) return getDifference(); + bool out = (d.vflags.v & MTPDmessage_flag_out); + HistoryItem *item = App::histories().addToBack(MTP_message(d.vflags, d.vid, out ? MTP_int(MTP::authedId()) : d.vuser_id, MTP_peerUser(out ? d.vuser_id : MTP_int(MTP::authedId())), d.vfwd_from_id, d.vfwd_date, d.vreply_to_msg_id, d.vdate, d.vmessage, MTP_messageMediaEmpty())); if (item) { history.peerMessagesUpdated(item->history()->peer->id); } @@ -2681,10 +2720,8 @@ void MainWidget::handleUpdates(const MTPUpdates &updates) { _byPtsUpdates.insert(ptsKey(SkippedUpdates), updates); return; } - - if (!App::chatLoaded(d.vchat_id.v) || !App::userLoaded(d.vfrom_id.v)) return getDifference(); - int32 flags = MTPDmessage_flag_unread; // unread - HistoryItem *item = App::histories().addToBack(MTP_message(MTP_int(flags), d.vid, d.vfrom_id, MTP_peerChat(d.vchat_id), MTPint(), MTPint(), MTPint(), d.vdate, d.vmessage, MTP_messageMediaEmpty())); + if (!App::chatLoaded(d.vchat_id.v) || !App::userLoaded(d.vfrom_id.v) || (d.has_fwd_from_id() && !App::userLoaded(d.vfwd_from_id.v))) return getDifference(); + HistoryItem *item = App::histories().addToBack(MTP_message(d.vflags, d.vid, d.vfrom_id, MTP_peerChat(d.vchat_id), d.vfwd_from_id, d.vfwd_date, d.vreply_to_msg_id, d.vdate, d.vmessage, MTP_messageMediaEmpty())); if (item) { history.peerMessagesUpdated(item->history()->peer->id); } @@ -2897,7 +2934,7 @@ void MainWidget::feedUpdate(const MTPUpdate &update) { UserData *user = App::userLoaded(d.vuser_id.v); if (user) { if (App::history(user->id)->loadedAtBottom()) { - App::history(user->id)->addToBackService(clientMsgId(), date(d.vdate), lng_action_user_registered(lt_from, user->name), false, true); + App::history(user->id)->addToBackService(clientMsgId(), date(d.vdate), lng_action_user_registered(lt_from, user->name), MTPDmessage_flag_unread); } } } break; diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index 409f0d8c43..3cc90fafaa 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -17,13 +17,11 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org */ #pragma once -#include -#include "gui/flatbutton.h" - #include "dialogswidget.h" #include "historywidget.h" #include "profilewidget.h" #include "overviewwidget.h" +#include "apiwrap.h" class Window; struct DialogRow; @@ -187,7 +185,7 @@ public: void start(const MTPUser &user); void openLocalUrl(const QString &str); - void openUserByName(const QString &name); + void openUserByName(const QString &name, bool toProfile = false); void startFull(const MTPVector &users); bool started(); void applyNotifySetting(const MTPNotifyPeer &peer, const MTPPeerNotifySettings &settings, History *history = 0); @@ -213,7 +211,7 @@ public: void msgUpdated(PeerId peer, const HistoryItem *msg); void historyToDown(History *hist); void dialogsToUp(); - void newUnreadMsg(History *history, MsgId msgId); + void newUnreadMsg(History *history, HistoryItem *item); void historyWasRead(); void peerBefore(const PeerData *inPeer, MsgId inMsg, PeerData *&outPeer, MsgId &outMsg); @@ -229,9 +227,9 @@ public: void showBackFromStack(); QRect historyRect() const; - void confirmShareContact(bool ctrlShiftEnter, const QString &phone, const QString &fname, const QString &lname); + void confirmShareContact(bool ctrlShiftEnter, const QString &phone, const QString &fname, const QString &lname, MsgId replyTo); void confirmSendImage(const ReadyLocalMedia &img); - void confirmSendImageUncompressed(bool ctrlShiftEnter); + void confirmSendImageUncompressed(bool ctrlShiftEnter, MsgId replyTo); void cancelSendImage(); void destroyData(); @@ -262,6 +260,7 @@ public: bool leaveChatFailed(PeerData *peer, const RPCError &e); void deleteHistory(PeerData *peer, const MTPmessages_StatedMessage &result); void deleteHistoryPart(PeerData *peer, const MTPmessages_AffectedHistory &result); + void deleteMessages(const QVector &ids); void deletedContact(UserData *user, const MTPcontacts_Link &result); void deleteHistoryAndContact(UserData *user, const MTPcontacts_Link &result); void clearHistory(PeerData *peer); @@ -286,8 +285,8 @@ public: DialogsIndexed &contactsList(); - void sendMessage(History *history, const QString &text); - void sendPreparedText(History *hist, const QString &text); + void sendMessage(History *history, const QString &text, MsgId replyTo); + void sendPreparedText(History *hist, const QString &text, MsgId replyTo); void readServerHistory(History *history, bool force = true); @@ -324,6 +323,9 @@ public: bool chatBackgroundLoading(); void checkChatBackground(); ImagePtr newBackgroundThumb(); + + ApiWrap *api(); + void updateReplyTo(); ~MainWidget(); @@ -382,6 +384,7 @@ public slots: private: void partWasRead(PeerData *peer, const MTPmessages_AffectedHistory &result); + void msgsWereDeleted(const MTPmessages_AffectedMessages &result); void photosLoaded(History *h, const MTPmessages_Messages &msgs, mtpRequestId req); bool _started; @@ -406,7 +409,7 @@ private: void handleUpdates(const MTPUpdates &updates); bool updateFail(const RPCError &e); - void usernameResolveDone(const MTPUser &user); + void usernameResolveDone(bool toProfile, const MTPUser &user); bool usernameResolveFail(QString name, const RPCError &error); void hideAll(); @@ -437,6 +440,7 @@ private: int updGoodPts, updLastPts, updPtsCount; int updDate, updQts, updSeq; bool updInited; + int updSkipPtsUpdateLevel; SingleTimer noUpdatesTimer; mtpRequestId _onlineRequest; @@ -488,4 +492,6 @@ private: App::WallPaper *_background; + ApiWrap *_api; + }; diff --git a/Telegram/SourceFiles/mtproto/generate.py b/Telegram/SourceFiles/mtproto/generate.py index a386d26bc6..8f63fc735e 100644 --- a/Telegram/SourceFiles/mtproto/generate.py +++ b/Telegram/SourceFiles/mtproto/generate.py @@ -116,19 +116,27 @@ with open('scheme.tl') as f: prms = {}; conditions = {}; prmsList = []; - isTemplate = hasFlags = ''; + isTemplate = hasFlags = hasTemplate = ''; for param in paramsList: if (re.match(r'^\s*$', param)): continue; - pnametype = re.match(r'([a-z_][a-z0-9_]*):([A-Za-z0-9<>\._]+|!X|\#|[a-z_][a-z0-9_]*\.[0-9]+\?[A-Za-z0-9<>\._]+)$', param); + templ = re.match(r'^{([A-Za-z]+):Type}$', param); + if (templ): + hasTemplate = templ.group(1); + continue; + pnametype = re.match(r'([a-z_][a-z0-9_]*):([A-Za-z0-9<>\._]+|![a-zA-Z]+|\#|[a-z_][a-z0-9_]*\.[0-9]+\?[A-Za-z0-9<>\._]+)$', param); if (not pnametype): print('Bad param found: "' + param + '" in line: ' + line); continue; pname = pnametype.group(1); ptypewide = pnametype.group(2); - if (ptypewide == '!X'): - isTemplate = pname; - ptype = 'TQueryType'; + if (re.match(r'^!([a-zA-Z]+)$', ptypewide)): + if ('!' + hasTemplate == ptypewide): + isTemplate = pname; + ptype = 'TQueryType'; + else: + print('Bad template param name: "' + param + '" in line: ' + line); + continue; elif (ptypewide == '#'): hasFlags = pname; ptype = 'int'; diff --git a/Telegram/SourceFiles/mtproto/mtpConnection.h b/Telegram/SourceFiles/mtproto/mtpConnection.h index 5630a816e5..9d64de4bf1 100644 --- a/Telegram/SourceFiles/mtproto/mtpConnection.h +++ b/Telegram/SourceFiles/mtproto/mtpConnection.h @@ -23,6 +23,7 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org enum { MTPDmessage_flag_unread = (1 << 0), MTPDmessage_flag_out = (1 << 1), + MTPDmessage_flag_notify_by_from = (1 << 4), }; #include "mtproto/mtpPublicRSA.h" @@ -59,6 +60,8 @@ class MTProtoConnectionPrivate; class MTPSessionData; class MTPThread : public QThread { + Q_OBJECT + public: MTPThread(QObject *parent = 0); uint32 getThreadId() const; diff --git a/Telegram/SourceFiles/mtproto/mtpScheme.cpp b/Telegram/SourceFiles/mtproto/mtpScheme.cpp index 6ad14e8356..08c5b365ca 100644 --- a/Telegram/SourceFiles/mtproto/mtpScheme.cpp +++ b/Telegram/SourceFiles/mtproto/mtpScheme.cpp @@ -52,63 +52,240 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP int32 lev = level + types.size() - 1; switch (type) { - case mtpc_messages_chats: + case mtpc_inputPeerNotifySettings: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_chats"); + to.add("{ inputPeerNotifySettings"); 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); flags.push_back(0); break; + case 0: to.add(" mute_until: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" sound: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" show_previews: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_bad_msg_notification: + case mtpc_chatEmpty: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ bad_msg_notification"); + to.add("{ chatEmpty"); 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); flags.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); flags.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); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_bad_server_salt: + case mtpc_chat: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ bad_server_salt"); + to.add("{ chat"); 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); flags.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); flags.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); flags.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); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 4: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" left: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 6: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_updates_state: + case mtpc_chatForbidden: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ updates_state"); + to.add("{ chatForbidden"); 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); flags.push_back(0); break; - case 1: to.add(" qts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" venue: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" geo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 6: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 8: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 9: to.add(" checked_in: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 10: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" critical: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" url: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" text: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_help_noAppUpdate: + to.add("{ help_noAppUpdate }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + 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); flags.push_back(0); break; + case 1: to.add(" mtime: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" pq: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_userProfilePhotoEmpty: + to.add("{ userProfilePhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" photo_small: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" photo_big: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" mutual: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" info: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + 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); flags.push_back(0); break; + case 1: to.add(" documents: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -202,233 +379,92 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_sendMessageTypingAction: - to.add("{ sendMessageTypingAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageCancelAction: - to.add("{ sendMessageCancelAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageRecordVideoAction: - to.add("{ sendMessageRecordVideoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageUploadVideoAction: - to.add("{ sendMessageUploadVideoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageRecordAudioAction: - to.add("{ sendMessageRecordAudioAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageUploadAudioAction: - to.add("{ sendMessageUploadAudioAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageUploadPhotoAction: - to.add("{ sendMessageUploadPhotoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageUploadDocumentAction: - to.add("{ sendMessageUploadDocumentAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageGeoLocationAction: - to.add("{ sendMessageGeoLocationAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_sendMessageChooseContactAction: - to.add("{ sendMessageChooseContactAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_pong: + case mtpc_updates_differenceEmpty: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ pong"); - 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); flags.push_back(0); break; - case 1: to.add(" ping_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" blocked: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" foreign_link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messages_sentEncryptedMessage: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_sentEncryptedMessage"); + 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); flags.push_back(0); break; + case 1: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_messages_sentEncryptedFile: + case mtpc_updates_difference: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_sentEncryptedFile"); + to.add("{ updates_difference"); 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); flags.push_back(0); break; - case 1: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" new_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 2: to.add(" other_updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" state: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_wallPaper: + case mtpc_updates_differenceSlice: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ wallPaper"); + to.add("{ updates_differenceSlice"); 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); flags.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" sizes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" new_messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 2: to.add(" other_updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" intermediate_state: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_wallPaperSolid: + case mtpc_destroy_session_ok: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ wallPaperSolid"); + to.add("{ destroy_session_ok"); 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); flags.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 3: to.add(" color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" session_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_geochats_messages: + case mtpc_destroy_session_none: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_messages"); + to.add("{ destroy_session_none"); 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); flags.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" session_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_geochats_messagesSlice: + case mtpc_rpc_error: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_messagesSlice"); + to.add("{ rpc_error"); 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); flags.push_back(0); break; - case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" distance: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_chatFull: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ chatFull"); - 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); flags.push_back(0); break; - case 1: to.add(" participants: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" chat_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" error_code: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" error_message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -611,24 +647,573 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_help_appUpdate: + case mtpc_inputNotifyPeer: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ help_appUpdate"); + to.add("{ inputNotifyPeer"); 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); flags.push_back(0); break; - case 1: to.add(" critical: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" url: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" text: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_help_noAppUpdate: - to.add("{ help_noAppUpdate }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + case mtpc_inputNotifyUsers: + to.add("{ inputNotifyUsers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputNotifyChats: + to.add("{ inputNotifyChats }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputNotifyAll: + to.add("{ inputNotifyAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" peer: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" data: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_chatFull: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ chatFull"); + 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); flags.push_back(0); break; + case 1: to.add(" participants: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" chat_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" status: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" status: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + case 3: to.add(" is_password: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + case 3: to.add(" is_password: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" photos: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_pong: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ pong"); + 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); flags.push_back(0); break; + case 1: to.add(" ping_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputPeerNotifyEventsEmpty: + to.add("{ inputPeerNotifyEventsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputPeerNotifyEventsAll: + to.add("{ inputPeerNotifyEventsAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + 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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_privacyValueAllowContacts: + to.add("{ privacyValueAllowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_privacyValueAllowAll: + to.add("{ privacyValueAllowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_privacyValueDisallowContacts: + to.add("{ privacyValueDisallowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_privacyValueDisallowAll: + to.add("{ privacyValueDisallowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputPhotoEmpty: + to.add("{ inputPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_notifyUsers: + to.add("{ notifyUsers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_notifyChats: + to.add("{ notifyChats }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_notifyAll: + to.add("{ notifyAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_contacts_contactsNotModified: + to.add("{ contacts_contactsNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" duration: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 6: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_contactLinkUnknown: + to.add("{ contactLinkUnknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_contactLinkNone: + to.add("{ contactLinkNone }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_contactLinkHasPhone: + to.add("{ contactLinkHasPhone }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_contactLinkContact: + to.add("{ contactLinkContact }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputPeerEmpty: + to.add("{ inputPeerEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputPeerSelf: + to.add("{ inputPeerSelf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } break; case mtpc_updatesTooLong: @@ -643,12 +1228,16 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP 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); flags.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); flags.push_back(0); break; - case 2: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" flags: "); ++stages.back(); if (start >= end) throw Exception("start >= end in flags"); else flags.back() = *start; types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 6: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 7: to.add(" fwd_from_id: "); ++stages.back(); if (flag & MTPDupdateShortMessage::flag_fwd_from_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; + case 8: to.add(" fwd_date: "); ++stages.back(); if (flag & MTPDupdateShortMessage::flag_fwd_date) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; + case 9: to.add(" reply_to_msg_id: "); ++stages.back(); if (flag & MTPDupdateShortMessage::flag_reply_to_msg_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 3 IN FIELD flags ]"); } break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -661,13 +1250,17 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP 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); flags.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); flags.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); flags.push_back(0); break; - case 3: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 6: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" flags: "); ++stages.back(); if (start >= end) throw Exception("start >= end in flags"); else flags.back() = *start; types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" chat_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 6: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 7: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 8: to.add(" fwd_from_id: "); ++stages.back(); if (flag & MTPDupdateShortChatMessage::flag_fwd_from_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; + case 9: to.add(" fwd_date: "); ++stages.back(); if (flag & MTPDupdateShortChatMessage::flag_fwd_date) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; + case 10: to.add(" reply_to_msg_id: "); ++stages.back(); if (flag & MTPDupdateShortChatMessage::flag_reply_to_msg_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 3 IN FIELD flags ]"); } break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -721,130 +1314,6 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_encryptedChatEmpty: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ encryptedChatEmpty"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_encryptedChatWaiting: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ encryptedChatWaiting"); - 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); flags.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); flags.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" admin_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" participant_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_encryptedChatRequested: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ encryptedChatRequested"); - 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); flags.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); flags.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" admin_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" participant_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" g_a: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_encryptedChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ encryptedChat"); - 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); flags.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); flags.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" admin_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" participant_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" g_a_or_b: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 6: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_encryptedChatDiscarded: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ encryptedChatDiscarded"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" info: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - case mtpc_messages_dhConfigNotModified: if (stage) { to.add(",\n").addSpaces(lev); @@ -874,1045 +1343,34 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_inputFile: + case mtpc_nearestDc: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ inputFile"); + to.add("{ nearestDc"); 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); flags.push_back(0); break; - case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 0: to.add(" country: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_inputFileBig: + case mtpc_dialog: 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); flags.push_back(0); break; - case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputPeerNotifyEventsEmpty: - to.add("{ inputPeerNotifyEventsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputPeerNotifyEventsAll: - to.add("{ inputPeerNotifyEventsAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_peerNotifySettingsEmpty: - to.add("{ peerNotifySettingsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" sound: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" show_previews: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputAudioEmpty: - to.add("{ inputAudioEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" photos: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_contacts_contactsNotModified: - to.add("{ contacts_contactsNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" participants: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" hostname: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 3: to.add(" port: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputEncryptedFileEmpty: - to.add("{ inputEncryptedFileEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" status: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" status: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_account_noPassword: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_noPassword"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" new_salt: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_account_password: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_password"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" current_salt: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" new_salt: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" hint: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputGeoPointEmpty: - to.add("{ inputGeoPointEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" long: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputPrivacyValueAllowContacts: - to.add("{ inputPrivacyValueAllowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputPrivacyValueAllowAll: - to.add("{ inputPrivacyValueAllowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputPrivacyValueDisallowContacts: - to.add("{ inputPrivacyValueDisallowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputPrivacyValueDisallowAll: - to.add("{ inputPrivacyValueDisallowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputPeerEmpty: - to.add("{ inputPeerEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputPeerSelf: - to.add("{ inputPeerSelf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messageEmpty: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messageEmpty"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_message: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ message"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" flags: "); ++stages.back(); if (start >= end) throw Exception("start >= end in flags"); else flags.back() = *start; types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 3: to.add(" to_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" fwd_from_id: "); ++stages.back(); if (flag & MTPDmessage::flag_fwd_from_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; - case 5: to.add(" fwd_date: "); ++stages.back(); if (flag & MTPDmessage::flag_fwd_date) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; - case 6: to.add(" reply_to_msg_id: "); ++stages.back(); if (flag & MTPDmessage::flag_reply_to_msg_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 3 IN FIELD flags ]"); } break; - case 7: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 8: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 9: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messageService: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messageService"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" flags: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 3: to.add(" to_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" action: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_photoEmpty: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ photoEmpty"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_photo: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ photo"); - 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); flags.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); flags.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); flags.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" geo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 6: to.add(" sizes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" mutual: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messages_messageEmpty: - to.add("{ messages_messageEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - 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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" phone: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messages_stickersNotModified: - to.add("{ messages_stickersNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_messages_stickers: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_stickers"); - 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); flags.push_back(0); break; - case 1: to.add(" stickers: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" sound: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" show_previews: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - case 3: to.add(" is_password: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - case 3: to.add(" is_password: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_peerNotifyEventsEmpty: - to.add("{ peerNotifyEventsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_peerNotifyEventsAll: - to.add("{ peerNotifyEventsAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 6: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputPhotoCropAuto: - to.add("{ inputPhotoCropAuto }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputPhotoCrop: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputPhotoCrop"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" crop_left: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" crop_top: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" crop_width: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 4: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" left: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 6: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" venue: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" geo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 6: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 8: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 9: to.add(" checked_in: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 10: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" salt: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - 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); flags.push_back(0); break; - case 1: to.add(" p: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" dialogs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" profile_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" blocked: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_notifyPeer: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ notifyPeer"); + 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_notifyUsers: - to.add("{ notifyUsers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_notifyChats: - to.add("{ notifyChats }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_notifyAll: - to.add("{ notifyAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 4: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" thumb: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 7: to.add(" attributes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_contacts_importedContacts: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_importedContacts"); - 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); flags.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); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 2: to.add(" read_inbox_max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" unread_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -1940,279 +1398,6 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_encryptedFileEmpty: - to.add("{ encryptedFileEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" expires: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" test_mode: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" this_dc: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" dc_options: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" chat_size_max: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 6: to.add(" broadcast_size_max: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 7: to.add(" online_update_period_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 8: to.add(" offline_blur_timeout_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 9: to.add(" offline_idle_timeout_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 10: to.add(" online_cloud_timeout_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 11: to.add(" notify_cloud_delay_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 12: to.add(" notify_default_delay_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 13: to.add(" chat_big_size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 14: to.add(" disabled_features: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" duration: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 6: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - 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); flags.push_back(0); break; - case 1: to.add(" documents: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_long); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messages_affectedMessages: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_affectedMessages"); - 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); flags.push_back(0); break; - case 1: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputNotifyUsers: - to.add("{ inputNotifyUsers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputNotifyChats: - to.add("{ inputNotifyChats }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputNotifyAll: - to.add("{ inputNotifyAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - 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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_chatPhotoEmpty: - to.add("{ chatPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" photo_big: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" peer: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" data: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - case mtpc_client_DH_inner_data: if (stage) { to.add(",\n").addSpaces(lev); @@ -2229,36 +1414,20 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_resPQ: + case mtpc_inputPrivacyKeyStatusTimestamp: + to.add("{ inputPrivacyKeyStatusTimestamp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_disabledFeature: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ resPQ"); + to.add("{ disabledFeature"); 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); flags.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); flags.push_back(0); break; - case 2: to.add(" pq: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputVideoEmpty: - to.add("{ inputVideoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 0: to.add(" feature: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" description: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -2281,49 +1450,37 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_inputChatPhotoEmpty: - to.add("{ inputChatPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + case mtpc_encryptedFileEmpty: + to.add("{ encryptedFileEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - case mtpc_inputChatUploadedPhoto: + case mtpc_encryptedFile: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ inputChatUploadedPhoto"); + to.add("{ encryptedFile"); 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); flags.push_back(0); break; - case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 2: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_inputChatPhoto: + case mtpc_contactBlocked: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ inputChatPhoto"); + to.add("{ contactBlocked"); 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); flags.push_back(0); break; - case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -2435,66 +1592,943 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_auth_exportedAuthorization: + case mtpc_msgs_state_req: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ auth_exportedAuthorization"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messages_messageEmpty: + to.add("{ messages_messageEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_photoEmpty: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photoEmpty"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_photo: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photo"); + 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); flags.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); flags.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); flags.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" geo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 6: to.add(" sizes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_userStatusEmpty: + to.add("{ userStatusEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_userStatusRecently: + to.add("{ userStatusRecently }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_userStatusLastWeek: + to.add("{ userStatusLastWeek }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_userStatusLastMonth: + to.add("{ userStatusLastMonth }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + 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); flags.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_sendMessageTypingAction: + to.add("{ sendMessageTypingAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageCancelAction: + to.add("{ sendMessageCancelAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageRecordVideoAction: + to.add("{ sendMessageRecordVideoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageUploadVideoAction: + to.add("{ sendMessageUploadVideoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageRecordAudioAction: + to.add("{ sendMessageRecordAudioAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageUploadAudioAction: + to.add("{ sendMessageUploadAudioAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageUploadPhotoAction: + to.add("{ sendMessageUploadPhotoAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageUploadDocumentAction: + to.add("{ sendMessageUploadDocumentAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageGeoLocationAction: + to.add("{ sendMessageGeoLocationAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_sendMessageChooseContactAction: + to.add("{ sendMessageChooseContactAction }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + 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); flags.push_back(0); break; + case 1: to.add(" qts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_chatPhotoEmpty: + to.add("{ chatPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" photo_big: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messageActionEmpty: + to.add("{ messageActionEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messageActionChatDeletePhoto: + to.add("{ messageActionChatDeletePhoto }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messageActionGeoChatCheckin: + to.add("{ messageActionGeoChatCheckin }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + 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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" foreign_link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" location: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messages_stickersNotModified: + to.add("{ messages_stickersNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_messages_stickers: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_stickers"); + 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); flags.push_back(0); break; + case 1: to.add(" stickers: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" name: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputEncryptedFileEmpty: + to.add("{ inputEncryptedFileEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" parts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" action: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" salt: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputDocumentEmpty: + to.add("{ inputDocumentEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_updates_differenceEmpty: + case mtpc_messages_sentMessageLink: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ updates_differenceEmpty"); + to.add("{ messages_sentMessageLink"); 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); flags.push_back(0); break; - case 1: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_updates_difference: + case mtpc_inputUserEmpty: + to.add("{ inputUserEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputUserSelf: + to.add("{ inputUserSelf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputUserContact: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ updates_difference"); + to.add("{ inputUserContact"); 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); flags.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); flags.push_back(0); break; - case 2: to.add(" other_updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" state: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_updates_differenceSlice: + case mtpc_inputUserForeign: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ updates_differenceSlice"); + to.add("{ inputUserForeign"); 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); flags.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); flags.push_back(0); break; - case 2: to.add(" other_updates: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" intermediate_state: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" hostname: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" port: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messages_affectedMessages: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_affectedMessages"); + 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); flags.push_back(0); break; + case 1: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_peerUser: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ peerUser"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_peerChat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ peerChat"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputPhotoCropAuto: + to.add("{ inputPhotoCropAuto }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputPhotoCrop: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputPhotoCrop"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" crop_left: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" crop_top: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" crop_width: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_contactStatus: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contactStatus"); + 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); flags.push_back(0); break; + case 1: to.add(" status: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_account_noPassword: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_noPassword"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" new_salt: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_account_password: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_password"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" current_salt: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" new_salt: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" hint: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputAudioEmpty: + to.add("{ inputAudioEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" participants: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" version: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" sizes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" title: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" color: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -2908,30 +2942,69 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_messages: + case mtpc_server_DH_inner_data: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_messages"); + to.add("{ server_DH_inner_data"); 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); flags.push_back(0); break; - case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 2: to.add(" g: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_messages_messagesSlice: + case mtpc_privacyKeyStatusTimestamp: + to.add("{ privacyKeyStatusTimestamp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputChatPhotoEmpty: + to.add("{ inputChatPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputChatUploadedPhoto: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_messagesSlice"); + to.add("{ inputChatUploadedPhoto"); 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); flags.push_back(0); break; + case 0: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; @@ -2939,113 +3012,69 @@ 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(); flags.pop_back(); + case mtpc_inputGeoPointEmpty: + to.add("{ inputGeoPointEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - case mtpc_geoChatMessageEmpty: + case mtpc_inputGeoPoint: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geoChatMessageEmpty"); + to.add("{ inputGeoPoint"); 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); flags.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" lat: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" long: "); ++stages.back(); types.push_back(mtpc_double); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_geoChatMessage: + case mtpc_bad_msg_notification: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geoChatMessage"); + to.add("{ bad_msg_notification"); 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); flags.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" bad_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_geoChatMessageService: + case mtpc_bad_server_salt: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geoChatMessageService"); + to.add("{ bad_server_salt"); 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); flags.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" action: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" bad_msg_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_rpc_error: + case mtpc_p_q_inner_data: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ rpc_error"); + to.add("{ p_q_inner_data"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" error_code: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" error_message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_contactLinkUnknown: - to.add("{ contactLinkUnknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_contactLinkNone: - to.add("{ contactLinkNone }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_contactLinkHasPhone: - to.add("{ contactLinkHasPhone }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_contactLinkContact: - to.add("{ contactLinkContact }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_contactStatus: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contactStatus"); - 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); flags.push_back(0); break; - case 1: to.add(" status: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" pq: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" p: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" nonce: "); ++stages.back(); types.push_back(mtpc_int128); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -3064,6 +3093,482 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } 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); flags.push_back(0); break; + case 1: to.add(" now: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_peerNotifySettingsEmpty: + to.add("{ peerNotifySettingsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" sound: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" show_previews: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_encryptedChatEmpty: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ encryptedChatEmpty"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_encryptedChatWaiting: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ encryptedChatWaiting"); + 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); flags.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); flags.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" admin_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" participant_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_encryptedChatRequested: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ encryptedChatRequested"); + 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); flags.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); flags.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" admin_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" participant_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" g_a: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_encryptedChat: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ encryptedChat"); + 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); flags.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); flags.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" admin_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" participant_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" g_a_or_b: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 6: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_encryptedChatDiscarded: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ encryptedChatDiscarded"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messages_allStickersNotModified: + to.add("{ messages_allStickersNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_messages_allStickers: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_allStickers"); + 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); flags.push_back(0); break; + case 1: to.add(" packs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" documents: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + case 3: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" link: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" profile_photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" blocked: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" blocked: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" duration: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 7: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 8: to.add(" thumb: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 10: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 11: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_contacts_importedContacts: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_importedContacts"); + 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); flags.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); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_peerNotifyEventsEmpty: + to.add("{ peerNotifyEventsEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_peerNotifyEventsAll: + to.add("{ peerNotifyEventsAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputPrivacyValueAllowContacts: + to.add("{ inputPrivacyValueAllowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputPrivacyValueAllowAll: + to.add("{ inputPrivacyValueAllowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputPrivacyValueDisallowContacts: + to.add("{ inputPrivacyValueDisallowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputPrivacyValueDisallowAll: + to.add("{ inputPrivacyValueDisallowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_auth_exportedAuthorization: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_exportedAuthorization"); + 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); flags.push_back(0); break; + case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" dialogs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + case mtpc_messages_statedMessage: if (stage) { to.add(",\n").addSpaces(lev); @@ -3100,15 +3605,42 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_inputPhotoEmpty: - to.add("{ inputPhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputPhoto: + case mtpc_config: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ inputPhoto"); + 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); flags.push_back(0); break; + case 1: to.add(" expires: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" test_mode: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" this_dc: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" dc_options: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" chat_size_max: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 6: to.add(" broadcast_size_max: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 7: to.add(" online_update_period_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 8: to.add(" offline_blur_timeout_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 9: to.add(" offline_idle_timeout_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 10: to.add(" online_cloud_timeout_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 11: to.add(" notify_cloud_delay_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 12: to.add(" notify_default_delay_ms: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 13: to.add(" chat_big_size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 14: to.add(" disabled_features: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputVideoEmpty: + to.add("{ inputVideoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputVideo: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ inputVideo"); to.add("\n").addSpaces(lev); } switch (stage) { @@ -3118,568 +3650,6 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } 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); flags.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); flags.push_back(0); break; - case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" read_inbox_max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" unread_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" notify_settings: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_peerUser: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ peerUser"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_peerChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ peerChat"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" now: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_storage_fileUnknown: - to.add("{ storage_fileUnknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_fileJpeg: - to.add("{ storage_fileJpeg }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_fileGif: - to.add("{ storage_fileGif }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_filePng: - to.add("{ storage_filePng }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_filePdf: - to.add("{ storage_filePdf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_fileMp3: - to.add("{ storage_fileMp3 }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_fileMov: - to.add("{ storage_fileMov }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_filePartial: - to.add("{ storage_filePartial }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_fileMp4: - to.add("{ storage_fileMp4 }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_storage_fileWebp: - to.add("{ storage_fileWebp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_userStatusEmpty: - to.add("{ userStatusEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_userStatusRecently: - to.add("{ userStatusRecently }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_userStatusLastWeek: - to.add("{ userStatusLastWeek }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_userStatusLastMonth: - to.add("{ userStatusLastMonth }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_messageActionEmpty: - to.add("{ messageActionEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messageActionChatDeletePhoto: - to.add("{ messageActionChatDeletePhoto }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" address: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messageActionGeoChatCheckin: - to.add("{ messageActionGeoChatCheckin }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_privacyValueAllowContacts: - to.add("{ privacyValueAllowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_privacyValueAllowAll: - to.add("{ privacyValueAllowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_privacyValueDisallowContacts: - to.add("{ privacyValueDisallowContacts }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_privacyValueDisallowAll: - to.add("{ privacyValueDisallowAll }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messages_allStickersNotModified: - to.add("{ messages_allStickersNotModified }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_messages_allStickers: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_allStickers"); - 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); flags.push_back(0); break; - case 1: to.add(" packs: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" documents: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputMessagesFilterEmpty: - to.add("{ inputMessagesFilterEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputMessagesFilterPhotos: - to.add("{ inputMessagesFilterPhotos }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputMessagesFilterVideo: - to.add("{ inputMessagesFilterVideo }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputMessagesFilterPhotoVideo: - to.add("{ inputMessagesFilterPhotoVideo }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputMessagesFilterPhotoVideoDocuments: - to.add("{ inputMessagesFilterPhotoVideoDocuments }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputMessagesFilterDocument: - to.add("{ inputMessagesFilterDocument }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputMessagesFilterAudio: - to.add("{ inputMessagesFilterAudio }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_privacyKeyStatusTimestamp: - to.add("{ privacyKeyStatusTimestamp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputDocumentEmpty: - to.add("{ inputDocumentEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" user: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" mtime: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" g: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - case mtpc_documentAttributeImageSize: if (stage) { to.add(",\n").addSpaces(lev); @@ -3752,300 +3722,487 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_msgs_state_req: + case mtpc_messages_messages: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ msgs_state_req"); + to.add("{ messages_messages"); 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); flags.push_back(0); break; + case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_videoEmpty: + case mtpc_messages_messagesSlice: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ videoEmpty"); + to.add("{ messages_messagesSlice"); 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); flags.push_back(0); break; + case 0: to.add(" count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_video: + case mtpc_messages_statedMessages: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ video"); + to.add("{ messages_statedMessages"); 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); flags.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); flags.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); flags.push_back(0); break; - case 3: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" duration: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 7: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 8: to.add(" thumb: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 10: to.add(" w: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 11: to.add(" h: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_disabledFeature: + case mtpc_messages_statedMessagesLinks: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ disabledFeature"); + to.add("{ messages_statedMessagesLinks"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" feature: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" description: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" messages: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" chats: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 6: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_messages_sentMessage: + case mtpc_inputPhoneContact: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_sentMessage"); + to.add("{ inputPhoneContact"); 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); flags.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" client_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" phone: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_messages_sentMessageLink: + case mtpc_contacts_found: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_sentMessageLink"); + to.add("{ contacts_found"); 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); flags.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" pts_count: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" links: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 5: to.add(" seq: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_inputUserEmpty: - to.add("{ inputUserEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_inputUserSelf: - to.add("{ inputUserSelf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - case 3: to.add(" secret: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_userProfilePhotoEmpty: - to.add("{ userProfilePhotoEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" photo_small: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" photo_big: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 0: to.add(" results: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_dh_gen_ok: + case mtpc_server_DH_params_fail: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ dh_gen_ok"); + 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); flags.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); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_dh_gen_retry: + case mtpc_server_DH_params_ok: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ dh_gen_retry"); + 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); flags.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); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_dh_gen_fail: + case mtpc_account_privacyRules: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ dh_gen_fail"); + 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); flags.push_back(0); break; + case 1: to.add(" users: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 4: to.add(" size: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" thumb: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 7: to.add(" attributes: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messageEmpty: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messageEmpty"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_message: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ message"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" flags: "); ++stages.back(); if (start >= end) throw Exception("start >= end in flags"); else flags.back() = *start; types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" to_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" fwd_from_id: "); ++stages.back(); if (flag & MTPDmessage::flag_fwd_from_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; + case 5: to.add(" fwd_date: "); ++stages.back(); if (flag & MTPDmessage::flag_fwd_date) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; + case 6: to.add(" reply_to_msg_id: "); ++stages.back(); if (flag & MTPDmessage::flag_reply_to_msg_id) { types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 3 IN FIELD flags ]"); } break; + case 7: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 8: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 9: to.add(" media: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messageService: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messageService"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" flags: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" to_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 4: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 5: to.add(" action: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_storage_fileUnknown: + to.add("{ storage_fileUnknown }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_fileJpeg: + to.add("{ storage_fileJpeg }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_fileGif: + to.add("{ storage_fileGif }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_filePng: + to.add("{ storage_filePng }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_filePdf: + to.add("{ storage_filePdf }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_fileMp3: + to.add("{ storage_fileMp3 }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_fileMov: + to.add("{ storage_fileMov }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_filePartial: + to.add("{ storage_filePartial }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_fileMp4: + to.add("{ storage_fileMp4 }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_storage_fileWebp: + to.add("{ storage_fileWebp }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + 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); flags.push_back(0); break; + case 1: to.add(" distance: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_inputMessagesFilterEmpty: + to.add("{ inputMessagesFilterEmpty }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputMessagesFilterPhotos: + to.add("{ inputMessagesFilterPhotos }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputMessagesFilterVideo: + to.add("{ inputMessagesFilterVideo }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputMessagesFilterPhotoVideo: + to.add("{ inputMessagesFilterPhotoVideo }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputMessagesFilterPhotoVideoDocuments: + to.add("{ inputMessagesFilterPhotoVideoDocuments }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputMessagesFilterDocument: + to.add("{ inputMessagesFilterDocument }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_inputMessagesFilterAudio: + to.add("{ inputMessagesFilterAudio }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_geochats_getRecents: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ geochats_getRecents"); + 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); flags.push_back(0); break; + case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_geochats_search: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + 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); flags.push_back(0); break; + case 1: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" filter: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; + case 5: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 7: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_geochats_getHistory: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + 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); flags.push_back(0); break; + case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_contacts_getBlocked: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_getBlocked"); + 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); flags.push_back(0); break; + case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + 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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_help_getAppUpdate: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ help_getAppUpdate"); + 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); flags.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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_contacts_importContacts: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - 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); flags.push_back(0); break; - case 1: to.add(" replace: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -4063,91 +4220,18 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_requestEncryption: + case mtpc_messages_sendMessage: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_requestEncryption"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" g_a: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messages_acceptEncryption: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_acceptEncryption"); + 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); flags.push_back(0); break; - case 1: to.add(" g_b: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_help_getConfig: - to.add("{ help_getConfig }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_photos_getUserPhotos: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ photos_getUserPhotos"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" user_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messages_deleteMessages: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_deleteMessages"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_messages_readMessageContents: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ messages_readMessageContents"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_contacts_deleteContact: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ contacts_deleteContact"); - 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); flags.push_back(0); break; + case 1: to.add(" reply_to_msg_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -4519,6 +4603,92 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; + case mtpc_messages_deleteMessages: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_deleteMessages"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messages_readMessageContents: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_readMessageContents"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_invokeAfterMsg: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ invokeAfterMsg"); + 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); flags.push_back(0); break; + case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.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); flags.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); flags.push_back(0); break; + case 5: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_invokeWithLayer: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ invokeWithLayer"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" layer: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + case mtpc_messages_sendEncrypted: if (stage) { to.add(",\n").addSpaces(lev); @@ -4565,70 +4735,215 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_users_getUsers: + case mtpc_account_getAccountTTL: + to.add("{ account_getAccountTTL }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_photos_uploadProfilePhoto: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ users_getUsers"); + to.add("{ photos_uploadProfilePhoto"); 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); flags.push_back(0); break; + case 0: to.add(" file: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" geo_point: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_help_getNearestDc: - to.add("{ help_getNearestDc }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_updates_getState: - to.add("{ updates_getState }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_geochats_getRecents: + case mtpc_destroy_session: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_getRecents"); + to.add("{ destroy_session"); 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); flags.push_back(0); break; + case 0: to.add(" session_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_account_getPassword: + to.add("{ account_getPassword }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_account_getWallPapers: + to.add("{ account_getWallPapers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + 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); flags.push_back(0); break; case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_geochats_search: + case mtpc_auth_signUp: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_search"); + to.add("{ auth_signUp"); 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); flags.push_back(0); break; - case 1: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" filter: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; - case 5: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 7: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.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); flags.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); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_geochats_getHistory: + case mtpc_auth_signIn: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ geochats_getHistory"); + to.add("{ auth_signIn"); 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); flags.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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_auth_checkPassword: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_checkPassword"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" password_hash: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_auth_sendCode: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ auth_sendCode"); + 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); flags.push_back(0); break; + case 1: to.add(" sms_type: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" api_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" api_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 1: to.add(" radius: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_set_client_DH_params: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ set_client_DH_params"); + 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); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_photos_getUserPhotos: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ photos_getUserPhotos"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; @@ -4636,16 +4951,73 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_getDhConfig: + case mtpc_updates_getDifference: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_getDhConfig"); + to.add("{ updates_getDifference"); 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); flags.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); flags.push_back(0); break; + case 0: to.add(" pts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" qts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_updates_getState: + to.add("{ updates_getState }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_account_getNotifySettings: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ account_getNotifySettings"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_contacts_getContacts: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ contacts_getContacts"); + 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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -4676,31 +5048,49 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_messages_readHistory: + case mtpc_auth_checkPhone: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_readHistory"); + to.add("{ auth_checkPhone"); 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); flags.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); flags.push_back(0); break; - case 2: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_messages_deleteHistory: + case mtpc_help_getSupport: + to.add("{ help_getSupport }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_messages_requestEncryption: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_deleteHistory"); + to.add("{ messages_requestEncryption"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" user_id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" g_a: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_messages_acceptEncryption: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_acceptEncryption"); 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); flags.push_back(0); break; - case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" g_b: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" key_fingerprint: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -4793,146 +5183,179 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_req_pq: + case mtpc_contacts_importContacts: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ req_pq"); + to.add("{ contacts_importContacts"); 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); flags.push_back(0); break; + case 0: to.add(" contacts: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" replace: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_messages_sendMessage: + case mtpc_users_getFullUser: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_sendMessage"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_contacts_exportCard: + to.add("{ contacts_exportCard }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_messages_receivedMessages: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_receivedMessages"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_help_getNearestDc: + to.add("{ help_getNearestDc }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_messages_getChats: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ messages_getChats"); + 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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } + break; + + case mtpc_help_getInviteText: + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ help_getInviteText"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" lang_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" reply_to_msg_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" message: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" random_id: "); ++stages.back(); types.push_back(mtpc_long); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 2: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_messages_getFullChat: + case mtpc_messages_deleteHistory: 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_geochats_getFullChat: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ geochats_getFullChat"); + 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); flags.push_back(0); break; + case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_contacts_getContacts: + case mtpc_photos_updateProfilePhoto: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_getContacts"); + to.add("{ photos_updateProfilePhoto"); 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); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } 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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_contacts_getStatuses: - to.add("{ contacts_getStatuses }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - case mtpc_auth_exportAuthorization: if (stage) { to.add(",\n").addSpaces(lev); @@ -4946,147 +5369,15 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_updates_getDifference: + case mtpc_users_getUsers: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ updates_getDifference"); + to.add("{ users_getUsers"); 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); flags.push_back(0); break; - case 1: to.add(" date: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" qts: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_account_getPassword: - to.add("{ account_getPassword }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" filter: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; - case 5: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - case 7: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_help_getSupport: - to.add("{ help_getSupport }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_invokeAfterMsg: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ invokeAfterMsg"); - 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); flags.push_back(0); break; - case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.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); flags.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); flags.push_back(0); break; - case 5: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_invokeWithLayer: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ invokeWithLayer"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" layer: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" query: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(00); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -5193,127 +5484,72 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_contacts_getBlocked: + case mtpc_help_getConfig: + to.add("{ help_getConfig }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_contacts_getStatuses: + to.add("{ contacts_getStatuses }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); + break; + + case mtpc_contacts_getSuggested: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_getBlocked"); + to.add("{ contacts_getSuggested"); 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); flags.push_back(0); break; - case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_destroy_session: + case mtpc_messages_getMessages: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ destroy_session"); + to.add("{ messages_getMessages"); 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); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(mtpc_int); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_messages_getStickers: + case mtpc_messages_getHistory: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_getStickers"); + to.add("{ messages_getHistory"); 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); flags.push_back(0); break; - case 1: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 3: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; - case mtpc_contacts_exportCard: - to.add("{ contacts_exportCard }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_messages_receivedMessages: + case mtpc_messages_search: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ messages_receivedMessages"); + to.add("{ messages_search"); to.add("\n").addSpaces(lev); } switch (stage) { - case 0: to.add(" max_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_account_getWallPapers: - to.add("{ account_getWallPapers }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - break; - - case mtpc_help_getInviteText: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ help_getInviteText"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" lang_code: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_account_getAccountTTL: - to.add("{ account_getAccountTTL }"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); - 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); flags.push_back(0); break; - case 1: to.add(" caption: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" geo_point: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_auth_sendCode: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_sendCode"); - 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); flags.push_back(0); break; - case 1: to.add(" sms_type: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" api_id: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" api_hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 0: to.add(" peer: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" q: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" filter: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.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); flags.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); flags.push_back(0); break; + case 5: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.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); flags.push_back(0); break; + case 7: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -5348,29 +5584,15 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_ping: + case mtpc_contacts_deleteContact: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ ping"); + to.add("{ contacts_deleteContact"); 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; + case 0: to.add(" id: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; @@ -5393,108 +5615,6 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } 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); flags.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); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" bytes: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_auth_checkPassword: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ auth_checkPassword"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" password_hash: "); ++stages.back(); types.push_back(mtpc_bytes); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" offset: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - case 1: to.add(" radius: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - case mtpc_account_getPrivacy: if (stage) { to.add(",\n").addSpaces(lev); @@ -5522,128 +5642,16 @@ void mtpTextSerializeType(MTPStringLogger &to, const mtpPrime *&from, const mtpP } break; - case mtpc_contacts_search: + case mtpc_messages_getStickers: if (stage) { to.add(",\n").addSpaces(lev); } else { - to.add("{ contacts_search"); + to.add("{ messages_getStickers"); 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); flags.push_back(0); break; - case 1: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_account_getNotifySettings: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ account_getNotifySettings"); - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.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); flags.push_back(0); break; - case 2: to.add(" limit: "); ++stages.back(); types.push_back(mtpc_int); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_help_getAppUpdate: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ help_getAppUpdate"); - 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); flags.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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - 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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_photos_updateProfilePhoto: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ photos_updateProfilePhoto"); - 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); flags.push_back(0); break; - case 1: to.add(" crop: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } - break; - - case mtpc_set_client_DH_params: - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ set_client_DH_params"); - 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); flags.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); flags.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); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.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); flags.push_back(0); break; + case 0: to.add(" emoticon: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" hash: "); ++stages.back(); types.push_back(mtpc_string); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; } break; diff --git a/Telegram/SourceFiles/mtproto/mtpScheme.h b/Telegram/SourceFiles/mtproto/mtpScheme.h index a0eae694f8..10461b91d8 100644 --- a/Telegram/SourceFiles/mtproto/mtpScheme.h +++ b/Telegram/SourceFiles/mtproto/mtpScheme.h @@ -222,8 +222,8 @@ enum { mtpc_updates_difference = 0xf49ca0, mtpc_updates_differenceSlice = 0xa8fb1981, mtpc_updatesTooLong = 0xe317af7e, - mtpc_updateShortMessage = 0xb87da3b1, - mtpc_updateShortChatMessage = 0x20e85ded, + mtpc_updateShortMessage = 0xed5c2127, + mtpc_updateShortChatMessage = 0x52238b3c, mtpc_updateShort = 0x78d4dec1, mtpc_updatesCombined = 0x725b04c3, mtpc_updates = 0x74ae4240, @@ -5461,8 +5461,8 @@ private: explicit MTPupdates(MTPDupdates *_data); friend MTPupdates MTP_updatesTooLong(); - friend MTPupdates MTP_updateShortMessage(MTPint _id, MTPint _from_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date); - friend MTPupdates MTP_updateShortChatMessage(MTPint _id, MTPint _from_id, MTPint _chat_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date); + friend MTPupdates MTP_updateShortMessage(MTPint _flags, MTPint _id, MTPint _user_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _reply_to_msg_id); + friend MTPupdates MTP_updateShortChatMessage(MTPint _flags, MTPint _id, MTPint _from_id, MTPint _chat_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _reply_to_msg_id); friend MTPupdates MTP_updateShort(const MTPUpdate &_update, MTPint _date); friend MTPupdates MTP_updatesCombined(const MTPVector &_updates, const MTPVector &_users, const MTPVector &_chats, MTPint _date, MTPint _seq_start, MTPint _seq); friend MTPupdates MTP_updates(const MTPVector &_updates, const MTPVector &_users, const MTPVector &_chats, MTPint _date, MTPint _seq); @@ -8264,14 +8264,14 @@ public: MTPMessageMedia vmedia; enum { - flag_fwd_date = (1 << 2), - flag_reply_to_msg_id = (1 << 3), flag_fwd_from_id = (1 << 2), + flag_reply_to_msg_id = (1 << 3), + flag_fwd_date = (1 << 2), }; - bool has_fwd_date() const { return vflags.v & flag_fwd_date; } - bool has_reply_to_msg_id() const { return vflags.v & flag_reply_to_msg_id; } bool has_fwd_from_id() const { return vflags.v & flag_fwd_from_id; } + bool has_reply_to_msg_id() const { return vflags.v & flag_reply_to_msg_id; } + bool has_fwd_date() const { return vflags.v & flag_fwd_date; } }; class MTPDmessageService : public mtpDataImpl { @@ -9373,24 +9373,39 @@ class MTPDupdateShortMessage : public mtpDataImpl { public: MTPDupdateShortMessage() { } - MTPDupdateShortMessage(MTPint _id, MTPint _from_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date) : vid(_id), vfrom_id(_from_id), vmessage(_message), vpts(_pts), vpts_count(_pts_count), vdate(_date) { + MTPDupdateShortMessage(MTPint _flags, MTPint _id, MTPint _user_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _reply_to_msg_id) : vflags(_flags), vid(_id), vuser_id(_user_id), vmessage(_message), vpts(_pts), vpts_count(_pts_count), vdate(_date), vfwd_from_id(_fwd_from_id), vfwd_date(_fwd_date), vreply_to_msg_id(_reply_to_msg_id) { } + MTPint vflags; MTPint vid; - MTPint vfrom_id; + MTPint vuser_id; MTPstring vmessage; MTPint vpts; MTPint vpts_count; MTPint vdate; + MTPint vfwd_from_id; + MTPint vfwd_date; + MTPint vreply_to_msg_id; + + enum { + flag_fwd_from_id = (1 << 2), + flag_reply_to_msg_id = (1 << 3), + flag_fwd_date = (1 << 2), + }; + + bool has_fwd_from_id() const { return vflags.v & flag_fwd_from_id; } + bool has_reply_to_msg_id() const { return vflags.v & flag_reply_to_msg_id; } + bool has_fwd_date() const { return vflags.v & flag_fwd_date; } }; class MTPDupdateShortChatMessage : public mtpDataImpl { public: MTPDupdateShortChatMessage() { } - MTPDupdateShortChatMessage(MTPint _id, MTPint _from_id, MTPint _chat_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date) : vid(_id), vfrom_id(_from_id), vchat_id(_chat_id), vmessage(_message), vpts(_pts), vpts_count(_pts_count), vdate(_date) { + MTPDupdateShortChatMessage(MTPint _flags, MTPint _id, MTPint _from_id, MTPint _chat_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _reply_to_msg_id) : vflags(_flags), vid(_id), vfrom_id(_from_id), vchat_id(_chat_id), vmessage(_message), vpts(_pts), vpts_count(_pts_count), vdate(_date), vfwd_from_id(_fwd_from_id), vfwd_date(_fwd_date), vreply_to_msg_id(_reply_to_msg_id) { } + MTPint vflags; MTPint vid; MTPint vfrom_id; MTPint vchat_id; @@ -9398,6 +9413,19 @@ public: MTPint vpts; MTPint vpts_count; MTPint vdate; + MTPint vfwd_from_id; + MTPint vfwd_date; + MTPint vreply_to_msg_id; + + enum { + flag_fwd_from_id = (1 << 2), + flag_reply_to_msg_id = (1 << 3), + flag_fwd_date = (1 << 2), + }; + + bool has_fwd_from_id() const { return vflags.v & flag_fwd_from_id; } + bool has_reply_to_msg_id() const { return vflags.v & flag_reply_to_msg_id; } + bool has_fwd_date() const { return vflags.v & flag_fwd_date; } }; class MTPDupdateShort : public mtpDataImpl { @@ -21053,11 +21081,11 @@ inline uint32 MTPupdates::innerLength() const { switch (_type) { case mtpc_updateShortMessage: { const MTPDupdateShortMessage &v(c_updateShortMessage()); - return v.vid.innerLength() + v.vfrom_id.innerLength() + v.vmessage.innerLength() + v.vpts.innerLength() + v.vpts_count.innerLength() + v.vdate.innerLength(); + return v.vflags.innerLength() + v.vid.innerLength() + v.vuser_id.innerLength() + v.vmessage.innerLength() + v.vpts.innerLength() + v.vpts_count.innerLength() + v.vdate.innerLength() + (v.has_fwd_from_id() ? v.vfwd_from_id.innerLength() : 0) + (v.has_fwd_date() ? v.vfwd_date.innerLength() : 0) + (v.has_reply_to_msg_id() ? v.vreply_to_msg_id.innerLength() : 0); } case mtpc_updateShortChatMessage: { const MTPDupdateShortChatMessage &v(c_updateShortChatMessage()); - return v.vid.innerLength() + v.vfrom_id.innerLength() + v.vchat_id.innerLength() + v.vmessage.innerLength() + v.vpts.innerLength() + v.vpts_count.innerLength() + v.vdate.innerLength(); + return v.vflags.innerLength() + v.vid.innerLength() + v.vfrom_id.innerLength() + v.vchat_id.innerLength() + v.vmessage.innerLength() + v.vpts.innerLength() + v.vpts_count.innerLength() + v.vdate.innerLength() + (v.has_fwd_from_id() ? v.vfwd_from_id.innerLength() : 0) + (v.has_fwd_date() ? v.vfwd_date.innerLength() : 0) + (v.has_reply_to_msg_id() ? v.vreply_to_msg_id.innerLength() : 0); } case mtpc_updateShort: { const MTPDupdateShort &v(c_updateShort()); @@ -21085,16 +21113,21 @@ inline void MTPupdates::read(const mtpPrime *&from, const mtpPrime *end, mtpType case mtpc_updateShortMessage: _type = cons; { if (!data) setData(new MTPDupdateShortMessage()); MTPDupdateShortMessage &v(_updateShortMessage()); + v.vflags.read(from, end); v.vid.read(from, end); - v.vfrom_id.read(from, end); + v.vuser_id.read(from, end); v.vmessage.read(from, end); v.vpts.read(from, end); v.vpts_count.read(from, end); v.vdate.read(from, end); + if (v.has_fwd_from_id()) { v.vfwd_from_id.read(from, end); } else { v.vfwd_from_id = MTPint(); } + if (v.has_fwd_date()) { v.vfwd_date.read(from, end); } else { v.vfwd_date = MTPint(); } + if (v.has_reply_to_msg_id()) { v.vreply_to_msg_id.read(from, end); } else { v.vreply_to_msg_id = MTPint(); } } break; case mtpc_updateShortChatMessage: _type = cons; { if (!data) setData(new MTPDupdateShortChatMessage()); MTPDupdateShortChatMessage &v(_updateShortChatMessage()); + v.vflags.read(from, end); v.vid.read(from, end); v.vfrom_id.read(from, end); v.vchat_id.read(from, end); @@ -21102,6 +21135,9 @@ inline void MTPupdates::read(const mtpPrime *&from, const mtpPrime *end, mtpType v.vpts.read(from, end); v.vpts_count.read(from, end); v.vdate.read(from, end); + if (v.has_fwd_from_id()) { v.vfwd_from_id.read(from, end); } else { v.vfwd_from_id = MTPint(); } + if (v.has_fwd_date()) { v.vfwd_date.read(from, end); } else { v.vfwd_date = MTPint(); } + if (v.has_reply_to_msg_id()) { v.vreply_to_msg_id.read(from, end); } else { v.vreply_to_msg_id = MTPint(); } } break; case mtpc_updateShort: _type = cons; { if (!data) setData(new MTPDupdateShort()); @@ -21135,15 +21171,20 @@ inline void MTPupdates::write(mtpBuffer &to) const { switch (_type) { case mtpc_updateShortMessage: { const MTPDupdateShortMessage &v(c_updateShortMessage()); + v.vflags.write(to); v.vid.write(to); - v.vfrom_id.write(to); + v.vuser_id.write(to); v.vmessage.write(to); v.vpts.write(to); v.vpts_count.write(to); v.vdate.write(to); + if (v.has_fwd_from_id()) v.vfwd_from_id.write(to); + if (v.has_fwd_date()) v.vfwd_date.write(to); + if (v.has_reply_to_msg_id()) v.vreply_to_msg_id.write(to); } break; case mtpc_updateShortChatMessage: { const MTPDupdateShortChatMessage &v(c_updateShortChatMessage()); + v.vflags.write(to); v.vid.write(to); v.vfrom_id.write(to); v.vchat_id.write(to); @@ -21151,6 +21192,9 @@ inline void MTPupdates::write(mtpBuffer &to) const { v.vpts.write(to); v.vpts_count.write(to); v.vdate.write(to); + if (v.has_fwd_from_id()) v.vfwd_from_id.write(to); + if (v.has_fwd_date()) v.vfwd_date.write(to); + if (v.has_reply_to_msg_id()) v.vreply_to_msg_id.write(to); } break; case mtpc_updateShort: { const MTPDupdateShort &v(c_updateShort()); @@ -21200,11 +21244,11 @@ inline MTPupdates::MTPupdates(MTPDupdates *_data) : mtpDataOwner(_data), _type(m inline MTPupdates MTP_updatesTooLong() { return MTPupdates(mtpc_updatesTooLong); } -inline MTPupdates MTP_updateShortMessage(MTPint _id, MTPint _from_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date) { - return MTPupdates(new MTPDupdateShortMessage(_id, _from_id, _message, _pts, _pts_count, _date)); +inline MTPupdates MTP_updateShortMessage(MTPint _flags, MTPint _id, MTPint _user_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _reply_to_msg_id) { + return MTPupdates(new MTPDupdateShortMessage(_flags, _id, _user_id, _message, _pts, _pts_count, _date, _fwd_from_id, _fwd_date, _reply_to_msg_id)); } -inline MTPupdates MTP_updateShortChatMessage(MTPint _id, MTPint _from_id, MTPint _chat_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date) { - return MTPupdates(new MTPDupdateShortChatMessage(_id, _from_id, _chat_id, _message, _pts, _pts_count, _date)); +inline MTPupdates MTP_updateShortChatMessage(MTPint _flags, MTPint _id, MTPint _from_id, MTPint _chat_id, const MTPstring &_message, MTPint _pts, MTPint _pts_count, MTPint _date, MTPint _fwd_from_id, MTPint _fwd_date, MTPint _reply_to_msg_id) { + return MTPupdates(new MTPDupdateShortChatMessage(_flags, _id, _from_id, _chat_id, _message, _pts, _pts_count, _date, _fwd_from_id, _fwd_date, _reply_to_msg_id)); } inline MTPupdates MTP_updateShort(const MTPUpdate &_update, MTPint _date) { return MTPupdates(new MTPDupdateShort(_update, _date)); diff --git a/Telegram/SourceFiles/mtproto/scheme.tl b/Telegram/SourceFiles/mtproto/scheme.tl index 29e7bbe374..d05eefcecb 100644 --- a/Telegram/SourceFiles/mtproto/scheme.tl +++ b/Telegram/SourceFiles/mtproto/scheme.tl @@ -351,8 +351,8 @@ updates.difference#f49ca0 new_messages:Vector new_encrypted_messages:Ve updates.differenceSlice#a8fb1981 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector intermediate_state:updates.State = updates.Difference; updatesTooLong#e317af7e = Updates; -updateShortMessage#b87da3b1 id:int from_id:int message:string pts:int pts_count:int date:int = Updates; -updateShortChatMessage#20e85ded id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int = Updates; +updateShortMessage#ed5c2127 flags:# id:int user_id:int message:string pts:int pts_count:int date:int fwd_from_id:flags.2?int fwd_date:flags.2?int reply_to_msg_id:flags.3?int = Updates; +updateShortChatMessage#52238b3c flags:# id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from_id:flags.2?int fwd_date:flags.2?int reply_to_msg_id:flags.3?int = Updates; updateShort#78d4dec1 update:Update date:int = Updates; updatesCombined#725b04c3 updates:Vector users:Vector chats:Vector date:int seq_start:int seq:int = Updates; updates#74ae4240 updates:Vector users:Vector chats:Vector date:int seq:int = Updates; @@ -561,9 +561,9 @@ contactLinkContact#d502c2d0 = ContactLink; ---functions--- -invokeAfterMsg#cb9f372d msg_id:long query:!X = X; +invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; -invokeAfterMsgs#3dc4b4f0 msg_ids:Vector query:!X = X; +invokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector query:!X = X; auth.checkPhone#6fe51dfb phone_number:string = auth.CheckedPhone; auth.sendCode#768d5f4d phone_number:string sms_type:int api_id:int api_hash:string lang_code:string = auth.SentCode; @@ -668,7 +668,7 @@ messages.receivedQueue#55a5bb66 max_qts:int = Vector; upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool; -initConnection#69796de9 api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X; +initConnection#69796de9 {X:Type} api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X; help.getSupport#9cdf08cd = help.Support; @@ -687,7 +687,7 @@ account.deleteAccount#418d4e0b reason:string = Bool; account.getAccountTTL#8fc711d = AccountDaysTTL; account.setAccountTTL#2442485e ttl:AccountDaysTTL = Bool; -invokeWithLayer#da9b0d0d layer:int query:!X = X; +invokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X; contacts.resolveUsername#bf0131c username:string = User; diff --git a/Telegram/SourceFiles/overviewwidget.cpp b/Telegram/SourceFiles/overviewwidget.cpp index db852d5485..e90b3561d3 100644 --- a/Telegram/SourceFiles/overviewwidget.cpp +++ b/Telegram/SourceFiles/overviewwidget.cpp @@ -1876,7 +1876,7 @@ void OverviewWidget::onDeleteSelectedSure() { } if (!ids.isEmpty()) { - MTP::send(MTPmessages_DeleteMessages(MTP_vector(ids))); + App::main()->deleteMessages(ids); } onClearSelected(); @@ -1896,7 +1896,7 @@ void OverviewWidget::onDeleteContextSure() { } if (item->id > 0) { - MTP::send(MTPmessages_DeleteMessages(MTP_vector(1, MTP_int(item->id)))); + App::main()->deleteMessages(QVector(1, MTP_int(item->id))); } item->destroy(); if (App::main() && App::main()->peer() == peer()) { diff --git a/Telegram/SourceFiles/profilewidget.cpp b/Telegram/SourceFiles/profilewidget.cpp index e3d7539614..244e1dd314 100644 --- a/Telegram/SourceFiles/profilewidget.cpp +++ b/Telegram/SourceFiles/profilewidget.cpp @@ -381,11 +381,8 @@ void ProfileInner::reorderParticipants() { bool ProfileInner::event(QEvent *e) { if (e->type() == QEvent::MouseMove) { - QMouseEvent *ev = dynamic_cast(e); - if (ev) { - _lastPos = ev->globalPos(); - updateSelected(); - } + _lastPos = static_cast(e)->globalPos(); + updateSelected(); } return QWidget::event(e); } diff --git a/Telegram/SourceFiles/window.cpp b/Telegram/SourceFiles/window.cpp index 18f9a22652..d6d864f37e 100644 --- a/Telegram/SourceFiles/window.cpp +++ b/Telegram/SourceFiles/window.cpp @@ -484,6 +484,8 @@ void Window::clearPasscode() { _passcode = 0; if (intro) { intro->animShow(bg, true); + } else if (settings) { + settings->animShow(bg, true); } else { main->animShow(bg, true); } @@ -1204,16 +1206,33 @@ void Window::quit() { notifyClearFast(); } -void Window::notifySchedule(History *history, MsgId msgId) { +void Window::notifySchedule(History *history, HistoryItem *item) { if (App::quiting() || !history->currentNotification() || !main) return; + UserData *notifyByFrom = (history->peer->chat && item->notifyByFrom()) ? item->from() : 0; + bool haveSetting = (history->peer->notify != UnknownNotifySettings); if (haveSetting) { if (history->peer->notify != EmptyNotifySettings && history->peer->notify->mute > unixtime()) { - history->clearNotifications(); - return; + if (notifyByFrom) { + haveSetting = (item->from()->notify != UnknownNotifySettings); + if (haveSetting) { + if (notifyByFrom->notify != EmptyNotifySettings && notifyByFrom->notify->mute > unixtime()) { + history->popNotification(item); + return; + } + } else { + App::wnd()->getNotifySetting(MTP_inputNotifyPeer(notifyByFrom->input)); + } + } else { + history->popNotification(item); + return; + } } } else { + if (notifyByFrom && notifyByFrom->notify == UnknownNotifySettings) { + App::wnd()->getNotifySetting(MTP_inputNotifyPeer(notifyByFrom->input), 10); + } App::wnd()->getNotifySetting(MTP_inputNotifyPeer(history->peer->input)); } @@ -1228,19 +1247,19 @@ void Window::notifySchedule(History *history, MsgId msgId) { } uint64 when = getms(true) + delay; - notifyWhenAlerts[history].insert(when, NullType()); + notifyWhenAlerts[history].insert(when, notifyByFrom); if (cDesktopNotify() && !psSkipDesktopNotify()) { NotifyWhenMaps::iterator i = notifyWhenMaps.find(history); if (i == notifyWhenMaps.end()) { i = notifyWhenMaps.insert(history, NotifyWhenMap()); } - if (i.value().constFind(msgId) == i.value().cend()) { - i.value().insert(msgId, when); + if (i.value().constFind(item->id) == i.value().cend()) { + i.value().insert(item->id, when); } NotifyWaiters *addTo = haveSetting ? ¬ifyWaiters : ¬ifySettingWaiters; NotifyWaiters::const_iterator it = addTo->constFind(history); if (it == addTo->cend() || it->when > when) { - addTo->insert(history, NotifyWaiter(msgId, when)); + addTo->insert(history, NotifyWaiter(item->id, when, notifyByFrom)); } } if (haveSetting) { @@ -1300,6 +1319,13 @@ void Window::notifySettingGot() { } else { if (history->peer->notify == EmptyNotifySettings || history->peer->notify->mute <= t) { notifyWaiters.insert(i.key(), i.value()); + } else if (UserData *from = i.value().notifyByFrom) { + if (from->notify == UnknownNotifySettings) { + ++i; + continue; + } else if (from->notify == EmptyNotifySettings || from->notify->mute <= t) { + notifyWaiters.insert(i.key(), i.value()); + } } i = notifySettingWaiters.erase(i); } @@ -1323,11 +1349,14 @@ void Window::notifyShowNext(NotifyWindow *remove) { uint64 ms = getms(true), nextAlert = 0; bool alert = false; + int32 now = unixtime(); for (NotifyWhenAlerts::iterator i = notifyWhenAlerts.begin(); i != notifyWhenAlerts.end();) { while (!i.value().isEmpty() && i.value().begin().key() <= ms) { + NotifySettingsPtr n = i.key()->peer->notify, f = i.value().begin().value() ? i.value().begin().value()->notify : UnknownNotifySettings; i.value().erase(i.value().begin()); - NotifySettingsPtr n = i.key()->peer->notify; - if (n == EmptyNotifySettings || (n != UnknownNotifySettings && n->mute <= unixtime())) { + if (n == EmptyNotifySettings || (n != UnknownNotifySettings && n->mute <= now)) { + alert = true; + } else if (f == EmptyNotifySettings || (f != UnknownNotifySettings && f->mute <= now)) { // notify by from() alert = true; } } diff --git a/Telegram/SourceFiles/window.h b/Telegram/SourceFiles/window.h index df035006c9..72459c8fe0 100644 --- a/Telegram/SourceFiles/window.h +++ b/Telegram/SourceFiles/window.h @@ -211,7 +211,7 @@ public: void quit(); void notifySettingGot(); - void notifySchedule(History *history, MsgId msgId); + void notifySchedule(History *history, HistoryItem *item); void notifyClear(History *history = 0); void notifyClearFast(); void notifyShowNext(NotifyWindow *remove = 0); @@ -315,17 +315,18 @@ private: typedef QMap NotifyWhenMaps; NotifyWhenMaps notifyWhenMaps; struct NotifyWaiter { - NotifyWaiter(MsgId msg, uint64 when) : msg(msg), when(when) { + NotifyWaiter(MsgId msg, uint64 when, UserData *notifyByFrom) : msg(msg), when(when), notifyByFrom(notifyByFrom) { } MsgId msg; uint64 when; + UserData *notifyByFrom; }; typedef QMap NotifyWaiters; NotifyWaiters notifyWaiters; NotifyWaiters notifySettingWaiters; SingleTimer notifyWaitTimer; - typedef QMap NotifyWhenAlert; + typedef QMap NotifyWhenAlert; typedef QMap NotifyWhenAlerts; NotifyWhenAlerts notifyWhenAlerts; diff --git a/Telegram/Telegram.plist b/Telegram/Telegram.plist index 65c68a4004..3e6f3e176b 100644 --- a/Telegram/Telegram.plist +++ b/Telegram/Telegram.plist @@ -11,7 +11,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.7.20 + 0.7.21 CFBundleSignature ???? CFBundleURLTypes diff --git a/Telegram/Telegram.rc b/Telegram/Telegram.rc index 97c6d98a61032505931bd3bf8745d954db9c3b4d..e8c9357a03af923ae5d59ca7a4074b07499a1ac1 100644 GIT binary patch delta 53 zcmZ3Yy+nIM5ig_R)3 diff --git a/Telegram/Telegram.vcxproj b/Telegram/Telegram.vcxproj index 6941e312b3..37449a2857 100644 --- a/Telegram/Telegram.vcxproj +++ b/Telegram/Telegram.vcxproj @@ -162,6 +162,10 @@ true true + + true + true + true true @@ -412,6 +416,10 @@ true true + + true + true + true true @@ -671,6 +679,10 @@ true true + + true + true + true true @@ -906,6 +918,7 @@ true + @@ -1058,6 +1071,20 @@ + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing apiwrap.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/apiwrap.h" -DAL_LIBTYPE_STATIC -DCUSTOM_API_ID -DUNICODE -D_WITH_DEBUG -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\libogg-1.3.2\include" "-I.\..\..\Libraries\opus\include" "-I.\..\..\Libraries\opusfile\include" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.4.0\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.4.0\QtGui" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing apiwrap.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/apiwrap.h" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\libogg-1.3.2\include" "-I.\..\..\Libraries\opus\include" "-I.\..\..\Libraries\opusfile\include" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.4.0\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.4.0\QtGui" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing apiwrap.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" "-fstdafx.h" "-f../../SourceFiles/apiwrap.h" -DAL_LIBTYPE_STATIC -DUNICODE -D_WITH_DEBUG -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\libogg-1.3.2\include" "-I.\..\..\Libraries\opus\include" "-I.\..\..\Libraries\opusfile\include" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.4.0\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.4.0\QtGui" + Moc%27ing aboutbox.h... diff --git a/Telegram/Telegram.vcxproj.filters b/Telegram/Telegram.vcxproj.filters index 9366f57049..1e69ee80f4 100644 --- a/Telegram/Telegram.vcxproj.filters +++ b/Telegram/Telegram.vcxproj.filters @@ -846,6 +846,18 @@ boxes + + Source Files + + + Generated Files\Deploy + + + Generated Files\Debug + + + Generated Files\Release + @@ -1124,6 +1136,9 @@ boxes + + Source Files + diff --git a/Telegram/Telegram.xcodeproj/project.pbxproj b/Telegram/Telegram.xcodeproj/project.pbxproj index 318daf3d3c..4baeb50079 100644 --- a/Telegram/Telegram.xcodeproj/project.pbxproj +++ b/Telegram/Telegram.xcodeproj/project.pbxproj @@ -1657,7 +1657,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.7.20; + CURRENT_PROJECT_VERSION = 0.7.21; DEBUG_INFORMATION_FORMAT = dwarf; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -1675,7 +1675,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 0.7.20; + CURRENT_PROJECT_VERSION = 0.7.21; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_OPTIMIZATION_LEVEL = fast; GCC_PREFIX_HEADER = ./SourceFiles/stdafx.h; @@ -1701,10 +1701,10 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.7.20; + CURRENT_PROJECT_VERSION = 0.7.21; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_COMPATIBILITY_VERSION = 0.7; - DYLIB_CURRENT_VERSION = 0.7.20; + DYLIB_CURRENT_VERSION = 0.7.21; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; @@ -1842,10 +1842,10 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.7.20; + CURRENT_PROJECT_VERSION = 0.7.21; DEBUG_INFORMATION_FORMAT = dwarf; DYLIB_COMPATIBILITY_VERSION = 0.7; - DYLIB_CURRENT_VERSION = 0.7.20; + DYLIB_CURRENT_VERSION = 0.7.21; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; diff --git a/Telegram/Version.sh b/Telegram/Version.sh index 0b49490ad9..8a8386167d 100755 --- a/Telegram/Version.sh +++ b/Telegram/Version.sh @@ -1,2 +1,2 @@ -echo 7020 0.7.20 0 +echo 7021 0.7.21 1 # AppVersion AppVersionStr DevChannel