improved rpcClear() when deleting a complex RPCSender, clearing recent inline bots on logout

This commit is contained in:
John Preston 2016-02-28 15:36:23 +03:00
parent 798f800913
commit b678913da5
18 changed files with 74 additions and 46 deletions

View File

@ -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;
}

View File

@ -259,6 +259,11 @@ public:
void updateNotifySettings(PeerData *peer);
void rpcClear() override {
_inner.rpcClear();
RPCSender::rpcClear();
}
void notify_userIsContactChanged(UserData *user, bool fromThisApp);
signals:

View File

@ -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);

View File

@ -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() {

View File

@ -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();

View File

@ -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:

View File

@ -20,7 +20,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
*/
#pragma once
#include <QtWidgets/QWidget>
#include "gui/flatbutton.h"
#include "intro.h"

View File

@ -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();

View File

@ -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);

View File

@ -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"));

View File

@ -236,7 +236,7 @@ public:
}
virtual void stop() {
rpcInvalidate();
rpcClear();
}
~mtpFileLoader();

View File

@ -791,6 +791,16 @@ public:
return RPCFailHandlerPtr(new RPCBindedFailHandlerOwnedNo<T, TReceiver>(b, static_cast<TReceiver*>(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);

View File

@ -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);

View File

@ -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();

View File

@ -1945,8 +1945,8 @@ void SettingsWidget::updateConnectionType() {
_inner.updateConnectionType();
}
void SettingsWidget::rpcInvalidate() {
_inner.rpcInvalidate();
void SettingsWidget::rpcClear() {
_inner.rpcClear();
}
void SettingsWidget::usernameChanged() {

View File

@ -330,7 +330,7 @@ public:
void updateDisplayNotify();
void rpcInvalidate();
void rpcClear();
void usernameChanged();
void setInnerFocus();

View File

@ -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<DocumentData*>(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();
}

View File

@ -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);