File indexing completed on 2024-12-08 04:34:23

0001 /*
0002    SPDX-FileCopyrightText: 2023-2024 Laurent Montel <montel.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "messageattachmentdownloadandsavejob.h"
0008 #include "common/delegateutil.h"
0009 #include "rocketchataccount.h"
0010 #include "ruqolawidgets_debug.h"
0011 #include <KLocalizedString>
0012 #include <QProgressDialog>
0013 
0014 MessageAttachmentDownloadAndSaveJob::MessageAttachmentDownloadAndSaveJob(QObject *parent)
0015     : QObject{parent}
0016 {
0017     connect(this, &MessageAttachmentDownloadAndSaveJob::downloadDone, this, &MessageAttachmentDownloadAndSaveJob::slotDownloadDone);
0018 }
0019 
0020 MessageAttachmentDownloadAndSaveJob::~MessageAttachmentDownloadAndSaveJob() = default;
0021 
0022 void MessageAttachmentDownloadAndSaveJob::slotDownloadDone(const QString &path)
0023 {
0024     switch (mInfo.actionType) {
0025     case MessageAttachmentDownloadAndSaveJob::ActionType::DownloadAndSave:
0026         DelegateUtil::saveFile(mInfo.parentWidget, path, saveFileString());
0027         break;
0028     case MessageAttachmentDownloadAndSaveJob::ActionType::DownloadOnly:
0029         Q_EMIT attachmentFileDownloadDone(path);
0030         break;
0031     case MessageAttachmentDownloadAndSaveJob::ActionType::Unknown:
0032         qCWarning(RUQOLAWIDGETS_LOG) << "ActionType is unknown. It's a bug";
0033         break;
0034     }
0035     slotDownloadCancel();
0036 }
0037 
0038 bool MessageAttachmentDownloadAndSaveJob::canStart() const
0039 {
0040     return mInfo.isValid();
0041 }
0042 
0043 void MessageAttachmentDownloadAndSaveJob::slotFileDownloaded(const QString &filePath, const QUrl &cacheAttachmentUrl)
0044 {
0045     qCDebug(RUQOLAWIDGETS_LOG) << "File Downloaded : " << filePath << " cacheImageUrl " << cacheAttachmentUrl;
0046     if (filePath == QUrl(mInfo.attachmentPath).toString()) {
0047         const QString cacheAttachmentUrlPath{cacheAttachmentUrl.toLocalFile()};
0048         Q_EMIT downloadDone(cacheAttachmentUrlPath);
0049     }
0050 }
0051 
0052 QString MessageAttachmentDownloadAndSaveJob::saveFileString() const
0053 {
0054     QString str;
0055     switch (mInfo.attachmentType) {
0056     case MessageAttachmentDownloadAndSaveJob::AttachmentType::Unknown:
0057         break;
0058     case MessageAttachmentDownloadAndSaveJob::AttachmentType::Image:
0059         str = i18n("Save Image");
0060         break;
0061     case MessageAttachmentDownloadAndSaveJob::AttachmentType::Video:
0062         str = i18n("Save Video");
0063         break;
0064     case MessageAttachmentDownloadAndSaveJob::AttachmentType::Sound:
0065         str = i18n("Save Sound");
0066         break;
0067     }
0068     return str;
0069 }
0070 
0071 void MessageAttachmentDownloadAndSaveJob::assignProgressDialogStr(QProgressDialog *progressDialog)
0072 {
0073     switch (mInfo.attachmentType) {
0074     case MessageAttachmentDownloadAndSaveJob::AttachmentType::Unknown:
0075         break;
0076     case MessageAttachmentDownloadAndSaveJob::AttachmentType::Image:
0077         progressDialog->setWindowTitle(i18nc("@title:window", "Download Image"));
0078         progressDialog->setLabelText(i18n("Download Image..."));
0079         break;
0080     case MessageAttachmentDownloadAndSaveJob::AttachmentType::Video:
0081         progressDialog->setWindowTitle(i18nc("@title:window", "Download Video"));
0082         progressDialog->setLabelText(i18n("Download Video..."));
0083         break;
0084     case MessageAttachmentDownloadAndSaveJob::AttachmentType::Sound:
0085         progressDialog->setWindowTitle(i18nc("@title:window", "Download Sound"));
0086         progressDialog->setLabelText(i18n("Download Sound..."));
0087         break;
0088     }
0089 }
0090 
0091 void MessageAttachmentDownloadAndSaveJob::slotDownloadCancel()
0092 {
0093     if (mProgressDialogBox) {
0094         mProgressDialogBox->hide();
0095         mProgressDialogBox->deleteLater();
0096     }
0097     deleteLater();
0098 }
0099 
0100 void MessageAttachmentDownloadAndSaveJob::start()
0101 {
0102     if (!canStart()) {
0103         qCWarning(RUQOLAWIDGETS_LOG) << "Attachment url empty";
0104         deleteLater();
0105         return;
0106     }
0107     if (!mRocketChatAccount) {
0108         qCWarning(RUQOLAWIDGETS_LOG) << "mRocketChatAccount is empty. It's a bug";
0109         deleteLater();
0110         return;
0111     }
0112 
0113     if (mInfo.needToDownloadAttachment) {
0114         if (mRocketChatAccount) {
0115             mProgressDialogBox = new QProgressDialog(mInfo.parentWidget);
0116             assignProgressDialogStr(mProgressDialogBox);
0117             mProgressDialogBox->reset();
0118             mProgressDialogBox->setRange(0, 0);
0119             mProgressDialogBox->setValue(0);
0120             mProgressDialogBox->setModal(true);
0121             mProgressDialogBox->setAutoClose(false);
0122             mProgressDialogBox->setAutoReset(false);
0123             mProgressDialogBox->setMinimumDuration(0);
0124             connect(mProgressDialogBox, &QProgressDialog::canceled, this, &MessageAttachmentDownloadAndSaveJob::slotDownloadCancel);
0125             connect(mRocketChatAccount, &RocketChatAccount::fileDownloaded, this, &MessageAttachmentDownloadAndSaveJob::slotFileDownloaded);
0126             (void)mRocketChatAccount->attachmentUrlFromLocalCache(mInfo.attachmentPath);
0127         }
0128     } else {
0129         Q_EMIT downloadDone(mRocketChatAccount->attachmentUrlFromLocalCache(mInfo.attachmentPath).toLocalFile());
0130     }
0131 }
0132 
0133 RocketChatAccount *MessageAttachmentDownloadAndSaveJob::rocketChatAccount() const
0134 {
0135     return mRocketChatAccount;
0136 }
0137 
0138 void MessageAttachmentDownloadAndSaveJob::setRocketChatAccount(RocketChatAccount *newRocketChatAccount)
0139 {
0140     mRocketChatAccount = newRocketChatAccount;
0141 }
0142 
0143 MessageAttachmentDownloadAndSaveJob::MessageAttachmentDownloadJobInfo MessageAttachmentDownloadAndSaveJob::info() const
0144 {
0145     return mInfo;
0146 }
0147 
0148 void MessageAttachmentDownloadAndSaveJob::setInfo(const MessageAttachmentDownloadJobInfo &newInfo)
0149 {
0150     mInfo = newInfo;
0151 }
0152 
0153 bool MessageAttachmentDownloadAndSaveJob::MessageAttachmentDownloadJobInfo::isValid() const
0154 {
0155     if (attachmentType == MessageAttachmentDownloadAndSaveJob::AttachmentType::Unknown) {
0156         qCWarning(RUQOLAWIDGETS_LOG) << "Attachment type not defined";
0157         return false;
0158     }
0159     return !attachmentPath.isEmpty();
0160 }
0161 
0162 #include "moc_messageattachmentdownloadandsavejob.cpp"