File indexing completed on 2024-04-28 04:20:04

0001 /*
0002     SPDX-FileCopyrightText: 2022 Friedrich W. H. Kossebau <kossebau@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "loadimagejob.hpp"
0008 
0009 // oww
0010 #include "readimagefilerunner.hpp"
0011 #include "imagereadresult.hpp"
0012 // KF
0013 #include <KIO/FileCopyJob>
0014 #include <KLocalizedString>
0015 // Qt
0016 #include <QTemporaryFile>
0017 #include <QThreadPool>
0018 
0019 namespace Kodaskanna
0020 {
0021 
0022 namespace ImageSource
0023 {
0024 
0025 LoadImageJob::LoadImageJob(const QUrl &fileUrl)
0026     : m_fileUrl(fileUrl)
0027 {
0028 }
0029 
0030 LoadImageJob::~LoadImageJob()
0031 {
0032     if (m_fileCopyJob) {
0033         m_fileCopyJob->kill();
0034     }
0035 }
0036 
0037 void LoadImageJob::start()
0038 {
0039     if (m_fileUrl.isLocalFile()) {
0040         startFileReading(m_fileUrl.toLocalFile());
0041         return;
0042     }
0043 
0044     // create a unique temporary file we use for the download
0045     m_tmpFile = new QTemporaryFile(this);
0046     m_tmpFile->open();
0047 
0048     m_fileCopyJob = KIO::file_copy(m_fileUrl, QUrl::fromLocalFile(m_tmpFile->fileName()), -1, KIO::Overwrite);
0049 
0050     connect(m_fileCopyJob, &KJob::finished, this, &LoadImageJob::handleFileCopyFinished);
0051     m_fileCopyJob->start();
0052 }
0053 
0054 QImage LoadImageJob::image() const
0055 {
0056     return m_image;
0057 }
0058 
0059 void LoadImageJob::startFileReading(const QString &localFileName)
0060 {
0061     auto *loadImageRunner = new ReadImageFileRunner(localFileName);
0062     qRegisterMetaType<Kodaskanna::ImageSource::ImageReadResult>();
0063     connect(loadImageRunner, &ReadImageFileRunner::readFinished, this, &LoadImageJob::handleReadFinished);
0064 
0065     QThreadPool::globalInstance()->start(loadImageRunner);
0066 }
0067 
0068 void LoadImageJob::handleFileCopyFinished(KJob *job)
0069 {
0070     m_fileCopyJob = nullptr;
0071 
0072     if (job->error() != 0) {
0073         setError(job->error());
0074         setErrorText(job->errorText());
0075         emitResult();
0076         return;
0077     }
0078 
0079     startFileReading(m_tmpFile->fileName());
0080 }
0081 
0082 void LoadImageJob::handleReadFinished(const ImageReadResult &imageReadResult)
0083 {
0084     if (imageReadResult.isSuccess()) {
0085         m_image = imageReadResult.image();
0086     } else {
0087         setError(KJob::UserDefinedError);
0088         setErrorText(i18n("Could not load image from file %1.", m_fileUrl.toDisplayString()));
0089     }
0090 
0091     emitResult();
0092 }
0093 
0094 }
0095 }