File indexing completed on 2024-04-28 15:39:19
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 }