From 98f2f6d4c08693f427a935a3ddf7d7dfeb3299bf Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 7 Mar 2022 11:09:03 +0400 Subject: [PATCH] Always try to save original photo bytes to disk. --- .../SourceFiles/data/data_photo_media.cpp | 17 +++++++++++ Telegram/SourceFiles/data/data_photo_media.h | 2 ++ .../admin_log/history_admin_log_inner.cpp | 3 +- .../history/history_inner_widget.cpp | 3 +- .../view/history_view_context_menu.cpp | 2 +- .../media/view/media_view_overlay_widget.cpp | 29 ++++--------------- .../media/view/media_view_overlay_widget.h | 5 ---- 7 files changed, 27 insertions(+), 34 deletions(-) diff --git a/Telegram/SourceFiles/data/data_photo_media.cpp b/Telegram/SourceFiles/data/data_photo_media.cpp index 38260b9476..532ccf8e46 100644 --- a/Telegram/SourceFiles/data/data_photo_media.cpp +++ b/Telegram/SourceFiles/data/data_photo_media.cpp @@ -190,4 +190,21 @@ void PhotoMedia::collectLocalData(not_null local) { } } +bool PhotoMedia::saveToFile(const QString &path) { + if (const auto video = videoContent(); !video.isEmpty()) { + QFile f(path); + return f.open(QIODevice::WriteOnly) + && (f.write(video) == video.size()); + } else if (const auto photo = imageBytes(Data::PhotoSize::Large) + ; !photo.isEmpty()) { + QFile f(path); + return f.open(QIODevice::WriteOnly) + && (f.write(photo) == photo.size()); + } else if (const auto fallback = image(Data::PhotoSize::Large)->original() + ; !fallback.isNull()) { + return fallback.save(path, "JPG"); + } + return false; +} + } // namespace Data diff --git a/Telegram/SourceFiles/data/data_photo_media.h b/Telegram/SourceFiles/data/data_photo_media.h index ff7bd03765..99d4d42876 100644 --- a/Telegram/SourceFiles/data/data_photo_media.h +++ b/Telegram/SourceFiles/data/data_photo_media.h @@ -47,6 +47,8 @@ public: void collectLocalData(not_null local); + bool saveToFile(const QString &path); + private: struct PhotoImage { std::unique_ptr data; diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index d329bad782..c03749fe06 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -1316,7 +1316,6 @@ void InnerWidget::savePhotoToFile(not_null photo) { return; } - const auto image = media->image(Data::PhotoSize::Large)->original(); auto filter = qsl("JPEG Image (*.jpg);;") + FileDialog::AllFilesFilter(); FileDialog::GetWritePath( this, @@ -1325,7 +1324,7 @@ void InnerWidget::savePhotoToFile(not_null photo) { filedialogDefaultName(qsl("photo"), qsl(".jpg")), crl::guard(this, [=](const QString &result) { if (!result.isEmpty()) { - image.save(result, "JPG"); + media->saveToFile(result); } })); } diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index e47af77b89..5fcc14d3fe 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -2375,7 +2375,6 @@ void HistoryInner::savePhotoToFile(not_null photo) { return; } - const auto image = media->image(Data::PhotoSize::Large)->original(); auto filter = qsl("JPEG Image (*.jpg);;") + FileDialog::AllFilesFilter(); FileDialog::GetWritePath( this, @@ -2386,7 +2385,7 @@ void HistoryInner::savePhotoToFile(not_null photo) { qsl(".jpg")), crl::guard(this, [=](const QString &result) { if (!result.isEmpty()) { - image.save(result, "JPG"); + media->saveToFile(result); } })); } diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index cbc027573b..caddcc973f 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -105,7 +105,7 @@ void SavePhotoToFile(not_null photo) { filedialogDefaultName(qsl("photo"), qsl(".jpg")), crl::guard(&photo->session(), [=](const QString &result) { if (!result.isEmpty()) { - image.save(result, "JPG"); + media->saveToFile(result); } })); } diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 4c0ce9a7a5..4cad4a25be 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -1617,9 +1617,7 @@ void OverlayWidget::saveAs() { return; } - const auto image = _photoMedia->image( - Data::PhotoSize::Large)->original(); - const auto bytes = _photoMedia->imageBytes(Data::PhotoSize::Large); + const auto media = _photoMedia; const auto photo = _photo; const auto filter = qsl("JPEG Image (*.jpg);;") + FileDialog::AllFilesFilter(); @@ -1635,7 +1633,7 @@ void OverlayWidget::saveAs() { _photo->date), crl::guard(_widget, [=](const QString &result) { if (!result.isEmpty() && _photo == photo) { - saveToFile(result, bytes, image); + media->saveToFile(result); } })); } @@ -1707,12 +1705,12 @@ void OverlayWidget::downloadMedia() { updateOver(_lastMouseMovePos); } } else if (_photo && _photo->hasVideo()) { - if (const auto bytes = _photoMedia->videoContent(); !bytes.isEmpty()) { + if (!_photoMedia->videoContent().isEmpty()) { if (!QDir().exists(path)) { QDir().mkpath(path); } toName = filedialogDefaultName(qsl("photo"), qsl(".mp4"), path); - if (!saveToFile(toName, bytes, QImage())) { + if (!_photoMedia->saveToFile(toName)) { toName = QString(); } } else { @@ -1728,10 +1726,7 @@ void OverlayWidget::downloadMedia() { QDir().mkpath(path); } toName = filedialogDefaultName(qsl("photo"), qsl(".jpg"), path); - const auto saved = saveToFile( - toName, - _photoMedia->imageBytes(Data::PhotoSize::Large), - _photoMedia->image(Data::PhotoSize::Large)->original()); + const auto saved = _photoMedia->saveToFile(toName); if (!saved) { toName = QString(); } @@ -1745,20 +1740,6 @@ void OverlayWidget::downloadMedia() { } } -bool OverlayWidget::saveToFile( - const QString &path, - const QByteArray &bytes, - const QImage &fallback) { - if (!bytes.isEmpty()) { - QFile f(path); - return f.open(QIODevice::WriteOnly) - && (f.write(bytes) == bytes.size()); - } else if (!fallback.isNull()) { - return fallback.save(path, "JPG"); - } - return false; -} - void OverlayWidget::saveCancel() { if (_document && _document->loading()) { _document->cancel(); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 793c2d421d..7ec846c30f 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -428,11 +428,6 @@ private: void applyHideWindowWorkaround(); - bool saveToFile( - const QString &path, - const QByteArray &bytes, - const QImage &fallback); - Window::SessionController *findWindow(bool switchTo = true) const; bool _opengl = false;