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 "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;
|
||||||
}
|
}
|
||||||
|
|
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 \
|
../../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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue