kde-extraapps/ark/app/batchextract.h
Ivailo Monev 3eb01a3ecd main: Stop leaking pointers when we do not enter the main app loop.
In the cases where we returned before calling KApplication::exec(), we
would end up leaking pointers such as |batchJob|, |window| and
|addToArchiveJob|.

Fix it by explicitly deleting |window| (since we do not have another
QWidget to make it a child of) and making |batchJob| and
|addToArchiveJob| be children of our main KApplication so that we do not
need to explicitly delete them under any circumstances.
2015-01-04 02:46:48 +00:00

234 lines
7.2 KiB
C++

/*
* ark -- archiver for the KDE project
*
* Copyright (C) 2008 Harald Hvaal <haraldhv@stud.ntnu.no>
* Copyright (C) 2009-2010 Raphael Kubo da Costa <rakuco@FreeBSD.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ( INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef BATCHEXTRACT_H
#define BATCHEXTRACT_H
#include <kcompositejob.h>
#include <KUrl>
#include <QtCore/QMap>
#include <QtCore/QPair>
#include <QtCore/QString>
#include <QtCore/QStringList>
namespace Kerfuffle
{
class Archive;
class Query;
}
/**
* This class schedules the extraction of all given compressed archives.
*
* Like AddToArchive, this class does not need the GUI to be active, and
* provides the functionality available from the --batch command-line option.
*
* @author Harald Hvaal <haraldhv@stud.ntnu.no>
*/
class BatchExtract : public KCompositeJob
{
Q_OBJECT
public:
/**
* Creates a new BatchExtract object.
*/
explicit BatchExtract(QObject* parent = 0);
/**
* Destroys a BatchExtract object.
*/
virtual ~BatchExtract();
/**
* Creates an ExtractJob for the given @p archive and puts it on the queue.
*
* If necessary, the destination directory for the archive is created.
*
* @param archive The archive that will be extracted.
*
* @see setAutoSubfolder
*/
void addExtraction(Kerfuffle::Archive* archive);
/**
* A wrapper that calls slotStartJob() when the event loop has started.
*/
void start();
/**
* Whether to automatically create a folder inside the destination
* directory if the archive has more than one directory or file
* at top level.
*
* @return @c true Create the subdirectory automatically.
* @return @c false Do not create the subdirectory automatically.
*/
bool autoSubfolder() const;
/**
* Set whether a folder should be created when necessary so
* the archive is extracted to it.
*
* If set to @c true, when the archive does not consist of a
* single folder with the other files and directories inside,
* a directory will be automatically created inside the destination
* directory and the archive will be extracted there.
*
* @param value Whether to create this directory automatically
* when needed.
*/
void setAutoSubfolder(bool value);
/**
* Adds a file to the list of files that will be extracted.
*
* @param url The file that will be added to the list.
*
* @return @c true The file exists and a suitable plugin
* could be found for it.
* @return @c false The file does not exist or a suitable
* plugin could not be found.
*/
bool addInput(const KUrl& url);
/**
* Shows the extract options dialog before extracting the files.
*
* @return @c true The user has set some options and clicked OK.
* @return @c false The user has canceled extraction.
*/
bool showExtractDialog();
/**
* Returns the destination directory where the archives
* will be extracted to.
*
* @return The destination directory. If no directory has been manually
* set with setDestinationFolder, QDir::currentPath() will be
* returned.
*/
QString destinationFolder() const;
/**
* Sets the directory the archives will be extracted to.
*
* If @c setSubfolder has been used, the final destination
* directory will be the concatenation of both.
*
* If @p folder does not exist, the current destination
* folder will not change.
*
* @param folder The directory that will be used.
*/
void setDestinationFolder(const QString& folder);
/**
* Returns whether the destination folder should
* be open after all archives are extracted.
*
* @return @c true Open the destination folder.
* @return @c false Do not open the destination folder.
*/
bool openDestinationAfterExtraction() const;
/**
* Whether to open the destination folder after
* all archives are extracted.
*
* @param value Whether to open the destination.
*/
void setOpenDestinationAfterExtraction(bool value);
/**
* Whether all files should be extracted to the same directory,
* even if they're in different directories in the archive.
*
* This is also known as "flat" extraction.
*
* @return @c true Paths should be preserved.
* @return @c false Paths should be ignored.
*/
bool preservePaths() const;
/**
* Sets whether paths should be preserved during extraction.
*
* When it is set to false, all files are extracted to a single
* directory, regardless of their hierarchy in the archive.
*
* @param value Whether to preserve paths.
*/
void setPreservePaths(bool value);
private slots:
/**
* Updates the percentage of the job that has been completed.
*/
void forwardProgress(KJob *job, unsigned long percent);
/**
* Shows a dialog with a list of all the files that could not
* be successfully extracted.
*/
void showFailedFiles();
/**
* Shows an error message if the current job hasn't finished
* successfully, and advances to the next extraction job if
* there are more.
*/
void slotResult(KJob *job);
/**
* Shows a query dialog, which may happen when a file already exists.
*/
void slotUserQuery(Kerfuffle::Query *query);
/**
* Does the real work for start() and extracts all scheduled files.
*
* Each extraction job is started after the last one finishes.
* The jobs are executed in the order they were added via addInput().
*/
void slotStartJob();
private:
int m_initialJobCount;
QMap<KJob*, QPair<QString, QString> > m_fileNames;
bool m_autoSubfolder;
QList<Kerfuffle::Archive*> m_inputs;
QString m_destinationFolder;
QStringList m_failedFiles;
bool m_preservePaths;
bool m_openDestinationAfterExtraction;
};
#endif // BATCHEXTRACT_H