summaryrefslogtreecommitdiffstats
path: root/rbutil
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2008-04-06 18:12:56 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2008-04-06 18:12:56 +0000
commitc3969ed4c58d9c153bb95f6f70ad94dff1887495 (patch)
tree0bb9e820c55f16c7b8aac4eddb553c7fb0261341 /rbutil
parent5076dca58e40fe0f70620f43ac6e43120038d3cb (diff)
downloadrockbox-c3969ed4c58d9c153bb95f6f70ad94dff1887495.tar.gz
rockbox-c3969ed4c58d9c153bb95f6f70ad94dff1887495.zip
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
Diffstat (limited to 'rbutil')
-rw-r--r--rbutil/rbutilqt/installzip.cpp15
-rw-r--r--rbutil/rbutilqt/rbunzip.cpp48
-rw-r--r--rbutil/rbutilqt/rbunzip.h44
-rw-r--r--rbutil/rbutilqt/rbutilqt.pro6
4 files changed, 107 insertions, 6 deletions
diff --git a/rbutil/rbutilqt/installzip.cpp b/rbutil/rbutilqt/installzip.cpp
index ae9cabdc24..6514c6d13d 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 0000000000..85d175c63d
--- /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 <QtCore>
+
+
+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 0000000000..074d145a97
--- /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 <QtCore>
+#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 1aa1c58a27..1485f4d8a9 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