-rw-r--r-- | noncore/settings/backup/backuprestore.cpp | 274 | ||||
-rw-r--r-- | noncore/settings/backup/backuprestore.h | 42 | ||||
-rw-r--r-- | noncore/settings/backup/backuprestore.pro | 10 | ||||
-rw-r--r-- | noncore/settings/backup/backuprestorebase.ui | 221 | ||||
-rw-r--r-- | noncore/settings/backup/check.png | bin | 0 -> 130 bytes | |||
-rw-r--r-- | noncore/settings/backup/main.cpp | 14 | ||||
-rw-r--r-- | noncore/settings/backup/null.png | bin | 0 -> 100 bytes |
7 files changed, 561 insertions, 0 deletions
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 <qdir.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <qlistview.h> +#include <qpushbutton.h> +#include <qheader.h> +#include <qpe/resource.h> +#include <qpe/config.h> +#include <qmessagebox.h> +#include <qcombobox.h> +#include <qlist.h> +#include <stdlib.h> +#include <qregexp.h> + +#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<QString, QString>::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<QString> 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<QListViewItem> 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<QListViewItem> 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<QListViewItem> BackupAndRestore::getAllItems(QListViewItem *item, QList<QListViewItem> &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 <qmainwindow.h> +#include "backuprestorebase.h" +#include <qmap.h> +#include <qlist.h> + +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<QString, QString> backupLocations; + QList<QListViewItem> getAllItems(QListViewItem *item, QList<QListViewItem> &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 @@ +<!DOCTYPE UI><UI> +<class>BackupAndRestoreBase</class> +<widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>BackupAndRestoreBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>234</width> + <height>216</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Backup And Restore</string> + </property> + <property> + <name>layoutMargin</name> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QTabWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>tabWidget</cstring> + </property> + <widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Widget2</cstring> + </property> + <attribute> + <name>title</name> + <string>Backup</string> + </attribute> + <grid> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget row="1" column="0" rowspan="1" colspan="3" > + <class>QListView</class> + <column> + <property> + <name>text</name> + <string>Applications</string> + </property> + <property> + <name>clickable</name> + <bool>true</bool> + </property> + <property> + <name>resizeable</name> + <bool>true</bool> + </property> + </column> + <property stdset="1"> + <name>name</name> + <cstring>backupList</cstring> + </property> + <property stdset="1"> + <name>allColumnsShowFocus</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>rootIsDecorated</name> + <bool>true</bool> + </property> + </widget> + <widget row="0" column="1" > + <class>QComboBox</class> + <property stdset="1"> + <name>name</name> + <cstring>storeToLocation</cstring> + </property> + </widget> + <widget row="0" column="0" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel1</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Save To</string> + </property> + </widget> + <spacer row="0" column="2" > + <property> + <name>name</name> + <cstring>Spacer1</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget row="2" column="0" rowspan="1" colspan="3" > + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>backupButton</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&Backup</string> + </property> + </widget> + </grid> + </widget> + <widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Widget3</cstring> + </property> + <attribute> + <name>title</name> + <string>Restore</string> + </attribute> + <grid> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget row="0" column="1" > + <class>QComboBox</class> + <property stdset="1"> + <name>name</name> + <cstring>restoreSource</cstring> + </property> + </widget> + <widget row="0" column="0" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel1_2</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Select Source</string> + </property> + </widget> + <widget row="1" column="0" rowspan="1" colspan="2" > + <class>QListView</class> + <column> + <property> + <name>text</name> + <string>Column 1</string> + </property> + <property> + <name>clickable</name> + <bool>true</bool> + </property> + <property> + <name>resizeable</name> + <bool>true</bool> + </property> + </column> + <property stdset="1"> + <name>name</name> + <cstring>restoreList</cstring> + </property> + <property stdset="1"> + <name>minimumSize</name> + <size> + <width>0</width> + <height>100</height> + </size> + </property> + </widget> + <widget row="2" column="0" rowspan="1" colspan="2" > + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>restoreButton</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>&Restore</string> + </property> + </widget> + </grid> + </widget> + </widget> + </vbox> +</widget> +</UI> diff --git a/noncore/settings/backup/check.png b/noncore/settings/backup/check.png Binary files differnew file mode 100644 index 0000000..2890a7a --- a/dev/null +++ b/noncore/settings/backup/check.png 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 <qpe/qpeapplication.h> + +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 Binary files differnew file mode 100644 index 0000000..b67dcc6 --- a/dev/null +++ b/noncore/settings/backup/null.png |