diff --git a/Telegram/SourceFiles/calls/calls_call.cpp b/Telegram/SourceFiles/calls/calls_call.cpp index 511909785c..2a2c5b8a89 100644 --- a/Telegram/SourceFiles/calls/calls_call.cpp +++ b/Telegram/SourceFiles/calls/calls_call.cpp @@ -410,12 +410,12 @@ bool Call::handleUpdate(const MTPPhoneCall &call) { ? _controller->getDebugInfo() : std::string(); if (!debugLog.empty()) { - MTP::send( - MTPphone_SaveCallDebug( - MTP_inputPhoneCall( - MTP_long(_id), - MTP_long(_accessHash)), - MTP_dataJSON(MTP_string(debugLog)))); + user()->session().api().request(MTPphone_SaveCallDebug( + MTP_inputPhoneCall( + MTP_long(_id), + MTP_long(_accessHash)), + MTP_dataJSON(MTP_string(debugLog)) + )).send(); } } if (data.is_need_rating() && _id && _accessHash) { diff --git a/Telegram/SourceFiles/intro/intro_code.cpp b/Telegram/SourceFiles/intro/intro_code.cpp index ab25717870..0d6f564057 100644 --- a/Telegram/SourceFiles/intro/intro_code.cpp +++ b/Telegram/SourceFiles/intro/intro_code.cpp @@ -15,6 +15,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/labels.h" #include "ui/text/text_utilities.h" #include "boxes/confirm_box.h" +#include "main/main_account.h" +#include "mtproto/mtp_instance.h" #include "app.h" #include "styles/style_intro.h" @@ -201,7 +203,7 @@ void CodeWidget::finished() { Step::finished(); _checkRequestTimer.cancel(); _callTimer.cancel(); - rpcInvalidate(); + apiClear(); cancelled(); _sentCode.clear(); @@ -209,9 +211,12 @@ void CodeWidget::finished() { } void CodeWidget::cancelled() { - MTP::cancel(base::take(_sentRequest)); - MTP::cancel(base::take(_callRequestId)); - MTP::send(MTPauth_CancelCode(MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash))); + api()->request(base::take(_sentRequest)).cancel(); + api()->request(base::take(_callRequestId)).cancel(); + api()->request(MTPauth_CancelCode( + MTP_string(getData()->phone), + MTP_bytes(getData()->phoneHash) + )).send(); } void CodeWidget::stopCheck() { @@ -219,12 +224,12 @@ void CodeWidget::stopCheck() { } void CodeWidget::checkRequest() { - auto status = MTP::state(_sentRequest); + auto status = api()->instance()->state(_sentRequest); if (status < 0) { auto leftms = -status; if (leftms >= 1000) { if (_sentRequest) { - MTP::cancel(base::take(_sentRequest)); + api()->request(base::take(_sentRequest)).cancel(); _sentCode.clear(); } } @@ -259,14 +264,13 @@ void CodeWidget::codeSubmitDone(const MTPauth_Authorization &result) { }); } -bool CodeWidget::codeSubmitFail(const RPCError &error) { +void CodeWidget::codeSubmitFail(const RPCError &error) { if (MTP::isFloodError(error)) { stopCheck(); _sentRequest = 0; showCodeError(tr::lng_flood_error()); - return true; + return; } - if (MTP::isDefaultHandledError(error)) return false; stopCheck(); _sentRequest = 0; @@ -275,24 +279,21 @@ bool CodeWidget::codeSubmitFail(const RPCError &error) { || err == qstr("PHONE_CODE_EXPIRED") || err == qstr("PHONE_NUMBER_BANNED")) { // show error goBack(); - return true; } else if (err == qstr("PHONE_CODE_EMPTY") || err == qstr("PHONE_CODE_INVALID")) { showCodeError(tr::lng_bad_code()); - return true; } else if (err == qstr("SESSION_PASSWORD_NEEDED")) { _checkRequestTimer.callEach(1000); - _sentRequest = MTP::send( - MTPaccount_GetPassword(), - rpcDone(&CodeWidget::gotPassword), - rpcFail(&CodeWidget::codeSubmitFail)); - return true; - } - if (Logs::DebugEnabled()) { // internal server error + _sentRequest = api()->request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + gotPassword(result); + }).fail([=](const RPCError &error) { + codeSubmitFail(error); + }).handleFloodErrors().send(); + } else if (Logs::DebugEnabled()) { // internal server error showCodeError(rpl::single(err + ": " + error.description())); } else { showCodeError(rpl::single(Lang::Hard::ServerError())); } - return false; } void CodeWidget::codeChanged() { @@ -305,11 +306,12 @@ void CodeWidget::sendCall() { if (--_callTimeout <= 0) { _callStatus = CallStatus::Calling; _callTimer.cancel(); - _callRequestId = MTP::send( - MTPauth_ResendCode( - MTP_string(getData()->phone), - MTP_bytes(getData()->phoneHash)), - rpcDone(&CodeWidget::callDone)); + _callRequestId = api()->request(MTPauth_ResendCode( + MTP_string(getData()->phone), + MTP_bytes(getData()->phoneHash) + )).done([=](const MTPauth_SentCode &result) { + callDone(result); + }).send(); } else { getData()->callStatus = _callStatus; getData()->callTimeout = _callTimeout; @@ -382,25 +384,29 @@ void CodeWidget::submit() { getData()->hasRecovery = false; getData()->pwdHint = QString(); getData()->pwdNotEmptyPassport = false; - _sentRequest = MTP::send( - MTPauth_SignIn( - MTP_string(getData()->phone), - MTP_bytes(getData()->phoneHash), - MTP_string(_sentCode)), - rpcDone(&CodeWidget::codeSubmitDone), - rpcFail(&CodeWidget::codeSubmitFail)); + _sentRequest = api()->request(MTPauth_SignIn( + MTP_string(getData()->phone), + MTP_bytes(getData()->phoneHash), + MTP_string(_sentCode) + )).done([=](const MTPauth_Authorization &result) { + codeSubmitDone(result); + }).fail([=](const RPCError &error) { + codeSubmitFail(error); + }).handleFloodErrors().send(); } void CodeWidget::noTelegramCode() { if (_noTelegramCodeRequestId) { return; } - _noTelegramCodeRequestId = MTP::send( - MTPauth_ResendCode( - MTP_string(getData()->phone), - MTP_bytes(getData()->phoneHash)), - rpcDone(&CodeWidget::noTelegramCodeDone), - rpcFail(&CodeWidget::noTelegramCodeFail)); + _noTelegramCodeRequestId = api()->request(MTPauth_ResendCode( + MTP_string(getData()->phone), + MTP_bytes(getData()->phoneHash) + )).done([=](const MTPauth_SentCode &result) { + noTelegramCodeDone(result); + }).fail([=](const RPCError &error) { + noTelegramCodeFail(error); + }).handleFloodErrors().send(); } void CodeWidget::noTelegramCodeDone(const MTPauth_SentCode &result) { @@ -426,14 +432,11 @@ void CodeWidget::noTelegramCodeDone(const MTPauth_SentCode &result) { updateDescText(); } -bool CodeWidget::noTelegramCodeFail(const RPCError &error) { +void CodeWidget::noTelegramCodeFail(const RPCError &error) { if (MTP::isFloodError(error)) { _noTelegramCodeRequestId = 0; showCodeError(tr::lng_flood_error()); - return true; - } - if (MTP::isDefaultHandledError(error)) { - return false; + return; } _noTelegramCodeRequestId = 0; @@ -442,7 +445,6 @@ bool CodeWidget::noTelegramCodeFail(const RPCError &error) { } else { showCodeError(rpl::single(Lang::Hard::ServerError())); } - return false; } } // namespace details diff --git a/Telegram/SourceFiles/intro/intro_code.h b/Telegram/SourceFiles/intro/intro_code.h index 719d8e091d..e98285a0b6 100644 --- a/Telegram/SourceFiles/intro/intro_code.h +++ b/Telegram/SourceFiles/intro/intro_code.h @@ -74,14 +74,14 @@ private: void updateControlsGeometry(); void codeSubmitDone(const MTPauth_Authorization &result); - bool codeSubmitFail(const RPCError &error); + void codeSubmitFail(const RPCError &error); void showCodeError(rpl::producer text); void callDone(const MTPauth_SentCode &v); void gotPassword(const MTPaccount_Password &result); void noTelegramCodeDone(const MTPauth_SentCode &result); - bool noTelegramCodeFail(const RPCError &result); + void noTelegramCodeFail(const RPCError &result); void stopCheck(); diff --git a/Telegram/SourceFiles/intro/intro_password_check.cpp b/Telegram/SourceFiles/intro/intro_password_check.cpp index eef08e6165..76ac7b6216 100644 --- a/Telegram/SourceFiles/intro/intro_password_check.cpp +++ b/Telegram/SourceFiles/intro/intro_password_check.cpp @@ -29,7 +29,6 @@ PasswordCheckWidget::PasswordCheckWidget( not_null account, not_null data) : Step(parent, account, data) -, _api(account->mtp()) , _request(getData()->pwdRequest) , _hasRecovery(getData()->hasRecovery) , _notEmptyPassport(getData()->pwdNotEmptyPassport) @@ -115,7 +114,7 @@ void PasswordCheckWidget::activate() { } void PasswordCheckWidget::cancelled() { - _api.request(base::take(_sentRequest)).cancel(); + api()->request(base::take(_sentRequest)).cancel(); } void PasswordCheckWidget::pwdSubmitDone(bool recover, const MTPauth_Authorization &result) { @@ -182,8 +181,8 @@ void PasswordCheckWidget::checkPasswordHash() { } void PasswordCheckWidget::requestPasswordData() { - _api.request(base::take(_sentRequest)).cancel(); - _sentRequest = _api.request( + api()->request(base::take(_sentRequest)).cancel(); + _sentRequest = api()->request( MTPaccount_GetPassword() ).done([=](const MTPaccount_Password &result) { _sentRequest = 0; @@ -205,13 +204,13 @@ void PasswordCheckWidget::passwordChecked() { return serverError(); } _request.id = 0; - _sentRequest = _api.request( + _sentRequest = api()->request( MTPauth_CheckPassword(check.result) ).done([=](const MTPauth_Authorization &result) { pwdSubmitDone(false, result); - }).handleFloodErrors().fail([=](const RPCError &error) { + }).fail([=](const RPCError &error) { pwdSubmitFail(error); - }).send(); + }).handleFloodErrors().send(); } void PasswordCheckWidget::serverError() { @@ -267,7 +266,7 @@ void PasswordCheckWidget::recoverStartFail(const RPCError &error) { void PasswordCheckWidget::toRecover() { if (_hasRecovery) { if (_sentRequest) { - _api.request(base::take(_sentRequest)).cancel(); + api()->request(base::take(_sentRequest)).cancel(); } hideError(); _toRecover->hide(); @@ -279,7 +278,7 @@ void PasswordCheckWidget::toRecover() { _codeField->setFocus(); updateDescriptionText(); if (_emailPattern.isEmpty()) { - _api.request( + api()->request( MTPauth_RequestPasswordRecovery() ).done([=](const MTPauth_PasswordRecovery &result) { recoverStarted(result); @@ -302,7 +301,7 @@ void PasswordCheckWidget::toPassword() { void PasswordCheckWidget::showReset() { if (_sentRequest) { - _api.request(base::take(_sentRequest)).cancel(); + api()->request(base::take(_sentRequest)).cancel(); } _toRecover->show(); _toPassword->hide(); @@ -335,13 +334,13 @@ void PasswordCheckWidget::submit() { return; } const auto send = crl::guard(this, [=] { - _sentRequest = _api.request( + _sentRequest = api()->request( MTPauth_RecoverPassword(MTP_string(code)) ).done([=](const MTPauth_Authorization &result) { pwdSubmitDone(true, result); - }).handleFloodErrors().fail([=](const RPCError &error) { + }).fail([=](const RPCError &error) { codeSubmitFail(error); - }).send(); + }).handleFloodErrors().send(); }); if (_notEmptyPassport) { diff --git a/Telegram/SourceFiles/intro/intro_password_check.h b/Telegram/SourceFiles/intro/intro_password_check.h index fb16aae74c..e237ab601b 100644 --- a/Telegram/SourceFiles/intro/intro_password_check.h +++ b/Telegram/SourceFiles/intro/intro_password_check.h @@ -62,7 +62,6 @@ private: void passwordChecked(); void serverError(); - MTP::Sender _api; Core::CloudPasswordCheckRequest _request; crl::time _lastSrpIdInvalidTime = 0; bytes::vector _passwordHash; diff --git a/Telegram/SourceFiles/intro/intro_phone.cpp b/Telegram/SourceFiles/intro/intro_phone.cpp index d31b3fea7d..4e3d7cea91 100644 --- a/Telegram/SourceFiles/intro/intro_phone.cpp +++ b/Telegram/SourceFiles/intro/intro_phone.cpp @@ -141,15 +141,17 @@ void PhoneWidget::submit() { _checkRequestTimer.callEach(1000); _sentPhone = phone; - account().mtp()->setUserPhone(_sentPhone); - _sentRequest = MTP::send( - MTPauth_SendCode( - MTP_string(_sentPhone), - MTP_int(ApiId), - MTP_string(ApiHash), - MTP_codeSettings(MTP_flags(0))), - rpcDone(&PhoneWidget::phoneSubmitDone), - rpcFail(&PhoneWidget::phoneSubmitFail)); + api()->instance()->setUserPhone(_sentPhone); + _sentRequest = api()->request(MTPauth_SendCode( + MTP_string(_sentPhone), + MTP_int(ApiId), + MTP_string(ApiHash), + MTP_codeSettings(MTP_flags(0)) + )).done([=](const MTPauth_SentCode &result) { + phoneSubmitDone(result); + }).fail([=](const RPCError &error) { + phoneSubmitFail(error); + }).handleFloodErrors().send(); } void PhoneWidget::stopCheck() { @@ -157,11 +159,11 @@ void PhoneWidget::stopCheck() { } void PhoneWidget::checkRequest() { - auto status = MTP::state(_sentRequest); + auto status = api()->instance()->state(_sentRequest); if (status < 0) { auto leftms = -status; if (leftms >= 1000) { - MTP::cancel(base::take(_sentRequest)); + api()->request(base::take(_sentRequest)).cancel(); } } if (!_sentRequest && status == MTP::RequestSent) { @@ -193,34 +195,28 @@ void PhoneWidget::phoneSubmitDone(const MTPauth_SentCode &result) { goNext(); } -bool PhoneWidget::phoneSubmitFail(const RPCError &error) { +void PhoneWidget::phoneSubmitFail(const RPCError &error) { if (MTP::isFloodError(error)) { stopCheck(); _sentRequest = 0; showPhoneError(tr::lng_flood_error()); - return true; + return; } - if (MTP::isDefaultHandledError(error)) return false; stopCheck(); _sentRequest = 0; auto &err = error.type(); if (err == qstr("PHONE_NUMBER_FLOOD")) { Ui::show(Box(tr::lng_error_phone_flood(tr::now))); - return true; } else if (err == qstr("PHONE_NUMBER_INVALID")) { // show error showPhoneError(tr::lng_bad_phone()); - return true; } else if (err == qstr("PHONE_NUMBER_BANNED")) { ShowPhoneBannedError(_sentPhone); - return true; - } - if (Logs::DebugEnabled()) { // internal server error + } else if (Logs::DebugEnabled()) { // internal server error showPhoneError(rpl::single(err + ": " + error.description())); } else { showPhoneError(rpl::single(Lang::Hard::ServerError())); } - return false; } QString PhoneWidget::fullNumber() const { @@ -244,13 +240,13 @@ void PhoneWidget::activate() { void PhoneWidget::finished() { Step::finished(); _checkRequestTimer.cancel(); - rpcInvalidate(); + apiClear(); cancelled(); } void PhoneWidget::cancelled() { - MTP::cancel(base::take(_sentRequest)); + api()->request(base::take(_sentRequest)).cancel(); } } // namespace details diff --git a/Telegram/SourceFiles/intro/intro_phone.h b/Telegram/SourceFiles/intro/intro_phone.h index 29e6699fcb..80b86f2707 100644 --- a/Telegram/SourceFiles/intro/intro_phone.h +++ b/Telegram/SourceFiles/intro/intro_phone.h @@ -50,7 +50,7 @@ private: void countryChanged(); void phoneSubmitDone(const MTPauth_SentCode &result); - bool phoneSubmitFail(const RPCError &error); + void phoneSubmitFail(const RPCError &error); QString fullNumber() const; void stopCheck(); diff --git a/Telegram/SourceFiles/intro/intro_qr.cpp b/Telegram/SourceFiles/intro/intro_qr.cpp index e2c00a82d8..936db11f4d 100644 --- a/Telegram/SourceFiles/intro/intro_qr.cpp +++ b/Telegram/SourceFiles/intro/intro_qr.cpp @@ -174,7 +174,6 @@ QrWidget::QrWidget( not_null account, not_null data) : Step(parent, account, data) -, _api(account->mtp()) , _refreshTimer([=] { refreshCode(); }) { setTitleText(rpl::single(QString())); setDescriptionText(rpl::single(QString())); @@ -309,7 +308,7 @@ void QrWidget::refreshCode() { if (_requestId) { return; } - _requestId = _api.request(MTPauth_ExportLoginToken( + _requestId = api()->request(MTPauth_ExportLoginToken( MTP_int(ApiId), MTP_string(ApiHash), MTP_vector(0) @@ -357,8 +356,8 @@ void QrWidget::showToken(const QByteArray &token) { void QrWidget::importTo(MTP::DcId dcId, const QByteArray &token) { Expects(_requestId != 0); - _api.instance()->setMainDcId(dcId); - _requestId = _api.request(MTPauth_ImportLoginToken( + api()->instance()->setMainDcId(dcId); + _requestId = api()->request(MTPauth_ImportLoginToken( MTP_bytes(token) )).done([=](const MTPauth_LoginToken &result) { handleTokenResult(result); @@ -385,7 +384,7 @@ void QrWidget::done(const MTPauth_Authorization &authorization) { } void QrWidget::sendCheckPasswordRequest() { - _requestId = _api.request(MTPaccount_GetPassword( + _requestId = api()->request(MTPaccount_GetPassword( )).done([=](const MTPaccount_Password &result) { result.match([&](const MTPDaccount_password &data) { getData()->pwdRequest = Core::ParseCloudPasswordCheckRequest( @@ -424,12 +423,12 @@ void QrWidget::activate() { void QrWidget::finished() { Step::finished(); _refreshTimer.cancel(); - rpcInvalidate(); + apiClear(); cancelled(); } void QrWidget::cancelled() { - _api.request(base::take(_requestId)).cancel(); + api()->request(base::take(_requestId)).cancel(); } } // namespace details diff --git a/Telegram/SourceFiles/intro/intro_qr.h b/Telegram/SourceFiles/intro/intro_qr.h index aa099ca911..87b9cd800b 100644 --- a/Telegram/SourceFiles/intro/intro_qr.h +++ b/Telegram/SourceFiles/intro/intro_qr.h @@ -9,7 +9,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/countryinput.h" #include "intro/intro_step.h" -#include "mtproto/sender.h" #include "base/timer.h" namespace Ui { @@ -53,7 +52,6 @@ private: void showToken(const QByteArray &token); void done(const MTPauth_Authorization &authorization); - MTP::Sender _api; rpl::event_stream _qrCodes; base::Timer _refreshTimer; mtpRequestId _requestId = 0; diff --git a/Telegram/SourceFiles/intro/intro_signup.cpp b/Telegram/SourceFiles/intro/intro_signup.cpp index e297dec66e..f82a545761 100644 --- a/Telegram/SourceFiles/intro/intro_signup.cpp +++ b/Telegram/SourceFiles/intro/intro_signup.cpp @@ -101,7 +101,7 @@ void SignupWidget::activate() { } void SignupWidget::cancelled() { - MTP::cancel(base::take(_sentRequest)); + api()->request(base::take(_sentRequest)).cancel(); } void SignupWidget::nameSubmitDone(const MTPauth_Authorization &result) { @@ -113,7 +113,7 @@ void SignupWidget::nameSubmitDone(const MTPauth_Authorization &result) { finish(d.vuser(), _photo->takeResultImage()); } -bool SignupWidget::nameSubmitFail(const RPCError &error) { +void SignupWidget::nameSubmitFail(const RPCError &error) { if (MTP::isFloodError(error)) { showError(tr::lng_flood_error()); if (_invertOrder) { @@ -121,14 +121,12 @@ bool SignupWidget::nameSubmitFail(const RPCError &error) { } else { _last->setFocus(); } - return true; + return; } - if (MTP::isDefaultHandledError(error)) return false; auto &err = error.type(); if (err == qstr("PHONE_NUMBER_FLOOD")) { Ui::show(Box(tr::lng_error_phone_flood(tr::now))); - return true; } else if (err == qstr("PHONE_NUMBER_INVALID") || err == qstr("PHONE_NUMBER_BANNED") || err == qstr("PHONE_CODE_EXPIRED") @@ -136,27 +134,24 @@ bool SignupWidget::nameSubmitFail(const RPCError &error) { || err == qstr("PHONE_CODE_INVALID") || err == qstr("PHONE_NUMBER_OCCUPIED")) { goBack(); - return true; } else if (err == "FIRSTNAME_INVALID") { showError(tr::lng_bad_name()); _first->setFocus(); - return true; } else if (err == "LASTNAME_INVALID") { showError(tr::lng_bad_name()); _last->setFocus(); - return true; - } - if (Logs::DebugEnabled()) { // internal server error - showError(rpl::single(err + ": " + error.description())); } else { - showError(rpl::single(Lang::Hard::ServerError())); + if (Logs::DebugEnabled()) { // internal server error + showError(rpl::single(err + ": " + error.description())); + } else { + showError(rpl::single(Lang::Hard::ServerError())); + } + if (_invertOrder) { + _last->setFocus(); + } else { + _first->setFocus(); + } } - if (_invertOrder) { - _last->setFocus(); - } else { - _first->setFocus(); - } - return false; } void SignupWidget::submit() { @@ -186,14 +181,16 @@ void SignupWidget::submit() { _firstName = _first->getLastText().trimmed(); _lastName = _last->getLastText().trimmed(); - _sentRequest = MTP::send( - MTPauth_SignUp( - MTP_string(getData()->phone), - MTP_bytes(getData()->phoneHash), - MTP_string(_firstName), - MTP_string(_lastName)), - rpcDone(&SignupWidget::nameSubmitDone), - rpcFail(&SignupWidget::nameSubmitFail)); + _sentRequest = api()->request(MTPauth_SignUp( + MTP_string(getData()->phone), + MTP_bytes(getData()->phoneHash), + MTP_string(_firstName), + MTP_string(_lastName) + )).done([=](const MTPauth_Authorization &result) { + nameSubmitDone(result); + }).fail([=](const RPCError &error) { + nameSubmitFail(error); + }).handleFloodErrors().send(); }; if (_termsAccepted || getData()->termsLock.text.text.isEmpty() diff --git a/Telegram/SourceFiles/intro/intro_signup.h b/Telegram/SourceFiles/intro/intro_signup.h index 3867bcbbef..fbd5acdb9f 100644 --- a/Telegram/SourceFiles/intro/intro_signup.h +++ b/Telegram/SourceFiles/intro/intro_signup.h @@ -40,7 +40,7 @@ private: void updateControlsGeometry(); void nameSubmitDone(const MTPauth_Authorization &result); - bool nameSubmitFail(const RPCError &error); + void nameSubmitFail(const RPCError &error); object_ptr _photo; object_ptr _first; diff --git a/Telegram/SourceFiles/intro/intro_step.cpp b/Telegram/SourceFiles/intro/intro_step.cpp index fa07001b0c..1a2c1e9fca 100644 --- a/Telegram/SourceFiles/intro/intro_step.cpp +++ b/Telegram/SourceFiles/intro/intro_step.cpp @@ -98,6 +98,17 @@ Step::Step( Step::~Step() = default; +not_null Step::api() const { + if (!_api) { + _api.emplace(_account->mtp()); + } + return &*_api; +} + +void Step::apiClear() { + _api.reset(); +} + rpl::producer Step::nextButtonText() const { return tr::lng_intro_next(); } diff --git a/Telegram/SourceFiles/intro/intro_step.h b/Telegram/SourceFiles/intro/intro_step.h index c51db5e420..24b6711962 100644 --- a/Telegram/SourceFiles/intro/intro_step.h +++ b/Telegram/SourceFiles/intro/intro_step.h @@ -30,10 +30,7 @@ namespace details { struct Data; enum class Direction; -class Step - : public Ui::RpWidget - , public RPCSender - , protected base::Subscriber { +class Step : public Ui::RpWidget, protected base::Subscriber { public: Step( QWidget *parent, @@ -46,6 +43,11 @@ public: return *_account; } + // It should not be called in StartWidget, in other steps it should be + // present and not changing. + [[nodiscard]] not_null api() const; + void apiClear(); + virtual void finishInit() { } virtual void setInnerFocus() { @@ -167,6 +169,7 @@ private: const not_null _account; const not_null _data; + mutable std::optional _api; bool _hasCover = false; Fn _goCallback; diff --git a/Telegram/SourceFiles/storage/file_upload.cpp b/Telegram/SourceFiles/storage/file_upload.cpp index 672666207e..ea43f93357 100644 --- a/Telegram/SourceFiles/storage/file_upload.cpp +++ b/Telegram/SourceFiles/storage/file_upload.cpp @@ -277,7 +277,7 @@ void Uploader::currentFailed() { void Uploader::stopSessions() { for (int i = 0; i < MTP::kUploadSessionsCount; ++i) { - MTP::stopSession(MTP::uploadDcId(i)); + _api->instance()->stopSession(MTP::uploadDcId(i)); } } @@ -440,24 +440,26 @@ void Uploader::sendNext() { } mtpRequestId requestId; if (uploadingData.docSize > kUseBigFilesFrom) { - requestId = MTP::send( - MTPupload_SaveBigFilePart( - MTP_long(uploadingData.id()), - MTP_int(uploadingData.docSentParts), - MTP_int(uploadingData.docPartsCount), - MTP_bytes(toSend)), - rpcDone(&Uploader::partLoaded), - rpcFail(&Uploader::partFailed), - MTP::uploadDcId(todc)); + requestId = _api->request(MTPupload_SaveBigFilePart( + MTP_long(uploadingData.id()), + MTP_int(uploadingData.docSentParts), + MTP_int(uploadingData.docPartsCount), + MTP_bytes(toSend) + )).done([=](const MTPBool &result, mtpRequestId requestId) { + partLoaded(result, requestId); + }).fail([=](const RPCError &error, mtpRequestId requestId) { + partFailed(error, requestId); + }).toDC(MTP::uploadDcId(todc)).send(); } else { - requestId = MTP::send( - MTPupload_SaveFilePart( - MTP_long(uploadingData.id()), - MTP_int(uploadingData.docSentParts), - MTP_bytes(toSend)), - rpcDone(&Uploader::partLoaded), - rpcFail(&Uploader::partFailed), - MTP::uploadDcId(todc)); + requestId = _api->request(MTPupload_SaveFilePart( + MTP_long(uploadingData.id()), + MTP_int(uploadingData.docSentParts), + MTP_bytes(toSend) + )).done([=](const MTPBool &result, mtpRequestId requestId) { + partLoaded(result, requestId); + }).fail([=](const RPCError &error, mtpRequestId requestId) { + partFailed(error, requestId); + }).toDC(MTP::uploadDcId(todc)).send(); } docRequestsSent.emplace(requestId, uploadingData.docSentParts); dcMap.emplace(requestId, todc); @@ -468,14 +470,15 @@ void Uploader::sendNext() { } else { auto part = parts.begin(); - const auto requestId = MTP::send( - MTPupload_SaveFilePart( - MTP_long(partsOfId), - MTP_int(part.key()), - MTP_bytes(part.value())), - rpcDone(&Uploader::partLoaded), - rpcFail(&Uploader::partFailed), - MTP::uploadDcId(todc)); + const auto requestId = _api->request(MTPupload_SaveFilePart( + MTP_long(partsOfId), + MTP_int(part.key()), + MTP_bytes(part.value()) + )).done([=](const MTPBool &result, mtpRequestId requestId) { + partLoaded(result, requestId); + }).fail([=](const RPCError &error, mtpRequestId requestId) { + partFailed(error, requestId); + }).toDC(MTP::uploadDcId(todc)).send(); requestsSent.emplace(requestId, part.value()); dcMap.emplace(requestId, todc); sentSize += part.value().size(); @@ -511,17 +514,17 @@ void Uploader::clear() { uploaded.clear(); queue.clear(); for (const auto &requestData : requestsSent) { - MTP::cancel(requestData.first); + _api->request(requestData.first).cancel(); } requestsSent.clear(); for (const auto &requestData : docRequestsSent) { - MTP::cancel(requestData.first); + _api->request(requestData.first).cancel(); } docRequestsSent.clear(); dcMap.clear(); sentSize = 0; for (int i = 0; i < MTP::kUploadSessionsCount; ++i) { - MTP::stopSession(MTP::uploadDcId(i)); + _api->instance()->stopSession(MTP::uploadDcId(i)); sentSizes[i] = 0; } stopSessionsTimer.stop(); @@ -592,16 +595,13 @@ void Uploader::partLoaded(const MTPBool &result, mtpRequestId requestId) { sendNext(); } -bool Uploader::partFailed(const RPCError &error, mtpRequestId requestId) { - if (MTP::isDefaultHandledError(error)) return false; - +void Uploader::partFailed(const RPCError &error, mtpRequestId requestId) { // failed to upload current file if ((requestsSent.find(requestId) != requestsSent.cend()) || (docRequestsSent.find(requestId) != docRequestsSent.cend())) { currentFailed(); } sendNext(); - return true; } } // namespace Storage diff --git a/Telegram/SourceFiles/storage/file_upload.h b/Telegram/SourceFiles/storage/file_upload.h index 23d1b7ebf4..df1e2b3662 100644 --- a/Telegram/SourceFiles/storage/file_upload.h +++ b/Telegram/SourceFiles/storage/file_upload.h @@ -119,7 +119,7 @@ private: struct File; void partLoaded(const MTPBool &result, mtpRequestId requestId); - bool partFailed(const RPCError &err, mtpRequestId requestId); + void partFailed(const RPCError &error, mtpRequestId requestId); void currentFailed();