From c876d3bbefe0dc00c27ca0c12d29da5874946962 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Wed, 15 Dec 2021 21:04:28 +0100 Subject: rbutil: Merge rbutil with utils folder. rbutil uses several components from the utils folder, and can be considered part of utils too. Having it in a separate folder is an arbitrary split that doesn't help anymore these days, so merge them. This also allows other utils to easily use libtools.make without the need to navigate to a different folder. Change-Id: I3fc2f4de19e3e776553efb5dea5f779dfec0dc21 --- utils/rbutilqt/gui/backupdialog.cpp | 152 ++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 utils/rbutilqt/gui/backupdialog.cpp (limited to 'utils/rbutilqt/gui/backupdialog.cpp') diff --git a/utils/rbutilqt/gui/backupdialog.cpp b/utils/rbutilqt/gui/backupdialog.cpp new file mode 100644 index 0000000000..f12c47b570 --- /dev/null +++ b/utils/rbutilqt/gui/backupdialog.cpp @@ -0,0 +1,152 @@ +/*************************************************************************** + * __________ __ ___. + * 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 +#include +#include +#include +#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(); +} + -- cgit v1.2.3