diff --git a/Telegram/Resources/lang.strings b/Telegram/Resources/lang.strings index cf5e83d43..c360a9267 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 b9b15011a..139d0c245 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 000000000..240d9106d --- /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 000000000..b8e2e69da --- /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 c9cbb8218..1450b2641 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 6bea352cf..cb4d1f1b4 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 caf40a10c..3b4f09360 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 6c67e4062..b2686c0a6 100644 Binary files a/Telegram/SourceFiles/art/sprite.png and b/Telegram/SourceFiles/art/sprite.png differ diff --git a/Telegram/SourceFiles/art/sprite_200x.png b/Telegram/SourceFiles/art/sprite_200x.png index 86ab815e8..ef428efa5 100644 Binary files a/Telegram/SourceFiles/art/sprite_200x.png and b/Telegram/SourceFiles/art/sprite_200x.png differ diff --git a/Telegram/SourceFiles/boxes/photosendbox.cpp b/Telegram/SourceFiles/boxes/photosendbox.cpp index 11bcf1ac9..b56a152e4 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 c94c15e1e..7d6594eea 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 796c644af..39f7ec6f2 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 f79317068..9260427e0 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 e490b2c23..e31ff84bd 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 a7d25975d..04db563b4 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 cbe09a08e..87faaaf40 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 bbe794aaf..eb6edbedd 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 81f7bb8d7..7f3e21376 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 033d238f9..d71c5a03a 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 29e37916d..742eb6e7b 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 6421a57ec..6e5896cf2 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 5b28a4807..a38fd024e 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 951fea0a7..72375ca2c 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 14fa312e1..bb5cb4590 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 9ab1fa8c7..4b651afb1 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 15a66275d..6e4295417 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 d9dc29628..e3d02caed 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 bb0fe21a5..968674f89 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 74c8dab2e..c1a5fcaf3 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 409f0d8c4..3cc90fafa 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 a386d26bc..8f63fc735 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 5630a816e..9d64de4bf 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 6ad14e835..08c5b365c 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 a0eae694f..10461b91d 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 29e7bbe37..d05eefcec 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 db852d548..e90b3561d 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 e3d753961..244e1dd31 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 18f9a2265..d6d864f37 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 df035006c..72459c8fe 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 65c68a400..3e6f3e176 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 97c6d98a6..e8c9357a0 100644 Binary files a/Telegram/Telegram.rc and b/Telegram/Telegram.rc differ diff --git a/Telegram/Telegram.vcxproj b/Telegram/Telegram.vcxproj index 6941e312b..37449a285 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 9366f5704..1e69ee80f 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 318daf3d3..4baeb5007 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 0b49490ad..8a8386167 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