From 0870216c754a7ec5e91e9f77ef7b8efed2b8b67c Mon Sep 17 00:00:00 2001 From: benmeyer Date: Thu, 05 Sep 2002 20:08:55 +0000 Subject: initial addition of backup --- diff --git a/noncore/settings/backup/backuprestore.cpp b/noncore/settings/backup/backuprestore.cpp new file mode 100644 index 0000000..5776f3c --- a/dev/null +++ b/noncore/settings/backup/backuprestore.cpp @@ -0,0 +1,274 @@ +#include "backuprestore.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define HEADER_NAME 0 +#define HEADER_BACKUP 1 +#define BACKUP_LOCATION 2 + +#define EXTENSION ".bck" + +BackupAndRestore::BackupAndRestore( QWidget* parent, const char* name) : BackupAndRestoreBase(parent, name){ + this->showMaximized(); + backupList->header()->hide(); + restoreList->header()->hide(); + connect(backupButton, SIGNAL(clicked()), this, SLOT(backupPressed())); + connect(restoreButton, SIGNAL(clicked()), this, SLOT(restore())); + connect(backupList, SIGNAL(clicked( QListViewItem * )), this, SLOT(selectItem(QListViewItem*))); + connect(restoreSource, SIGNAL(activated( int )), this, SLOT(sourceDirChanged(int))); + + systemSettings = new QListViewItem(backupList, "System Settings", "", "/home/etc"); + selectItem(systemSettings); + applicationSettings = new QListViewItem(backupList, "Application Settings", "", QDir::homeDirPath() + "/Settings/"); + selectItem(applicationSettings); + documents= new QListViewItem(backupList, "Documents", "", QDir::homeDirPath() + "/Documents/"); + selectItem(documents); + + scanForApplicationSettings(); + + Config config("BackupAndRestore"); + config.setGroup("General"); + int totalLocations = config.readNumEntry("totalLocations",0); + + if(totalLocations == 0){ + backupLocations.insert("Documents", "/home/root/Documents"); + backupLocations.insert("CF", "/mnt/cf"); + backupLocations.insert("SD", "/mnt/card"); + } + else{ + for(int i = 0; i < totalLocations; i++){ + backupLocations.insert(config.readEntry(QString("backupLocationName_%1").arg(i)), config.readEntry(QString("backupLocation_%1").arg(i))); + } + } + QMap::Iterator it; + for( it = backupLocations.begin(); it != backupLocations.end(); ++it ){ + storeToLocation->insertItem(it.key()); + restoreSource->insertItem(it.key()); + } + + // Read the list of items to ignore. + QList dontBackupList; + dontBackupList.setAutoDelete(true); + config.setGroup("DontBackup"); + int total = config.readNumEntry("Total", 0); + for(int i = 0; i < total; i++){ + dontBackupList.append(new QString(config.readEntry(QString("%1").arg(i), ""))); + } + + QList list; + getAllItems(backupList->firstChild(), list); + + for(uint i = 0; i < list.count(); i++){ + QString text = list.at(i)->text(HEADER_NAME); + for(uint i2 = 0; i2 < dontBackupList.count(); i2++){ + if(*dontBackupList.at(i2) == text){ + selectItem(list.at(i)); + break; + } + } + } +} + +BackupAndRestore::~BackupAndRestore(){ + QList list; + getAllItems(backupList->firstChild(), list); + + Config config("BackupAndRestore"); + config.setGroup("DontBackup"); + config.clearGroup(); + + int count = 0; + for(uint i = 0; i < list.count(); i++){ + if(list.at(i)->text(HEADER_BACKUP) == ""){ + config.writeEntry(QString("%1").arg(count), list.at(i)->text(HEADER_NAME)); + count++; + } + } + config.writeEntry("Total", count); +} + +QList BackupAndRestore::getAllItems(QListViewItem *item, QList &list){ + while(item){ + if(item->childCount() > 0) + getAllItems(item->firstChild(), list); + list.append(item); + item = item->nextSibling(); + } + return list; +} + +/** + * Selects and unselects the item by setting the HEADER_BACKUP to B or !. + * and changing the icon to match + * @param currentItem the item to swich the selection choice. + */ +void BackupAndRestore::selectItem(QListViewItem *currentItem){ + if(!currentItem) + return; + + if(currentItem->text(HEADER_BACKUP) == "B"){ + currentItem->setPixmap(HEADER_NAME, Resource::loadPixmap("null")); + currentItem->setText(HEADER_BACKUP, ""); + } + else{ + currentItem->setPixmap(HEADER_NAME, Resource::loadPixmap("check")); + currentItem->setText(HEADER_BACKUP, "B"); + } +} + +void BackupAndRestore::scanForApplicationSettings(){ + QDir d(applicationSettings->text(BACKUP_LOCATION)); + d.setFilter( QDir::Files | QDir::NoSymLinks ); + const QFileInfoList *list = d.entryInfoList(); + QFileInfoListIterator it( *list ); + QFileInfo *fi; + while ( (fi=it.current()) ) { + //qDebug((d.path()+fi->fileName()).latin1()); + QListViewItem *newItem = new QListViewItem(applicationSettings, fi->fileName()); + selectItem(newItem); + ++it; + } +} + +/** + * The "Backup" button has been pressed. Get a list of all of the files that + * should be backed up. If there are no files, emit and error and exit. + * Determine the file name to store the backup in. Backup the file(s) using + * tar and gzip --best. Report failure or success + */ +void BackupAndRestore::backupPressed(){ + QString backupFiles; + if(getBackupFiles(backupFiles, NULL) == 0){ + QMessageBox::critical(this, "Message", "No items selected.",QString("Ok") ); + return; + } + + QString outputFile = backupLocations[storeToLocation->currentText()]; + + QDateTime time = QDateTime::currentDateTime(); + QString dateString = time.date().toString().replace(QRegExp(" "), ""); + outputFile += "/" + dateString; + + QString t = outputFile; + int c = 1; + while(QFile::exists(outputFile + EXTENSION)){ + outputFile = t + QString("%1").arg(c); + c++; + } + outputFile += EXTENSION; + + int r = system(QString("tar -c %1 | gzip --best > %2").arg(backupFiles).arg(outputFile).latin1()); + if(r != 0){ + QMessageBox::critical(this, "Message", "Backup Failed.",QString("Ok") ); + return; + } + else{ + QMessageBox::critical(this, "Message", "Backup Successfull.",QString("Ok") ); + } +} + +/*** + * Get a list of all of the files to backup. + */ +int BackupAndRestore::getBackupFiles(QString &backupFiles, QListViewItem *parent){ + QListViewItem * currentItem; + QString currentHome; + if(!parent) + currentItem = backupList->firstChild(); + else{ + currentItem = parent->firstChild(); + currentHome = parent->text(BACKUP_LOCATION); + } + + uint count = 0; + while( currentItem != 0 ){ + if(currentItem->text(HEADER_BACKUP) == "B" ){ + if(currentItem->childCount() == 0 ){ + if(parent == NULL) + backupFiles += currentItem->text(BACKUP_LOCATION); + else + backupFiles += currentHome + currentItem->text(HEADER_NAME); + backupFiles += " "; + count++; + } + else{ + count += getBackupFiles(backupFiles, currentItem); + } + } + currentItem = currentItem->nextSibling(); + } + return count; +} + +void BackupAndRestore::sourceDirChanged(int selection){ + restoreList->clear(); + rescanFolder(backupLocations[restoreSource->text(selection)]); +} + +/** + * Scans directory for any backup files. Will recursivly go down, + * but will not follow symlinks. + * @param directory - the directory to look in. + */ +void BackupAndRestore::rescanFolder(QString directory){ + //qDebug(QString("rescanFolder: ") + directory.latin1()); + QDir d(directory); + if(!d.exists()) + return; + + d.setFilter( QDir::Files | QDir::Hidden | QDir::Dirs); + const QFileInfoList *list = d.entryInfoList(); + QFileInfoListIterator it( *list ); + QFileInfo *file; + while ( (file=it.current()) ) { // for each file... + // If it is a dir and not .. or . then add it as a tab and go down. + if(file->isDir()){ + if(file->fileName() != ".." && file->fileName() != ".") { + rescanFolder(directory + "/" + file->fileName()); + } + } + else{ + // If it is a backup file add to list. + if(file->fileName().contains(EXTENSION)) + (void)new QListViewItem(restoreList, file->fileName()); + } + ++it; + } +} + +/** + * Restore a backup file. + * Report errors or success + */ +void BackupAndRestore::restore(){ + QListViewItem *restoreItem = restoreList->currentItem(); + if(!restoreItem){ + QMessageBox::critical(this, "Message", "Please select something to restore.",QString("Ok") ); + return; + } + QString restoreFile = backupLocations[restoreSource->currentText()]; + + restoreFile += "/" + restoreItem->text(0); + + int r = system(QString("tar -C / -zxf %1").arg(restoreFile).latin1()); + if(r != 0){ + QMessageBox::critical(this, "Message", "Restore Failed.",QString("Ok") ); + } + else{ + QMessageBox::critical(this, "Message", "Restore Successfull.",QString("Ok") ); + } +} + +// backuprestore.cpp + diff --git a/noncore/settings/backup/backuprestore.h b/noncore/settings/backup/backuprestore.h new file mode 100644 index 0000000..b0cf4cd --- a/dev/null +++ b/noncore/settings/backup/backuprestore.h @@ -0,0 +1,42 @@ +#ifndef WINDOW_H +#define WINDOW_H + +#include +#include "backuprestorebase.h" +#include +#include + +class QListViewItem; + +class BackupAndRestore : public BackupAndRestoreBase { + +Q_OBJECT + +public: + BackupAndRestore( QWidget* parent = 0, const char* name = 0); + ~BackupAndRestore(); + + +private slots: + void backupPressed(); + void restore(); + void selectItem(QListViewItem *currentItem); + void sourceDirChanged(int); + void rescanFolder(QString directory); + +private: + void scanForApplicationSettings(); + int getBackupFiles(QString &backupFiles, QListViewItem *parent); + QMap backupLocations; + QList getAllItems(QListViewItem *item, QList &list); + + QListViewItem *systemSettings; + QListViewItem *applicationSettings; + QListViewItem *documents; + +}; + +#endif + +// backuprestore.h + diff --git a/noncore/settings/backup/backuprestore.pro b/noncore/settings/backup/backuprestore.pro new file mode 100644 index 0000000..9498df3 --- a/dev/null +++ b/noncore/settings/backup/backuprestore.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +#CONFIG = qt warn_on debug +CONFIG = qt warn_on release +HEADERS = backuprestore.h +SOURCES = main.cpp backuprestore.cpp +INCLUDEPATH += $(QPEDIR)/include +DEPENDPATH += $(QPEDIR)/include +LIBS += -lqpe +INTERFACES = backuprestorebase.ui +TARGET = backupandrestore diff --git a/noncore/settings/backup/backuprestorebase.ui b/noncore/settings/backup/backuprestorebase.ui new file mode 100644 index 0000000..92e37ee --- a/dev/null +++ b/noncore/settings/backup/backuprestorebase.ui @@ -0,0 +1,221 @@ + +BackupAndRestoreBase + + QWidget + + name + BackupAndRestoreBase + + + geometry + + 0 + 0 + 234 + 216 + + + + caption + Backup And Restore + + + layoutMargin + + + + margin + 0 + + + spacing + 6 + + + QTabWidget + + name + tabWidget + + + QWidget + + name + Widget2 + + + title + Backup + + + + margin + 11 + + + spacing + 6 + + + QListView + + + text + Applications + + + clickable + true + + + resizeable + true + + + + name + backupList + + + allColumnsShowFocus + true + + + rootIsDecorated + true + + + + QComboBox + + name + storeToLocation + + + + QLabel + + name + TextLabel1 + + + text + Save To + + + + + name + Spacer1 + + + orientation + Horizontal + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + QPushButton + + name + backupButton + + + text + &Backup + + + + + + QWidget + + name + Widget3 + + + title + Restore + + + + margin + 11 + + + spacing + 6 + + + QComboBox + + name + restoreSource + + + + QLabel + + name + TextLabel1_2 + + + text + Select Source + + + + QListView + + + text + Column 1 + + + clickable + true + + + resizeable + true + + + + name + restoreList + + + minimumSize + + 0 + 100 + + + + + QPushButton + + name + restoreButton + + + text + &Restore + + + + + + + + diff --git a/noncore/settings/backup/check.png b/noncore/settings/backup/check.png new file mode 100644 index 0000000..2890a7a --- a/dev/null +++ b/noncore/settings/backup/check.png Binary files differ diff --git a/noncore/settings/backup/main.cpp b/noncore/settings/backup/main.cpp new file mode 100644 index 0000000..7e36741 --- a/dev/null +++ b/noncore/settings/backup/main.cpp @@ -0,0 +1,14 @@ +#include "backuprestore.h" +#include "qnetworkprotocol.h" +#include + +int main(int argc, char *argv[]) { + QPEApplication a( argc, argv ); + + BackupAndRestore app(0, "mainwindow"); + app.show(); + return a.exec(); +} + +// main.cpp + diff --git a/noncore/settings/backup/null.png b/noncore/settings/backup/null.png new file mode 100644 index 0000000..b67dcc6 --- a/dev/null +++ b/noncore/settings/backup/null.png Binary files differ -- cgit v0.9.0.2