File indexing completed on 2024-06-02 05:05:36

0001 /*
0002     SPDX-FileCopyrightText: 2009 Joris Guisson <joris.guisson@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "decompressfilejob.h"
0008 
0009 #include <QFile>
0010 #include <QMimeDatabase>
0011 
0012 #include <KCompressionDevice>
0013 #include <KIO/Global>
0014 
0015 #include <util/fileops.h>
0016 #include <util/log.h>
0017 
0018 namespace bt
0019 {
0020 DecompressThread::DecompressThread(const QString &file, const QString &dest_file)
0021     : file(file)
0022     , dest_file(dest_file)
0023     , canceled(false)
0024     , err(0)
0025 {
0026 }
0027 
0028 DecompressThread::~DecompressThread()
0029 {
0030 }
0031 
0032 void DecompressThread::run()
0033 {
0034     QFile out(dest_file);
0035 
0036     // open input file readonly
0037     if (!out.open(QIODevice::WriteOnly)) {
0038         err = KIO::ERR_CANNOT_OPEN_FOR_WRITING;
0039         Out(SYS_GEN | LOG_NOTICE) << "Failed to open " << dest_file << " : " << out.errorString() << endl;
0040         return;
0041     }
0042 
0043     // open output file
0044     KCompressionDevice dev(file, KCompressionDevice::compressionTypeForMimeType(QMimeDatabase().mimeTypeForFile(file).name()));
0045     if (!dev.open(QIODevice::ReadOnly)) {
0046         err = KIO::ERR_CANNOT_OPEN_FOR_READING;
0047         Out(SYS_GEN | LOG_NOTICE) << "Failed to open " << file << " : " << dev.errorString() << endl;
0048         return;
0049     }
0050 
0051     // copy the data
0052     char buf[4096];
0053     while (!canceled && !dev.atEnd()) {
0054         int len = dev.read(buf, 4096);
0055         if (len <= 0 || len > 4096)
0056             break;
0057 
0058         out.write(buf, len);
0059     }
0060 
0061     out.close();
0062     if (canceled) {
0063         // delete output file when canceled
0064         bt::Delete(dest_file, true);
0065     } else {
0066         // delete the input file upon success
0067         bt::Delete(file, true);
0068     }
0069 }
0070 
0071 void DecompressThread::cancel()
0072 {
0073     canceled = true;
0074 }
0075 
0076 ///////////////////////////////////////////
0077 
0078 DecompressFileJob::DecompressFileJob(const QString &file, const QString &dest)
0079     : file(file)
0080     , dest(dest)
0081     , decompress_thread(nullptr)
0082 {
0083 }
0084 
0085 DecompressFileJob::~DecompressFileJob()
0086 {
0087 }
0088 
0089 void DecompressFileJob::start()
0090 {
0091     decompress_thread = new DecompressThread(file, dest);
0092     connect(decompress_thread, &DecompressThread::finished, this, &DecompressFileJob::decompressThreadFinished, Qt::QueuedConnection);
0093     decompress_thread->start();
0094 }
0095 
0096 void DecompressFileJob::kill(bool quietly)
0097 {
0098     if (decompress_thread) {
0099         decompress_thread->cancel();
0100         decompress_thread->wait();
0101         delete decompress_thread;
0102         decompress_thread = nullptr;
0103     }
0104     setError(KIO::ERR_USER_CANCELED);
0105     if (!quietly)
0106         emitResult();
0107 }
0108 
0109 void DecompressFileJob::decompressThreadFinished()
0110 {
0111     setError(decompress_thread->error());
0112     decompress_thread->wait();
0113     delete decompress_thread;
0114     decompress_thread = nullptr;
0115     emitResult();
0116 }
0117 
0118 }
0119 
0120 #include "moc_decompressfilejob.cpp"