/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include "extractordialog.h" //Well, f**king doc of QProcess... The extraction has to be a Thread, otherwise GUI will block ExtractorDialog::ExtractorDialog(const QString &archive, const QString &extractTo, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f), mArchive(archive), mExtractTo(extractTo){ QVBoxLayout *mainLayout = new QVBoxLayout; mOutput = new QTextEdit; mOutput->setReadOnly(true); mCancelClose = new QPushButton(tr("Close")); connect(mCancelClose, SIGNAL(clicked()), this, SLOT(accept())); mainLayout->addWidget(mOutput); mainLayout->addWidget(mCancelClose); setLayout(mainLayout); mExtractor = new QProcess(this); connect(mExtractor, SIGNAL(started()), this, SLOT(extractionStarted())); connect(mExtractor, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(extractionFinished())); //connect(mExtractor, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(processStatusChanged(QProcess::ProcessState))); QString wTitle = QString(tr("%1 - extracting from %2")).arg(qApp->applicationName()).arg(archive); setWindowTitle(wTitle); start(); qDebug() << "state" << mExtractor->state(); } void ExtractorDialog::processStatusChanged(QProcess::ProcessState newState){ qDebug() << "State changed to" << newState; if((newState == QProcess::Running) || (newState == QProcess::Starting)){ mCancelClose->disconnect(SIGNAL(clicked())); connect(mCancelClose, SIGNAL(clicked()), this, SLOT(killProcess())); mCancelClose->setText(tr("Cancel")); } if(newState == QProcess::NotRunning){ mCancelClose->disconnect(SIGNAL(clicked())); connect(mCancelClose, SIGNAL(clicked()), this, SLOT(accept())); mCancelClose->setText(tr("Close")); } } void ExtractorDialog::extractionStarted(){ mCancelClose->disconnect(SIGNAL(clicked())); connect(mCancelClose, SIGNAL(clicked()), this, SLOT(killProcess())); mCancelClose->setText(tr("Cancel")); } void ExtractorDialog::extractionFinished(){ mCancelClose->disconnect(SIGNAL(clicked())); connect(mCancelClose, SIGNAL(clicked()), this, SLOT(accept())); mCancelClose->setText(tr("Close")); } void ExtractorDialog::killProcess(){ mExtractor->terminate(); mCancelClose->disconnect(SIGNAL(clicked())); connect(mCancelClose, SIGNAL(clicked()), this, SLOT(accept())); mCancelClose->setText(tr("Close")); } void ExtractorDialog::writeOutput(){ qDebug() << "writing" << mExtractor->state(); QByteArray output = mExtractor->read(mExtractor->bytesAvailable()); mOutput->append(output); } void ExtractorDialog::start(){ QSettings s; QString exe = s.value("paths/archiver").toString(); if(exe.isEmpty()){ mOutput->append(tr("No archive program configured!")); return; } QFileInfo info(exe); if(!info.exists() || !info.isExecutable()){ QString msg = QString(tr("Unable to call %1")).arg(exe); mOutput->append(msg); return; } QStringList args = s.value("paths/archiverargs").toStringList(); args << mArchive; mExtractor = new QProcess(this); mExtractor->setWorkingDirectory(mExtractTo); connect(mExtractor, SIGNAL(readyRead()), this, SLOT(writeOutput())); QString startmessage = QString("Starting %1 %2\n").arg(exe).arg(args.join(" ")); mOutput->append(startmessage); mExtractor->start(exe, args); mExtractor->waitForStarted(); }