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"