1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Dominik Riebeling 2008-04-06 18:12:56 +00:00
parent 5076dca58e
commit c3969ed4c5
4 changed files with 107 additions and 6 deletions

View file

@ -18,9 +18,8 @@
****************************************************************************/ ****************************************************************************/
#include "installzip.h" #include "installzip.h"
#include "rbunzip.h"
#include "zip/zip.h"
#include "zip/unzip.h"
ZipInstaller::ZipInstaller(QObject* parent): QObject(parent) ZipInstaller::ZipInstaller(QObject* parent): QObject(parent)
{ {
@ -135,21 +134,29 @@ void ZipInstaller::downloadDone(bool error)
qDebug() << "file to unzip: " << m_file; qDebug() << "file to unzip: " << m_file;
UnZip::ErrorCode ec; 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); ec = uz.openArchive(m_file);
if(ec != UnZip::Ok) { if(ec != UnZip::Ok) {
m_dp->addItem(tr("Opening archive failed: %1.") m_dp->addItem(tr("Opening archive failed: %1.")
.arg(uz.formatError(ec)),LOGERROR); .arg(uz.formatError(ec)),LOGERROR);
m_dp->setProgressMax(1);
m_dp->setProgressValue(1);
m_dp->abort(); m_dp->abort();
emit done(true); emit done(true);
return; return;
} }
ec = uz.extractAll(m_mountpoint); ec = uz.extractArchive(m_mountpoint);
// TODO: better handling of aborted unzip operation.
if(ec != UnZip::Ok) { if(ec != UnZip::Ok) {
m_dp->addItem(tr("Extracting failed: %1.") m_dp->addItem(tr("Extracting failed: %1.")
.arg(uz.formatError(ec)),LOGERROR); .arg(uz.formatError(ec)),LOGERROR);
m_dp->abort(); m_dp->abort();
m_dp->setProgressMax(1);
m_dp->setProgressValue(1);
emit done(true); emit done(true);
return; return;
} }

View file

@ -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;
}

44
rbutil/rbutilqt/rbunzip.h Normal file
View file

@ -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

View file

@ -55,7 +55,8 @@ SOURCES += rbutilqt.cpp \
../../tools/voicefont.c \ ../../tools/voicefont.c \
voicefile.cpp \ voicefile.cpp \
createvoicewindow.cpp \ createvoicewindow.cpp \
rbsettings.cpp rbsettings.cpp \
rbunzip.cpp
HEADERS += rbutilqt.h \ HEADERS += rbutilqt.h \
install.h \ install.h \
@ -100,7 +101,8 @@ HEADERS += rbutilqt.h \
../../tools/voicefont.h \ ../../tools/voicefont.h \
voicefile.h \ voicefile.h \
createvoicewindow.h \ createvoicewindow.h \
rbsettings.h rbsettings.h \
rbunzip.h
# Needed by QT on Win # Needed by QT on Win
INCLUDEPATH = . irivertools zip zlib ../ipodpatcher ../sansapatcher ../../tools/rbspeex ../../tools INCLUDEPATH = . irivertools zip zlib ../ipodpatcher ../sansapatcher ../../tools/rbspeex ../../tools