summaryrefslogtreecommitdiffstats
path: root/rbutil/rbutilqt/gui/backupdialog.cpp
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2012-06-26 00:24:58 +0200
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2012-06-26 18:30:27 +0200
commit362f447ede988023951f85f86dc3e7c609fd5014 (patch)
treecf26486dc8f62a25590a88e87f40e62645e5a5e0 /rbutil/rbutilqt/gui/backupdialog.cpp
parent8cc46fb01cc86c25e580400b6c2d6cc38665843d (diff)
downloadrockbox-362f447ede988023951f85f86dc3e7c609fd5014.tar.gz
rockbox-362f447ede988023951f85f86dc3e7c609fd5014.zip
Create dedicated backup dialog.
The "Installation" dialog allows backing up the current installation by creating a zip file from the .rockbox folder since quite a while. However, this has the drawback that you need to update your build to create a backup, but creating a backup might be desireable in other cases as well (before updating themes, or just for backup reasons). Since the functionality is somewhat hidden it's also not obvious to users such a functionality exists (most users are likely to use the "Quick Start" instead). Implement backup functionality as dedicated dialog placed on the Uninstall tab. Rename the Uninstall tab to accommodate this. Change-Id: I1d2c6c8f646672d1b66bb442408fbfc2eeec700d
Diffstat (limited to 'rbutil/rbutilqt/gui/backupdialog.cpp')
-rw-r--r--rbutil/rbutilqt/gui/backupdialog.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/rbutil/rbutilqt/gui/backupdialog.cpp b/rbutil/rbutilqt/gui/backupdialog.cpp
new file mode 100644
index 0000000000..5d04b322ed
--- /dev/null
+++ b/rbutil/rbutilqt/gui/backupdialog.cpp
@@ -0,0 +1,141 @@
+/***************************************************************************
+ * __________ __ ___.
+ * 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 <QtGui>
+#include "backupdialog.h"
+#include "ui_backupdialogfrm.h"
+#include "rbsettings.h"
+#include "progressloggergui.h"
+#include "ziputil.h"
+#include "rockboxinfo.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)
+{
+ qDebug() << "BackupSizeThread] Thread started, calculating" << m_path;
+ m_currentSize = 0;
+
+ QDirIterator it(m_path, QDirIterator::Subdirectories);
+ while(it.hasNext()) {
+ m_currentSize += QFileInfo(it.next()).size();
+ }
+ qDebug() << "[BackupSizeThread] 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)
+{
+ 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();
+}
+