summaryrefslogtreecommitdiffstats
path: root/rbutil/rbutilqt/gui/backupdialog.cpp
diff options
context:
space:
mode:
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();
+}
+