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:
parent
5076dca58e
commit
c3969ed4c5
4 changed files with 107 additions and 6 deletions
|
@ -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;
|
||||
}
|
||||
|
|
48
rbutil/rbutilqt/rbunzip.cpp
Normal file
48
rbutil/rbutilqt/rbunzip.cpp
Normal 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
44
rbutil/rbutilqt/rbunzip.h
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue