diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 2c4979df2..19284967c 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -1063,9 +1063,7 @@ void Session::setupUserIsContactViewer() { }, _lifetime); } -Session::~Session() { - clearLocalStorage(); -} +Session::~Session() = default; template void Session::enumerateItemViews( @@ -3786,8 +3784,6 @@ int32 Session::wallpapersHash() const { } void Session::clearLocalStorage() { - clear(); - _cache->close(); _cache->clear(); _bigFileCache->close(); diff --git a/Telegram/SourceFiles/main/main_account.cpp b/Telegram/SourceFiles/main/main_account.cpp index a4c51694e..f165ffaab 100644 --- a/Telegram/SourceFiles/main/main_account.cpp +++ b/Telegram/SourceFiles/main/main_account.cpp @@ -57,7 +57,7 @@ Account::~Account() { if (const auto session = maybeSession()) { session->saveSettingsNowIfNeeded(); } - destroySession(); + destroySession(DestroyReason::Quitting); } Storage::Domain &Account::domainLocal() const { @@ -188,7 +188,7 @@ void Account::createSession( Ensures(_session != nullptr); } -void Account::destroySession() { +void Account::destroySession(DestroyReason reason) { _storedSessionSettings.reset(); _sessionUserId = 0; _sessionUserSerialized = {}; @@ -197,6 +197,10 @@ void Account::destroySession() { } _sessionValue = nullptr; + + if (reason == DestroyReason::LoggedOut) { + _session->finishLogout(); + } _session = nullptr; } @@ -507,7 +511,7 @@ void Account::forcedLogOut() { void Account::loggedOut() { _loggingOut = false; Media::Player::mixer()->stopAndClear(); - destroySession(); + destroySession(DestroyReason::LoggedOut); local().reset(); cSetOtherOnline(0); } diff --git a/Telegram/SourceFiles/main/main_account.h b/Telegram/SourceFiles/main/main_account.h index b26699fb5..d0e126675 100644 --- a/Telegram/SourceFiles/main/main_account.h +++ b/Telegram/SourceFiles/main/main_account.h @@ -55,7 +55,6 @@ public: QByteArray serialized, int streamVersion, std::unique_ptr settings); - void destroySession(); void logOut(); void forcedLogOut(); @@ -107,6 +106,10 @@ public: private: static constexpr auto kDefaultSaveDelay = crl::time(1000); + enum class DestroyReason { + Quitting, + LoggedOut, + }; void startMtp(std::unique_ptr config); void createSession( @@ -123,6 +126,7 @@ private: void resetAuthorizationKeys(); void loggedOut(); + void destroySession(DestroyReason reason); const not_null _domain; const std::unique_ptr _local; diff --git a/Telegram/SourceFiles/main/main_session.cpp b/Telegram/SourceFiles/main/main_session.cpp index 21aa198fe..c080a6658 100644 --- a/Telegram/SourceFiles/main/main_session.cpp +++ b/Telegram/SourceFiles/main/main_session.cpp @@ -151,6 +151,13 @@ Session::Session( _api->requestNotifySettings(MTP_inputNotifyBroadcasts()); } +// Can be called only right before ~Session. +void Session::finishLogout() { + unlockTerms(); + data().clear(); + data().clearLocalStorage(); +} + Session::~Session() { unlockTerms(); data().clear(); diff --git a/Telegram/SourceFiles/main/main_session.h b/Telegram/SourceFiles/main/main_session.h index 7425e028f..428f31468 100644 --- a/Telegram/SourceFiles/main/main_session.h +++ b/Telegram/SourceFiles/main/main_session.h @@ -140,6 +140,9 @@ public: [[nodiscard]] QString createInternalLink(const QString &query) const; [[nodiscard]] QString createInternalLinkFull(const QString &query) const; + // Can be called only right before ~Session. + void finishLogout(); + [[nodiscard]] rpl::lifetime &lifetime() { return _lifetime; }