Use MTP::Sender in Intro.

This commit is contained in:
John Preston 2020-06-11 17:07:14 +04:00
parent 0b028b959b
commit 7f09da9e32
15 changed files with 166 additions and 162 deletions

View file

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

View file

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

View file

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

View file

@ -29,7 +29,6 @@ PasswordCheckWidget::PasswordCheckWidget(
not_null<Main::Account*> account,
not_null<Data*> 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) {

View file

@ -62,7 +62,6 @@ private:
void passwordChecked();
void serverError();
MTP::Sender _api;
Core::CloudPasswordCheckRequest _request;
crl::time _lastSrpIdInvalidTime = 0;
bytes::vector _passwordHash;

View file

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

View file

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

View file

@ -174,7 +174,6 @@ QrWidget::QrWidget(
not_null<Main::Account*> account,
not_null<Data*> 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<MTPint>(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

View file

@ -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<QByteArray> _qrCodes;
base::Timer _refreshTimer;
mtpRequestId _requestId = 0;

View file

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

View file

@ -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<Ui::UserpicButton> _photo;
object_ptr<Ui::InputField> _first;

View file

@ -98,6 +98,17 @@ Step::Step(
Step::~Step() = default;
not_null<MTP::Sender*> Step::api() const {
if (!_api) {
_api.emplace(_account->mtp());
}
return &*_api;
}
void Step::apiClear() {
_api.reset();
}
rpl::producer<QString> Step::nextButtonText() const {
return tr::lng_intro_next();
}

View file

@ -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<MTP::Sender*> api() const;
void apiClear();
virtual void finishInit() {
}
virtual void setInnerFocus() {
@ -167,6 +169,7 @@ private:
const not_null<Main::Account*> _account;
const not_null<Data*> _data;
mutable std::optional<MTP::Sender> _api;
bool _hasCover = false;
Fn<void(Step *step, Direction direction)> _goCallback;

View file

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

View file

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