From 332cdf4695e5cb32527f40479710a13b09a63db5 Mon Sep 17 00:00:00 2001 From: bluebrother Date: Sun, 6 Apr 2008 18:12:56 +0000 Subject: [PATCH] create an UnZip derived class for zip file extraction to allow showing progress while unzipping. Makes the unzip process somewhat interruptable and the UI more responsible. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16993 a1c6a512-1295-4272-9138-f99709370657 --- rbutil/rbutilqt/installzip.cpp | 15 +++++++++---- rbutil/rbutilqt/rbunzip.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++ rbutil/rbutilqt/rbunzip.h | 44 ++++++++++++++++++++++++++++++++++++++ rbutil/rbutilqt/rbutilqt.pro | 6 ++++-- 4 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 rbutil/rbutilqt/rbunzip.cpp create mode 100644 rbutil/rbutilqt/rbunzip.h diff --git a/rbutil/rbutilqt/installzip.cpp b/rbutil/rbutilqt/installzip.cpp index ae9cabdc2..6514c6d13 100644 --- a/rbutil/rbutilqt/installzip.cpp +++ b/rbutil/rbutilqt/installzip.cpp @@ -18,9 +18,8 @@ ****************************************************************************/ #include "installzip.h" +#include "rbunzip.h" -#include "zip/zip.h" -#include "zip/unzip.h" ZipInstaller::ZipInstaller(QObject* parent): QObject(parent) { @@ -135,21 +134,29 @@ void ZipInstaller::downloadDone(bool error) qDebug() << "file to unzip: " << m_file; UnZip::ErrorCode ec; - UnZip uz; + RbUnZip uz; + connect(&uz, SIGNAL(unzipProgress(int, int)), this, SLOT(updateDataReadProgress(int, int))); + connect(m_dp, SIGNAL(aborted()), &uz, SLOT(abortUnzip())); ec = uz.openArchive(m_file); if(ec != UnZip::Ok) { m_dp->addItem(tr("Opening archive failed: %1.") .arg(uz.formatError(ec)),LOGERROR); + m_dp->setProgressMax(1); + m_dp->setProgressValue(1); m_dp->abort(); emit done(true); return; } - ec = uz.extractAll(m_mountpoint); + ec = uz.extractArchive(m_mountpoint); + // TODO: better handling of aborted unzip operation. if(ec != UnZip::Ok) { m_dp->addItem(tr("Extracting failed: %1.") .arg(uz.formatError(ec)),LOGERROR); m_dp->abort(); + m_dp->setProgressMax(1); + m_dp->setProgressValue(1); + emit done(true); return; } diff --git a/rbutil/rbutilqt/rbunzip.cpp b/rbutil/rbutilqt/rbunzip.cpp new file mode 100644 index 000000000..85d175c63 --- /dev/null +++ b/rbutil/rbutilqt/rbunzip.cpp @@ -0,0 +1,48 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2008 by Dominik Riebeling + * $Id$ + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "rbunzip.h" +#include + + +UnZip::ErrorCode RbUnZip::extractArchive(const QString& dest) +{ + QStringList files = this->fileList(); + UnZip::ErrorCode error; + m_abortunzip = false; + + int total = files.size(); + for(int i = 0; i < total; i++) { + qDebug() << __func__ << files.at(i); + error = this->extractFile(files.at(i), dest, UnZip::ExtractPaths); + emit unzipProgress(i, total); + QCoreApplication::processEvents(); // update UI + if(m_abortunzip) + error = SkipAll; + if(error != Ok) + break; + } + return error; +} + +void RbUnZip::abortUnzip(void) +{ + m_abortunzip = true; +} + diff --git a/rbutil/rbutilqt/rbunzip.h b/rbutil/rbutilqt/rbunzip.h new file mode 100644 index 000000000..074d145a9 --- /dev/null +++ b/rbutil/rbutilqt/rbunzip.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2008 by Dominik Riebeling + * $Id$ + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef RBUNZIP_H +#define RBUNZIP_H + +#include +#include "zip/unzip.h" +#include "zip/zip.h" + +class RbUnZip : public QObject, public UnZip +{ + Q_OBJECT + public: + UnZip::ErrorCode extractArchive(const QString&); + + signals: + void unzipProgress(int, int); + + public slots: + void abortUnzip(void); + + private: + bool m_abortunzip; +}; + +#endif + diff --git a/rbutil/rbutilqt/rbutilqt.pro b/rbutil/rbutilqt/rbutilqt.pro index 1aa1c58a2..1485f4d8a 100644 --- a/rbutil/rbutilqt/rbutilqt.pro +++ b/rbutil/rbutilqt/rbutilqt.pro @@ -55,7 +55,8 @@ SOURCES += rbutilqt.cpp \ ../../tools/voicefont.c \ voicefile.cpp \ createvoicewindow.cpp \ - rbsettings.cpp + rbsettings.cpp \ + rbunzip.cpp HEADERS += rbutilqt.h \ install.h \ @@ -100,7 +101,8 @@ HEADERS += rbutilqt.h \ ../../tools/voicefont.h \ voicefile.h \ createvoicewindow.h \ - rbsettings.h + rbsettings.h \ + rbunzip.h # Needed by QT on Win INCLUDEPATH = . irivertools zip zlib ../ipodpatcher ../sansapatcher ../../tools/rbspeex ../../tools -- 2.11.4.GIT