Moved load status of files in passport to separated class.

This commit is contained in:
23rd 2021-08-24 10:06:00 +03:00
parent 401529e7d1
commit 559d488b0b
3 changed files with 57 additions and 22 deletions

View file

@ -1438,7 +1438,7 @@ void FormController::prepareFile(
file.fields.secret = GenerateSecretBytes(); file.fields.secret = GenerateSecretBytes();
file.fields.date = base::unixtime::now(); file.fields.date = base::unixtime::now();
file.fields.image = ReadImage(bytes::make_span(content)); file.fields.image = ReadImage(bytes::make_span(content));
file.fields.downloadOffset = file.fields.size; file.fields.downloadStatus.set(LoadStatus::Status::Done);
_scanUpdated.fire(&file); _scanUpdated.fire(&file);
} }
@ -1558,6 +1558,7 @@ void FormController::uploadEncryptedFile(
file.uploadData->fullId = FullMsgId( file.uploadData->fullId = FullMsgId(
0, 0,
session().data().nextLocalMessageId()); session().data().nextLocalMessageId());
file.uploadData->status.set(LoadStatus::Status::InProgress, 0);
session().uploader().upload( session().uploader().upload(
file.uploadData->fullId, file.uploadData->fullId,
std::move(prepared)); std::move(prepared));
@ -1575,6 +1576,7 @@ void FormController::scanUploadDone(const Storage::UploadSecureDone &data) {
_secret, _secret,
file->fields.hash); file->fields.hash);
file->uploadData->fullId = FullMsgId(); file->uploadData->fullId = FullMsgId();
file->uploadData->status.set(LoadStatus::Status::Done);
_scanUpdated.fire(file); _scanUpdated.fire(file);
} }
@ -1585,7 +1587,9 @@ void FormController::scanUploadProgress(
if (const auto file = findEditFile(data.fullId)) { if (const auto file = findEditFile(data.fullId)) {
Assert(file->uploadData != nullptr); Assert(file->uploadData != nullptr);
file->uploadData->offset = data.offset; file->uploadData->status.set(
LoadStatus::Status::InProgress,
data.offset);
_scanUpdated.fire(file); _scanUpdated.fire(file);
} }
@ -1595,7 +1599,7 @@ void FormController::scanUploadFail(const FullMsgId &fullId) {
if (const auto file = findEditFile(fullId)) { if (const auto file = findEditFile(fullId)) {
Assert(file->uploadData != nullptr); Assert(file->uploadData != nullptr);
file->uploadData->offset = -1; file->uploadData->status.set(LoadStatus::Status::Failed);
_scanUpdated.fire(file); _scanUpdated.fire(file);
} }
@ -1737,7 +1741,7 @@ void FormController::startValueEdit(not_null<const Value*> value) {
void FormController::loadFile(File &file) { void FormController::loadFile(File &file) {
if (!file.image.isNull()) { if (!file.image.isNull()) {
file.downloadOffset = file.size; file.downloadStatus.set(LoadStatus::Status::Done);
return; return;
} }
@ -1746,7 +1750,7 @@ void FormController::loadFile(File &file) {
if (i != _fileLoaders.end()) { if (i != _fileLoaders.end()) {
return; return;
} }
file.downloadOffset = 0; file.downloadStatus.set(LoadStatus::Status::InProgress, 0);
const auto [j, ok] = _fileLoaders.emplace( const auto [j, ok] = _fileLoaders.emplace(
key, key,
std::make_unique<mtpFileLoader>( std::make_unique<mtpFileLoader>(
@ -1788,11 +1792,11 @@ void FormController::fileLoadDone(FileKey key, const QByteArray &bytes) {
fileLoadFail(key); fileLoadFail(key);
return; return;
} }
file->downloadOffset = file->size; file->downloadStatus.set(LoadStatus::Status::Done);
file->image = ReadImage(gsl::make_span(decrypted)); file->image = ReadImage(gsl::make_span(decrypted));
if (const auto fileInEdit = findEditFile(key)) { if (const auto fileInEdit = findEditFile(key)) {
fileInEdit->fields.image = file->image; fileInEdit->fields.image = file->image;
fileInEdit->fields.downloadOffset = file->downloadOffset; fileInEdit->fields.downloadStatus = file->downloadStatus;
_scanUpdated.fire(fileInEdit); _scanUpdated.fire(fileInEdit);
} }
} }
@ -1800,9 +1804,9 @@ void FormController::fileLoadDone(FileKey key, const QByteArray &bytes) {
void FormController::fileLoadProgress(FileKey key, int offset) { void FormController::fileLoadProgress(FileKey key, int offset) {
if (const auto [value, file] = findFile(key); file != nullptr) { if (const auto [value, file] = findFile(key); file != nullptr) {
file->downloadOffset = offset; file->downloadStatus.set(LoadStatus::Status::InProgress, offset);
if (const auto fileInEdit = findEditFile(key)) { if (const auto fileInEdit = findEditFile(key)) {
fileInEdit->fields.downloadOffset = file->downloadOffset; fileInEdit->fields.downloadStatus = file->downloadStatus;
_scanUpdated.fire(fileInEdit); _scanUpdated.fire(fileInEdit);
} }
} }
@ -1810,9 +1814,9 @@ void FormController::fileLoadProgress(FileKey key, int offset) {
void FormController::fileLoadFail(FileKey key) { void FormController::fileLoadFail(FileKey key) {
if (const auto [value, file] = findFile(key); file != nullptr) { if (const auto [value, file] = findFile(key); file != nullptr) {
file->downloadOffset = -1; file->downloadStatus.set(LoadStatus::Status::Failed);
if (const auto fileInEdit = findEditFile(key)) { if (const auto fileInEdit = findEditFile(key)) {
fileInEdit->fields.downloadOffset = file->downloadOffset; fileInEdit->fields.downloadStatus = file->downloadStatus;
_scanUpdated.fire(fileInEdit); _scanUpdated.fire(fileInEdit);
} }
} }
@ -2361,7 +2365,7 @@ void FormController::fillDownloadedFile(
return; return;
} }
destination.image = i->fields.image; destination.image = i->fields.image;
destination.downloadOffset = i->fields.downloadOffset; destination.downloadStatus = i->fields.downloadStatus;
if (!i->uploadData) { if (!i->uploadData) {
return; return;
} }

View file

@ -64,6 +64,35 @@ struct FormRequest {
}; };
class LoadStatus final {
public:
enum class Status {
Done,
InProgress,
Failed,
};
LoadStatus() = default;
void set(Status status, int offset = 0) {
if (!offset) {
offset = _offset;
}
_offset = (status == Status::InProgress) ? offset : 0;
_status = status;
}
int offset() const {
return _offset;
}
Status status() const {
return _status;
}
private:
int _offset = 0;
Status _status = Status::Done;
};
struct UploadScanData { struct UploadScanData {
FullMsgId fullId; FullMsgId fullId;
uint64 fileId = 0; uint64 fileId = 0;
@ -72,7 +101,7 @@ struct UploadScanData {
bytes::vector hash; bytes::vector hash;
bytes::vector bytes; bytes::vector bytes;
int offset = 0; LoadStatus status;
}; };
class UploadScanDataPointer { class UploadScanDataPointer {
@ -115,7 +144,7 @@ struct File {
bytes::vector secret; bytes::vector secret;
bytes::vector encryptedSecret; bytes::vector encryptedSecret;
int downloadOffset = 0; LoadStatus downloadStatus;
QImage image; QImage image;
QString error; QString error;
}; };

View file

@ -40,13 +40,14 @@ const auto kLanguageNamePrefix = "cloud_lng_passport_in_";
ScanInfo CollectScanInfo(const EditFile &file) { ScanInfo CollectScanInfo(const EditFile &file) {
const auto status = [&] { const auto status = [&] {
if (file.fields.accessHash) { if (file.fields.accessHash) {
if (file.fields.downloadOffset < 0) { switch (file.fields.downloadStatus.status()) {
case LoadStatus::Status::Failed:
return tr::lng_attach_failed(tr::now); return tr::lng_attach_failed(tr::now);
} else if (file.fields.downloadOffset < file.fields.size) { case LoadStatus::Status::InProgress:
return Ui::FormatDownloadText( return Ui::FormatDownloadText(
file.fields.downloadOffset, file.fields.downloadStatus.offset(),
file.fields.size); file.fields.size);
} else { case LoadStatus::Status::Done:
return tr::lng_passport_scan_uploaded( return tr::lng_passport_scan_uploaded(
tr::now, tr::now,
lt_date, lt_date,
@ -54,13 +55,14 @@ ScanInfo CollectScanInfo(const EditFile &file) {
base::unixtime::parse(file.fields.date))); base::unixtime::parse(file.fields.date)));
} }
} else if (file.uploadData) { } else if (file.uploadData) {
if (file.uploadData->offset < 0) { switch (file.uploadData->status.status()) {
case LoadStatus::Status::Failed:
return tr::lng_attach_failed(tr::now); return tr::lng_attach_failed(tr::now);
} else if (file.uploadData->fullId) { case LoadStatus::Status::InProgress:
return Ui::FormatDownloadText( return Ui::FormatDownloadText(
file.uploadData->offset, file.uploadData->status.offset(),
file.uploadData->bytes.size()); file.uploadData->bytes.size());
} else { case LoadStatus::Status::Done:
return tr::lng_passport_scan_uploaded( return tr::lng_passport_scan_uploaded(
tr::now, tr::now,
lt_date, lt_date,