rockbox/rbutil/rbutilqt/gui/backupdialog.cpp
Dominik Riebeling 4d2ce949b3 Use cutelogger for Rockbox Utility internal trace.
Change tracing from qDebug() to use cutelogger, which is available under the
LGPL2.1. This allows to automatically add filename and line number to the log,
and also provides multiple log levels.

Change-Id: I5dbdaf902ba54ea99f07ae10a07467c52fdac910
2013-11-04 23:32:52 +01:00

152 lines
4.8 KiB
C++

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2012 by Dominik Riebeling
*
* 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 <QThread>
#include <QDialog>
#include <QMessageBox>
#include <QFileDialog>
#include "backupdialog.h"
#include "ui_backupdialogfrm.h"
#include "rbsettings.h"
#include "progressloggergui.h"
#include "ziputil.h"
#include "rockboxinfo.h"
#include "Logger.h"
class BackupSizeThread : public QThread
{
public:
void run(void);
void setPath(QString p) { m_path = p; }
qint64 currentSize(void) { return m_currentSize; }
private:
QString m_path;
qint64 m_currentSize;
};
void BackupSizeThread::run(void)
{
LOG_INFO() << "Thread started, calculating" << m_path;
m_currentSize = 0;
QDirIterator it(m_path, QDirIterator::Subdirectories);
while(it.hasNext()) {
m_currentSize += QFileInfo(it.next()).size();
}
LOG_INFO() << "Thread done, sum:" << m_currentSize;
}
BackupDialog::BackupDialog(QWidget* parent) : QDialog(parent)
{
ui.setupUi(this);
m_thread = new BackupSizeThread();
connect(m_thread, SIGNAL(finished()), this, SLOT(updateSizeInfo()));
connect(m_thread, SIGNAL(terminated()), this, SLOT(updateSizeInfo()));
connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(close()));
connect(ui.buttonCancel, SIGNAL(clicked()), m_thread, SLOT(quit()));
connect(ui.buttonChange, SIGNAL(clicked()), this, SLOT(changeBackupPath()));
connect(ui.buttonBackup, SIGNAL(clicked()), this, SLOT(backup()));
ui.backupSize->setText(tr("Installation size: calculating ..."));
m_mountpoint = RbSettings::value(RbSettings::Mountpoint).toString();
m_backupName = RbSettings::value(RbSettings::BackupPath).toString();
if(m_backupName.isEmpty()) {
m_backupName = m_mountpoint;
}
RockboxInfo info(m_mountpoint);
m_backupName += "/.backup/rockbox-backup-" + info.version() + ".zip";
ui.backupLocation->setText(QDir::toNativeSeparators(m_backupName));
m_thread->setPath(m_mountpoint + "/.rockbox");
m_thread->start();
}
void BackupDialog::changeBackupPath(void)
{
QString backupString = QFileDialog::getSaveFileName(this,
tr("Select Backup Filename"), m_backupName, "*.zip");
// only update if a filename was entered, ignore if cancelled
if(!backupString.isEmpty()) {
m_backupName = backupString;
ui.backupLocation->setText(QDir::toNativeSeparators(m_backupName));
RbSettings::setValue(RbSettings::BackupPath, QFileInfo(m_backupName).absolutePath());
}
}
void BackupDialog::updateSizeInfo(void)
{
double size = m_thread->currentSize() / (1024 * 1024);
QString unit = "MiB";
if(size > 1024) {
size /= 1024;
unit = "GiB";
}
ui.backupSize->setText(tr("Installation size: %L1 %2").arg(size, 0, 'g', 4).arg(unit));
}
void BackupDialog::backup(void)
{
if(QFileInfo(m_backupName).isFile()) {
if(QMessageBox::warning(this, tr("File exists"),
tr("The selected backup file already exists. Overwrite?"),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) {
return;
}
}
m_logger = new ProgressLoggerGui(this);
connect(m_logger, SIGNAL(closed()), this, SLOT(close()));
m_logger->show();
m_logger->addItem(tr("Starting backup ..."),LOGINFO);
QCoreApplication::processEvents();
// create dir, if it doesnt exist
QFileInfo backupFile(m_backupName);
if(!QDir(backupFile.path()).exists())
{
QDir a;
a.mkpath(backupFile.path());
}
// create backup
ZipUtil zip(this);
connect(&zip, SIGNAL(logProgress(int, int)), m_logger, SLOT(setProgress(int, int)));
connect(&zip, SIGNAL(logItem(QString, int)), m_logger, SLOT(addItem(QString, int)));
zip.open(m_backupName, QuaZip::mdCreate);
QString mp = m_mountpoint + "/.rockbox";
if(zip.appendDirToArchive(mp, m_mountpoint)) {
m_logger->addItem(tr("Backup successful."), LOGINFO);
}
else {
m_logger->addItem(tr("Backup failed!"), LOGERROR);
}
zip.close();
m_logger->setFinished();
}