diff --git a/Telegram/SourceFiles/storage/download_manager_mtproto.cpp b/Telegram/SourceFiles/storage/download_manager_mtproto.cpp index 4ba4a9ce92..1af23d665b 100644 --- a/Telegram/SourceFiles/storage/download_manager_mtproto.cpp +++ b/Telegram/SourceFiles/storage/download_manager_mtproto.cpp @@ -171,6 +171,10 @@ void DownloadManagerMtproto::checkSendNext(MTP::DcId dcId, Queue &queue) { } } +void DownloadManagerMtproto::checkSendNextAfterSuccess(MTP::DcId dcId) { + checkSendNext(dcId, _queues[dcId]); +} + bool DownloadManagerMtproto::trySendNextPart(MTP::DcId dcId, Queue &queue) { auto &balanceData = _balanceData[dcId]; const auto &sessions = balanceData.sessions; @@ -227,10 +231,6 @@ void DownloadManagerMtproto::requestSucceeded( crl::time timeAtRequestStart) { using namespace rpl::mappers; - const auto guard = gsl::finally([&] { - checkSendNext(dcId, _queues[dcId]); - }); - const auto i = _balanceData.find(dcId); Assert(i != end(_balanceData)); auto &dc = i->second; @@ -606,24 +606,34 @@ void DownloadMtprotoTask::normalPartLoaded( const auto requestData = finishSentRequest( requestId, FinishRequestReason::Success); + const auto owner = _owner; + const auto dcId = this->dcId(); result.match([&](const MTPDupload_fileCdnRedirect &data) { switchToCDN(requestData, data); }, [&](const MTPDupload_file &data) { partLoaded(requestData.offset, data.vbytes().v); }); + + // 'this' may be deleted at this point. + owner->checkSendNextAfterSuccess(dcId); } void DownloadMtprotoTask::webPartLoaded( const MTPupload_WebFile &result, mtpRequestId requestId) { + const auto requestData = finishSentRequest( + requestId, + FinishRequestReason::Success); + const auto owner = _owner; + const auto dcId = this->dcId(); result.match([&](const MTPDupload_webFile &data) { - const auto requestData = finishSentRequest( - requestId, - FinishRequestReason::Success); if (setWebFileSizeHook(data.vsize().v)) { partLoaded(requestData.offset, data.vbytes().v); } }); + + // 'this' may be deleted at this point. + owner->checkSendNextAfterSuccess(dcId); } void DownloadMtprotoTask::cdnPartLoaded(const MTPupload_CdnFile &result, mtpRequestId requestId) { @@ -647,6 +657,13 @@ void DownloadMtprotoTask::cdnPartLoaded(const MTPupload_CdnFile &result, mtpRequ const auto requestData = finishSentRequest( requestId, FinishRequestReason::Success); + const auto owner = _owner; + const auto dcId = this->dcId(); + const auto guard = gsl::finally([=] { + // 'this' may be deleted at this point. + owner->checkSendNextAfterSuccess(dcId); + }); + auto key = bytes::make_span(_cdnEncryptionKey); auto iv = bytes::make_span(_cdnEncryptionIV); Expects(key.size() == MTP::CTRState::KeySize); diff --git a/Telegram/SourceFiles/storage/download_manager_mtproto.h b/Telegram/SourceFiles/storage/download_manager_mtproto.h index 46d91f3e05..9c467c16f0 100644 --- a/Telegram/SourceFiles/storage/download_manager_mtproto.h +++ b/Telegram/SourceFiles/storage/download_manager_mtproto.h @@ -51,6 +51,7 @@ public: int index, int amountAtRequestStart, crl::time timeAtRequestStart); + void checkSendNextAfterSuccess(MTP::DcId dcId); [[nodiscard]] int chooseSessionIndex(MTP::DcId dcId) const; private: