From b678913da539ca7ea3759d1991620e8c65a62ee1 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sun, 28 Feb 2016 15:36:23 +0300 Subject: [PATCH] improved rpcClear() when deleting a complex RPCSender, clearing recent inline bots on logout --- Telegram/SourceFiles/app.cpp | 1 + Telegram/SourceFiles/dialogswidget.h | 5 +++++ Telegram/SourceFiles/historywidget.h | 4 ++-- Telegram/SourceFiles/intro/intro.cpp | 10 +++++----- Telegram/SourceFiles/intro/intro.h | 4 ++-- Telegram/SourceFiles/intro/intropwdcheck.h | 2 +- Telegram/SourceFiles/intro/introsteps.h | 1 - Telegram/SourceFiles/mainwidget.cpp | 12 ++++++------ Telegram/SourceFiles/mainwidget.h | 13 +++++++++++-- Telegram/SourceFiles/mtproto/mtp.cpp | 2 +- Telegram/SourceFiles/mtproto/mtpFileLoader.h | 2 +- Telegram/SourceFiles/mtproto/mtpRPC.h | 14 ++++++++++---- Telegram/SourceFiles/overviewwidget.h | 16 ++++++++++------ Telegram/SourceFiles/profilewidget.h | 12 ++++++++---- Telegram/SourceFiles/settingswidget.cpp | 4 ++-- Telegram/SourceFiles/settingswidget.h | 2 +- Telegram/SourceFiles/structs.cpp | 6 +++--- Telegram/SourceFiles/window.cpp | 10 +++++----- 18 files changed, 74 insertions(+), 46 deletions(-) diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index dc77d01e83..e88ba331c4 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -1843,6 +1843,7 @@ namespace App { updatedPeers.clear(); cSetSavedPeers(SavedPeers()); cSetSavedPeersByTime(SavedPeersByTime()); + cSetRecentInlineBots(RecentInlineBots()); for (PeersData::const_iterator i = peersData.cbegin(), e = peersData.cend(); i != e; ++i) { delete *i; } diff --git a/Telegram/SourceFiles/dialogswidget.h b/Telegram/SourceFiles/dialogswidget.h index dfa643f5bd..6443a08d60 100644 --- a/Telegram/SourceFiles/dialogswidget.h +++ b/Telegram/SourceFiles/dialogswidget.h @@ -259,6 +259,11 @@ public: void updateNotifySettings(PeerData *peer); + void rpcClear() override { + _inner.rpcClear(); + RPCSender::rpcClear(); + } + void notify_userIsContactChanged(UserData *user, bool fromThisApp); signals: diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index 2a4b49fe95..786de93530 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -569,12 +569,12 @@ public: bool contentOverlapped(const QRect &globalRect); - void grabStart() { + void grabStart() override { _sideShadow.hide(); _inGrab = true; resizeEvent(0); } - void grabFinish() { + void grabFinish() override { _sideShadow.setVisible(!Adaptive::OneColumn()); _inGrab = false; resizeEvent(0); diff --git a/Telegram/SourceFiles/intro/intro.cpp b/Telegram/SourceFiles/intro/intro.cpp index c62b8d55cb..ec2c1bafde 100644 --- a/Telegram/SourceFiles/intro/intro.cpp +++ b/Telegram/SourceFiles/intro/intro.cpp @@ -428,11 +428,11 @@ void IntroWidget::keyPressEvent(QKeyEvent *e) { void IntroWidget::updateAdaptiveLayout() { } -void IntroWidget::rpcInvalidate() { - if (phone) phone->rpcInvalidate(); - if (code) code->rpcInvalidate(); - if (signup) signup->rpcInvalidate(); - if (pwdcheck) pwdcheck->rpcInvalidate(); +void IntroWidget::rpcClear() { + if (phone) phone->rpcClear(); + if (code) code->rpcClear(); + if (signup) signup->rpcClear(); + if (pwdcheck) pwdcheck->rpcClear(); } IntroWidget::~IntroWidget() { diff --git a/Telegram/SourceFiles/intro/intro.h b/Telegram/SourceFiles/intro/intro.h index 7ce176f0ca..bec0f7eb08 100644 --- a/Telegram/SourceFiles/intro/intro.h +++ b/Telegram/SourceFiles/intro/intro.h @@ -29,7 +29,7 @@ class IntroPwdCheck; class IntroStage; class Text; -class IntroWidget : public TWidget { +class IntroWidget final : public TWidget { Q_OBJECT public: @@ -71,7 +71,7 @@ public: void finish(const MTPUser &user, const QImage &photo = QImage()); - void rpcInvalidate(); + void rpcClear(); void langChangeTo(int32 langId); ~IntroWidget(); diff --git a/Telegram/SourceFiles/intro/intropwdcheck.h b/Telegram/SourceFiles/intro/intropwdcheck.h index 5f29c9b3c5..9a0d1c1f69 100644 --- a/Telegram/SourceFiles/intro/intropwdcheck.h +++ b/Telegram/SourceFiles/intro/intropwdcheck.h @@ -25,7 +25,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "gui/flatinput.h" #include "intro.h" -class IntroPwdCheck : public IntroStage, public RPCSender { +class IntroPwdCheck final : public IntroStage, public RPCSender { Q_OBJECT public: diff --git a/Telegram/SourceFiles/intro/introsteps.h b/Telegram/SourceFiles/intro/introsteps.h index 4522f46622..e554f11fb9 100644 --- a/Telegram/SourceFiles/intro/introsteps.h +++ b/Telegram/SourceFiles/intro/introsteps.h @@ -20,7 +20,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ #pragma once -#include #include "gui/flatbutton.h" #include "intro.h" diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 735892f4d2..1cd34b51df 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -2240,14 +2240,14 @@ void MainWidget::ui_showPeerHistory(quint64 peerId, qint32 showAtMsgId, bool bac profile->hide(); profile->clear(); profile->deleteLater(); - profile->rpcInvalidate(); + profile->rpcClear(); profile = 0; } if (overview) { overview->hide(); overview->clear(); overview->deleteLater(); - overview->rpcInvalidate(); + overview->rpcClear(); overview = 0; } clearBotStartToken(_peerInStack); @@ -2390,13 +2390,13 @@ void MainWidget::showMediaOverview(PeerData *peer, MediaOverviewType type, bool overview->hide(); overview->clear(); overview->deleteLater(); - overview->rpcInvalidate(); + overview->rpcClear(); } if (profile) { profile->hide(); profile->clear(); profile->deleteLater(); - profile->rpcInvalidate(); + profile->rpcClear(); profile = 0; } overview = new OverviewWidget(this, peer, type); @@ -2446,14 +2446,14 @@ void MainWidget::showPeerProfile(PeerData *peer, bool back, int32 lastScrollTop) overview->hide(); overview->clear(); overview->deleteLater(); - overview->rpcInvalidate(); + overview->rpcClear(); overview = 0; } if (profile) { profile->hide(); profile->clear(); profile->deleteLater(); - profile->rpcInvalidate(); + profile->rpcClear(); } profile = new ProfileWidget(this, peer); _topBar.show(); diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index 7f417acbc0..660793df49 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -59,10 +59,10 @@ public: FlatButton *mediaTypeButton(); - void grabStart() { + void grabStart() override { _sideShadow.hide(); } - void grabFinish() { + void grabFinish() override { _sideShadow.setVisible(!Adaptive::OneColumn()); } @@ -417,6 +417,15 @@ public: QPixmap grabTopBar(); QPixmap grabInner(); + void rpcClear() override { + history.rpcClear(); + dialogs.rpcClear(); + if (profile) profile->rpcClear(); + if (overview) overview->rpcClear(); + if (_api) _api->rpcClear(); + RPCSender::rpcClear(); + } + bool isItemVisible(HistoryItem *item); void ui_repaintHistoryItem(const HistoryItem *item); diff --git a/Telegram/SourceFiles/mtproto/mtp.cpp b/Telegram/SourceFiles/mtproto/mtp.cpp index 7b834ce511..781e6f2ff4 100644 --- a/Telegram/SourceFiles/mtproto/mtp.cpp +++ b/Telegram/SourceFiles/mtproto/mtp.cpp @@ -154,7 +154,7 @@ namespace { bool onErrorDefault(mtpRequestId requestId, const RPCError &error) { const QString &err(error.type()); int32 code = error.code(); - if (!mtpIsFlood(error)) { + if (!mtpIsFlood(error) && err != qsl("AUTH_KEY_UNREGISTERED")) { int breakpoint = 0; } bool badGuestDC = (code == 400) && (err == qsl("FILE_ID_INVALID")); diff --git a/Telegram/SourceFiles/mtproto/mtpFileLoader.h b/Telegram/SourceFiles/mtproto/mtpFileLoader.h index 9446c979b5..f64ac4d456 100644 --- a/Telegram/SourceFiles/mtproto/mtpFileLoader.h +++ b/Telegram/SourceFiles/mtproto/mtpFileLoader.h @@ -236,7 +236,7 @@ public: } virtual void stop() { - rpcInvalidate(); + rpcClear(); } ~mtpFileLoader(); diff --git a/Telegram/SourceFiles/mtproto/mtpRPC.h b/Telegram/SourceFiles/mtproto/mtpRPC.h index c12f4c3f59..09b13781ad 100644 --- a/Telegram/SourceFiles/mtproto/mtpRPC.h +++ b/Telegram/SourceFiles/mtproto/mtpRPC.h @@ -791,6 +791,16 @@ public: return RPCFailHandlerPtr(new RPCBindedFailHandlerOwnedNo(b, static_cast(this), onFail)); } + virtual void rpcClear() { + rpcInvalidate(); + } + + virtual ~RPCSender() { + rpcInvalidate(); + } + +protected: + void rpcInvalidate() { for (DoneHandlers::iterator i = _rpcDoneHandlers.begin(), e = _rpcDoneHandlers.end(); i != e; ++i) { (*i)->invalidate(); @@ -802,10 +812,6 @@ public: _rpcFailHandlers.clear(); } - ~RPCSender() { - rpcInvalidate(); - } - }; typedef void (*MTPStateChangedHandler)(int32 dcId, int32 state); diff --git a/Telegram/SourceFiles/overviewwidget.h b/Telegram/SourceFiles/overviewwidget.h index f06da8a254..968ccd773b 100644 --- a/Telegram/SourceFiles/overviewwidget.h +++ b/Telegram/SourceFiles/overviewwidget.h @@ -71,7 +71,7 @@ public: void changingMsgId(HistoryItem *row, MsgId newId); void repaintItem(const HistoryItem *msg); void itemRemoved(HistoryItem *item); - + void getSelectionState(int32 &selectedForForward, int32 &selectedForDelete) const; void clearSelectedItems(bool onlyTextSelection = false); void fillSelectedItems(SelectedItemSet &sel, bool forDelete = true); @@ -146,7 +146,7 @@ private: bool _reversed; History *_migrated, *_history; ChannelId _channel; - + bool _selMode; uint32 itemSelectedValue(int32 index) const; @@ -275,30 +275,34 @@ public: void mediaOverviewUpdated(PeerData *peer, MediaOverviewType type); void changingMsgId(HistoryItem *row, MsgId newId); void itemRemoved(HistoryItem *item); - + QPoint clampMousePosition(QPoint point); void checkSelectingScroll(QPoint point); void noSelectingScroll(); bool touchScroll(const QPoint &delta); - + void fillSelectedItems(SelectedItemSet &sel, bool forDelete); void updateScrollColors(); void updateAfterDrag(); - void grabStart() { + void grabStart() override { _sideShadow.hide(); _inGrab = true; resizeEvent(0); } - void grabFinish() { + void grabFinish() override { _sideShadow.setVisible(!Adaptive::OneColumn()); _inGrab = false; resizeEvent(0); } + void rpcClear() override { + _inner.rpcClear(); + RPCSender::rpcClear(); + } void ui_repaintHistoryItem(const HistoryItem *item); diff --git a/Telegram/SourceFiles/profilewidget.h b/Telegram/SourceFiles/profilewidget.h index 73fcf2f241..89da54afb0 100644 --- a/Telegram/SourceFiles/profilewidget.h +++ b/Telegram/SourceFiles/profilewidget.h @@ -48,7 +48,7 @@ public: PeerData *peer() const; bool allMediaShown() const; - + void updateOnlineDisplay(); void updateOnlineDisplayTimer(); void reorderParticipants(); @@ -65,7 +65,7 @@ public: void allowDecreaseHeight(int32 decreaseBy); ~ProfileInner(); - + public slots: void peerUpdated(PeerData *data); @@ -247,16 +247,20 @@ public: void mediaOverviewUpdated(PeerData *peer, MediaOverviewType type); void updateAdaptiveLayout(); - void grabStart() { + void grabStart() override { _sideShadow.hide(); _inGrab = true; resizeEvent(0); } - void grabFinish() { + void grabFinish() override { _sideShadow.setVisible(!Adaptive::OneColumn()); _inGrab = false; resizeEvent(0); } + void rpcClear() override { + _inner.rpcClear(); + RPCSender::rpcClear(); + } void clear(); ~ProfileWidget(); diff --git a/Telegram/SourceFiles/settingswidget.cpp b/Telegram/SourceFiles/settingswidget.cpp index 89e0925c5e..a6c0b8d887 100644 --- a/Telegram/SourceFiles/settingswidget.cpp +++ b/Telegram/SourceFiles/settingswidget.cpp @@ -1945,8 +1945,8 @@ void SettingsWidget::updateConnectionType() { _inner.updateConnectionType(); } -void SettingsWidget::rpcInvalidate() { - _inner.rpcInvalidate(); +void SettingsWidget::rpcClear() { + _inner.rpcClear(); } void SettingsWidget::usernameChanged() { diff --git a/Telegram/SourceFiles/settingswidget.h b/Telegram/SourceFiles/settingswidget.h index 65e222fcb3..d2ed56902d 100644 --- a/Telegram/SourceFiles/settingswidget.h +++ b/Telegram/SourceFiles/settingswidget.h @@ -330,7 +330,7 @@ public: void updateDisplayNotify(); - void rpcInvalidate(); + void rpcClear(); void usernameChanged(); void setInnerFocus(); diff --git a/Telegram/SourceFiles/structs.cpp b/Telegram/SourceFiles/structs.cpp index 0ce99caad2..3664b9bf05 100644 --- a/Telegram/SourceFiles/structs.cpp +++ b/Telegram/SourceFiles/structs.cpp @@ -1203,7 +1203,7 @@ bool DocumentData::loaded(bool check) const { if (loading() && _loader->done()) { if (_loader->fileType() == mtpc_storage_fileUnknown) { _loader->deleteLater(); - _loader->rpcInvalidate(); + _loader->rpcClear(); _loader = CancelledMtpFileLoader; } else { DocumentData *that = const_cast(this); @@ -1214,7 +1214,7 @@ bool DocumentData::loaded(bool check) const { } _loader->deleteLater(); - _loader->rpcInvalidate(); + _loader->rpcClear(); _loader = 0; } notifyLayoutChanged(); @@ -1296,7 +1296,7 @@ void DocumentData::cancel() { if (l) { l->cancel(); l->deleteLater(); - l->rpcInvalidate(); + l->rpcClear(); notifyLayoutChanged(); } diff --git a/Telegram/SourceFiles/window.cpp b/Telegram/SourceFiles/window.cpp index 96a9b0a4a0..c3ecdbd686 100644 --- a/Telegram/SourceFiles/window.cpp +++ b/Telegram/SourceFiles/window.cpp @@ -504,21 +504,21 @@ void Window::clearWidgets() { settings->stop_show(); settings->hide(); settings->deleteLater(); - settings->rpcInvalidate(); + settings->rpcClear(); settings = 0; } if (main) { main->animStop_show(); main->hide(); main->deleteLater(); - main->rpcInvalidate(); + main->rpcClear(); main = 0; } if (intro) { intro->stop_show(); intro->hide(); intro->deleteLater(); - intro->rpcInvalidate(); + intro->rpcClear(); intro = 0; } title->updateBackButton(); @@ -724,7 +724,7 @@ void Window::hideSettings(bool fast) { settings->stop_show(); settings->hide(); settings->deleteLater(); - settings->rpcInvalidate(); + settings->rpcClear(); settings = 0; if (intro) { intro->show(); @@ -737,7 +737,7 @@ void Window::hideSettings(bool fast) { settings->stop_show(); settings->hide(); settings->deleteLater(); - settings->rpcInvalidate(); + settings->rpcClear(); settings = 0; if (intro) { intro->animShow(bg, true);