summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/backup/backuprestore.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/noncore/settings/backup/backuprestore.cpp b/noncore/settings/backup/backuprestore.cpp
index 358f663..59e15a2 100644
--- a/noncore/settings/backup/backuprestore.cpp
+++ b/noncore/settings/backup/backuprestore.cpp
@@ -1,313 +1,322 @@
1 1
2#include "backuprestore.h" 2#include "backuprestore.h"
3//#include "output.h" 3//#include "output.h"
4 4
5#include <qapplication.h> 5#include <qapplication.h>
6#include <qmultilineedit.h> 6#include <qmultilineedit.h>
7 7
8#include <qdir.h> 8#include <qdir.h>
9#include <qfile.h> 9#include <qfile.h>
10#include <qfileinfo.h> 10#include <qfileinfo.h>
11#include <qlistview.h> 11#include <qlistview.h>
12#include <qpushbutton.h> 12#include <qpushbutton.h>
13#include <qheader.h> 13#include <qheader.h>
14#include <qpe/resource.h> 14#include <qpe/resource.h>
15#include <qpe/config.h> 15#include <qpe/config.h>
16#include <qmessagebox.h> 16#include <qmessagebox.h>
17#include <qcombobox.h> 17#include <qcombobox.h>
18#include <qlist.h> 18#include <qlist.h>
19#include <stdlib.h> 19#include <stdlib.h>
20#include <qregexp.h> 20#include <qregexp.h>
21 21
22#include <errno.h> 22#include <errno.h>
23#include <stdlib.h> 23#include <stdlib.h>
24#include <unistd.h> 24#include <unistd.h>
25#include <sys/stat.h> 25#include <sys/stat.h>
26#include <dirent.h> 26#include <dirent.h>
27 27
28#define HEADER_NAME 0 28#define HEADER_NAME 0
29#define HEADER_BACKUP 1 29#define HEADER_BACKUP 1
30#define BACKUP_LOCATION 2 30#define BACKUP_LOCATION 2
31 31
32#define EXTENSION ".bck" 32#define EXTENSION ".bck"
33 33
34BackupAndRestore::BackupAndRestore( QWidget* parent, const char* name) 34BackupAndRestore::BackupAndRestore( QWidget* parent, const char* name)
35 : BackupAndRestoreBase(parent, name){ 35 : BackupAndRestoreBase(parent, name){
36 this->showMaximized(); 36 this->showMaximized();
37 backupList->header()->hide(); 37 backupList->header()->hide();
38 restoreList->header()->hide(); 38 restoreList->header()->hide();
39 connect(backupButton, SIGNAL(clicked()), 39 connect(backupButton, SIGNAL(clicked()),
40 this, SLOT(backupPressed())); 40 this, SLOT(backupPressed()));
41 connect(restoreButton, SIGNAL(clicked()), 41 connect(restoreButton, SIGNAL(clicked()),
42 this, SLOT(restore())); 42 this, SLOT(restore()));
43 connect(backupList, SIGNAL(clicked( QListViewItem * )), 43 connect(backupList, SIGNAL(clicked( QListViewItem * )),
44 this, SLOT(selectItem(QListViewItem*))); 44 this, SLOT(selectItem(QListViewItem*)));
45 connect(restoreSource, SIGNAL(activated( int )), 45 connect(restoreSource, SIGNAL(activated( int )),
46 this, SLOT(sourceDirChanged(int))); 46 this, SLOT(sourceDirChanged(int)));
47 47
48 applicationSettings = new QListViewItem(backupList, "Application Settings", "", 48 applicationSettings = new QListViewItem(backupList, "Application Settings", "",
49 QDir::homeDirPath() + "/Settings/"); 49 QDir::homeDirPath() + "/Settings/");
50 selectItem(applicationSettings); 50 selectItem(applicationSettings);
51 applicationSettings = new QListViewItem(backupList, "Application Data", "", 51 applicationSettings = new QListViewItem(backupList, "Application Data", "",
52 QDir::homeDirPath() + "/Applications/"); 52 QDir::homeDirPath() + "/Applications/");
53 selectItem(applicationSettings); 53 selectItem(applicationSettings);
54 documents= new QListViewItem(backupList, "Documents", "", 54 documents= new QListViewItem(backupList, "Documents", "",
55 QDir::homeDirPath() + "/Documents/"); 55 QDir::homeDirPath() + "/Documents/");
56 selectItem(documents); 56 selectItem(documents);
57 57
58 scanForApplicationSettings(); 58 scanForApplicationSettings();
59 59
60 Config config("BackupAndRestore"); 60 Config config("BackupAndRestore");
61 config.setGroup("General"); 61 config.setGroup("General");
62 int totalLocations = config.readNumEntry("totalLocations",0); 62 int totalLocations = config.readNumEntry("totalLocations",0);
63 63
64//todo make less static here and use Storage class to get infos 64//todo make less static here and use Storage class to get infos
65 if(totalLocations == 0){ 65 if(totalLocations == 0){
66
67/* Ramses has a CF-Slot, but that one is internal and you have to dismount the
68 * the case. There's also almost always a WLAN card inserted there
69*/
70
66 backupLocations.insert("Documents", "/root/Documents"); 71 backupLocations.insert("Documents", "/root/Documents");
72#if defined(QT_QWS_RAMSES)
73 backupLocations.insert("MMC", "/mnt/card");
74#else
67 backupLocations.insert("CF", "/mnt/cf"); 75 backupLocations.insert("CF", "/mnt/cf");
68 backupLocations.insert("SD", "/mnt/card"); 76 backupLocations.insert("SD", "/mnt/card");
77#endif
69 } 78 }
70 else{ 79 else{
71 for(int i = 0; i < totalLocations; i++){ 80 for(int i = 0; i < totalLocations; i++){
72 backupLocations.insert(config.readEntry(QString("backupLocationName_%1").arg(i)), 81 backupLocations.insert(config.readEntry(QString("backupLocationName_%1").arg(i)),
73 config.readEntry(QString("backupLocation_%1").arg(i))); 82 config.readEntry(QString("backupLocation_%1").arg(i)));
74 } 83 }
75 } 84 }
76 QMap<QString, QString>::Iterator it; 85 QMap<QString, QString>::Iterator it;
77 for( it = backupLocations.begin(); it != backupLocations.end(); ++it ){ 86 for( it = backupLocations.begin(); it != backupLocations.end(); ++it ){
78 storeToLocation->insertItem(it.key()); 87 storeToLocation->insertItem(it.key());
79 restoreSource->insertItem(it.key()); 88 restoreSource->insertItem(it.key());
80 } 89 }
81 90
82 // Read the list of items to ignore. 91 // Read the list of items to ignore.
83 QList<QString> dontBackupList; 92 QList<QString> dontBackupList;
84 dontBackupList.setAutoDelete(true); 93 dontBackupList.setAutoDelete(true);
85 config.setGroup("DontBackup"); 94 config.setGroup("DontBackup");
86 int total = config.readNumEntry("Total", 0); 95 int total = config.readNumEntry("Total", 0);
87 for(int i = 0; i < total; i++){ 96 for(int i = 0; i < total; i++){
88 dontBackupList.append(new QString(config.readEntry(QString("%1").arg(i), ""))); 97 dontBackupList.append(new QString(config.readEntry(QString("%1").arg(i), "")));
89 } 98 }
90 99
91 QList<QListViewItem> list; 100 QList<QListViewItem> list;
92 getAllItems(backupList->firstChild(), list); 101 getAllItems(backupList->firstChild(), list);
93 102
94 for(uint i = 0; i < list.count(); i++){ 103 for(uint i = 0; i < list.count(); i++){
95 QString text = list.at(i)->text(HEADER_NAME); 104 QString text = list.at(i)->text(HEADER_NAME);
96 for(uint i2 = 0; i2 < dontBackupList.count(); i2++){ 105 for(uint i2 = 0; i2 < dontBackupList.count(); i2++){
97 if(*dontBackupList.at(i2) == text){ 106 if(*dontBackupList.at(i2) == text){
98 selectItem(list.at(i)); 107 selectItem(list.at(i));
99 break; 108 break;
100 } 109 }
101 } 110 }
102 } 111 }
103} 112}
104 113
105BackupAndRestore::~BackupAndRestore(){ 114BackupAndRestore::~BackupAndRestore(){
106 QList<QListViewItem> list; 115 QList<QListViewItem> list;
107 getAllItems(backupList->firstChild(), list); 116 getAllItems(backupList->firstChild(), list);
108 117
109 Config config("BackupAndRestore"); 118 Config config("BackupAndRestore");
110 config.setGroup("DontBackup"); 119 config.setGroup("DontBackup");
111 config.clearGroup(); 120 config.clearGroup();
112 121
113 int count = 0; 122 int count = 0;
114 for(uint i = 0; i < list.count(); i++){ 123 for(uint i = 0; i < list.count(); i++){
115 if(list.at(i)->text(HEADER_BACKUP) == ""){ 124 if(list.at(i)->text(HEADER_BACKUP) == ""){
116 config.writeEntry(QString("%1").arg(count), list.at(i)->text(HEADER_NAME)); 125 config.writeEntry(QString("%1").arg(count), list.at(i)->text(HEADER_NAME));
117 count++; 126 count++;
118 } 127 }
119 } 128 }
120 config.writeEntry("Total", count); 129 config.writeEntry("Total", count);
121} 130}
122 131
123QList<QListViewItem> BackupAndRestore::getAllItems(QListViewItem *item, QList<QListViewItem> &list){ 132QList<QListViewItem> BackupAndRestore::getAllItems(QListViewItem *item, QList<QListViewItem> &list){
124 while(item){ 133 while(item){
125 if(item->childCount() > 0) 134 if(item->childCount() > 0)
126 getAllItems(item->firstChild(), list); 135 getAllItems(item->firstChild(), list);
127 list.append(item); 136 list.append(item);
128 item = item->nextSibling(); 137 item = item->nextSibling();
129 } 138 }
130 return list; 139 return list;
131} 140}
132 141
133/** 142/**
134 * Selects and unselects the item by setting the HEADER_BACKUP to B or !. 143 * Selects and unselects the item by setting the HEADER_BACKUP to B or !.
135 * and changing the icon to match 144 * and changing the icon to match
136 * @param currentItem the item to swich the selection choice. 145 * @param currentItem the item to swich the selection choice.
137 */ 146 */
138void BackupAndRestore::selectItem(QListViewItem *currentItem){ 147void BackupAndRestore::selectItem(QListViewItem *currentItem){
139 if(!currentItem) 148 if(!currentItem)
140 return; 149 return;
141 150
142 if(currentItem->text(HEADER_BACKUP) == "B"){ 151 if(currentItem->text(HEADER_BACKUP) == "B"){
143 currentItem->setPixmap(HEADER_NAME, Resource::loadPixmap("backup/null")); 152 currentItem->setPixmap(HEADER_NAME, Resource::loadPixmap("backup/null"));
144 currentItem->setText(HEADER_BACKUP, ""); 153 currentItem->setText(HEADER_BACKUP, "");
145 } 154 }
146 else{ 155 else{
147 currentItem->setPixmap(HEADER_NAME, Resource::loadPixmap("backup/check")); 156 currentItem->setPixmap(HEADER_NAME, Resource::loadPixmap("backup/check"));
148 currentItem->setText(HEADER_BACKUP, "B"); 157 currentItem->setText(HEADER_BACKUP, "B");
149 } 158 }
150} 159}
151 160
152void BackupAndRestore::scanForApplicationSettings(){ 161void BackupAndRestore::scanForApplicationSettings(){
153 QDir d(applicationSettings->text(BACKUP_LOCATION)); 162 QDir d(applicationSettings->text(BACKUP_LOCATION));
154 d.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks ); 163 d.setFilter( QDir::Dirs | QDir::Files | QDir::NoSymLinks );
155 const QFileInfoList *list = d.entryInfoList(); 164 const QFileInfoList *list = d.entryInfoList();
156 QFileInfoListIterator it( *list ); 165 QFileInfoListIterator it( *list );
157 QFileInfo *fi; 166 QFileInfo *fi;
158 while ( (fi=it.current()) ) { 167 while ( (fi=it.current()) ) {
159 // qDebug((d.path()+fi->fileName()).latin1()); 168 // qDebug((d.path()+fi->fileName()).latin1());
160 if ( ( fi->fileName() != "." ) && ( fi->fileName() != ".." ) ) { 169 if ( ( fi->fileName() != "." ) && ( fi->fileName() != ".." ) ) {
161 QListViewItem *newItem = new QListViewItem(applicationSettings, fi->fileName()); 170 QListViewItem *newItem = new QListViewItem(applicationSettings, fi->fileName());
162 selectItem(newItem); 171 selectItem(newItem);
163 } 172 }
164 ++it; 173 ++it;
165 } 174 }
166} 175}
167 176
168/** 177/**
169 * The "Backup" button has been pressed. Get a list of all of the files that 178 * The "Backup" button has been pressed. Get a list of all of the files that
170 * should be backed up. If there are no files, emit and error and exit. 179 * should be backed up. If there are no files, emit and error and exit.
171 * Determine the file name to store the backup in. Backup the file(s) using 180 * Determine the file name to store the backup in. Backup the file(s) using
172 * tar and gzip --best. Report failure or success 181 * tar and gzip --best. Report failure or success
173 */ 182 */
174void BackupAndRestore::backupPressed(){ 183void BackupAndRestore::backupPressed(){
175 QString backupFiles; 184 QString backupFiles;
176 if(getBackupFiles(backupFiles, NULL) == 0){ 185 if(getBackupFiles(backupFiles, NULL) == 0){
177 QMessageBox::critical(this, "Message", 186 QMessageBox::critical(this, "Message",
178 "No items selected.",QString("Ok") ); 187 "No items selected.",QString("Ok") );
179 return; 188 return;
180 } 189 }
181 190
182 setCaption(tr("Backup and Restore... working...")); 191 setCaption(tr("Backup and Restore... working..."));
183 QString outputFile = backupLocations[storeToLocation->currentText()]; 192 QString outputFile = backupLocations[storeToLocation->currentText()];
184 193
185 QDateTime time = QDateTime::currentDateTime(); 194 QDateTime time = QDateTime::currentDateTime();
186 QString dateString = time.date().toString().replace(QRegExp(" "), ""); 195 QString dateString = time.date().toString().replace(QRegExp(" "), "");
187 outputFile += "/" + dateString; 196 outputFile += "/" + dateString;
188 197
189 QString t = outputFile; 198 QString t = outputFile;
190 int c = 1; 199 int c = 1;
191 while(QFile::exists(outputFile + EXTENSION)){ 200 while(QFile::exists(outputFile + EXTENSION)){
192 outputFile = t + QString("%1").arg(c); 201 outputFile = t + QString("%1").arg(c);
193 c++; 202 c++;
194 } 203 }
195 204
196 qDebug(QString("system(\"tar -c %1 | gzip > %2\")").arg(backupFiles).arg(outputFile).latin1()); 205 qDebug(QString("system(\"tar -c %1 | gzip > %2\")").arg(backupFiles).arg(outputFile).latin1());
197 outputFile += EXTENSION; 206 outputFile += EXTENSION;
198 207
199 int r = system( QString("tar -c %1 | gzip > %2").arg(backupFiles).arg(outputFile).latin1() ); 208 int r = system( QString("tar -c %1 | gzip > %2").arg(backupFiles).arg(outputFile).latin1() );
200 209
201 210
202 211
203 if(r != 0){ 212 if(r != 0){
204 perror("Error: "); 213 perror("Error: ");
205 QString errorMsg="Error\n"+(QString)strerror(errno); 214 QString errorMsg="Error\n"+(QString)strerror(errno);
206 215
207 QMessageBox::critical(this, "Message", "Backup Failed.\n"+errorMsg, QString("Ok") ); 216 QMessageBox::critical(this, "Message", "Backup Failed.\n"+errorMsg, QString("Ok") );
208 return; 217 return;
209 } 218 }
210 else{ 219 else{
211 QMessageBox::information(this, "Message", "Backup Successfull.",QString("Ok") ); 220 QMessageBox::information(this, "Message", "Backup Successfull.",QString("Ok") );
212 221
213 } 222 }
214 setCaption(tr("Backup and Restore")); 223 setCaption(tr("Backup and Restore"));
215} 224}
216 225
217/*** 226/***
218 * Get a list of all of the files to backup. 227 * Get a list of all of the files to backup.
219 */ 228 */
220int BackupAndRestore::getBackupFiles(QString &backupFiles, QListViewItem *parent){ 229int BackupAndRestore::getBackupFiles(QString &backupFiles, QListViewItem *parent){
221 QListViewItem * currentItem; 230 QListViewItem * currentItem;
222 QString currentHome; 231 QString currentHome;
223 if(!parent) 232 if(!parent)
224 currentItem = backupList->firstChild(); 233 currentItem = backupList->firstChild();
225 else{ 234 else{
226 currentItem = parent->firstChild(); 235 currentItem = parent->firstChild();
227 currentHome = parent->text(BACKUP_LOCATION); 236 currentHome = parent->text(BACKUP_LOCATION);
228 } 237 }
229 238
230 uint count = 0; 239 uint count = 0;
231 while( currentItem != 0 ){ 240 while( currentItem != 0 ){
232 if(currentItem->text(HEADER_BACKUP) == "B" ){ 241 if(currentItem->text(HEADER_BACKUP) == "B" ){
233 if(currentItem->childCount() == 0 ){ 242 if(currentItem->childCount() == 0 ){
234 if(parent == NULL) 243 if(parent == NULL)
235 backupFiles += currentItem->text(BACKUP_LOCATION); 244 backupFiles += currentItem->text(BACKUP_LOCATION);
236 else 245 else
237 backupFiles += currentHome + currentItem->text(HEADER_NAME); 246 backupFiles += currentHome + currentItem->text(HEADER_NAME);
238 backupFiles += " "; 247 backupFiles += " ";
239 count++; 248 count++;
240 } 249 }
241 else{ 250 else{
242 count += getBackupFiles(backupFiles, currentItem); 251 count += getBackupFiles(backupFiles, currentItem);
243 } 252 }
244 } 253 }
245 currentItem = currentItem->nextSibling(); 254 currentItem = currentItem->nextSibling();
246 } 255 }
247 return count; 256 return count;
248} 257}
249 258
250void BackupAndRestore::sourceDirChanged(int selection){ 259void BackupAndRestore::sourceDirChanged(int selection){
251 restoreList->clear(); 260 restoreList->clear();
252 rescanFolder(backupLocations[restoreSource->text(selection)]); 261 rescanFolder(backupLocations[restoreSource->text(selection)]);
253} 262}
254 263
255/** 264/**
256 * Scans directory for any backup files. Will recursivly go down, 265 * Scans directory for any backup files. Will recursivly go down,
257 * but will not follow symlinks. 266 * but will not follow symlinks.
258 * @param directory - the directory to look in. 267 * @param directory - the directory to look in.
259 */ 268 */
260void BackupAndRestore::rescanFolder(QString directory){ 269void BackupAndRestore::rescanFolder(QString directory){
261 //qDebug(QString("rescanFolder: ") + directory.latin1()); 270 //qDebug(QString("rescanFolder: ") + directory.latin1());
262 QDir d(directory); 271 QDir d(directory);
263 if(!d.exists()) 272 if(!d.exists())
264 return; 273 return;
265 274
266 d.setFilter( QDir::Files | QDir::Hidden | QDir::Dirs); 275 d.setFilter( QDir::Files | QDir::Hidden | QDir::Dirs);
267 const QFileInfoList *list = d.entryInfoList(); 276 const QFileInfoList *list = d.entryInfoList();
268 QFileInfoListIterator it( *list ); 277 QFileInfoListIterator it( *list );
269 QFileInfo *file; 278 QFileInfo *file;
270 while ( (file=it.current()) ) { // for each file... 279 while ( (file=it.current()) ) { // for each file...
271 // If it is a dir and not .. or . then add it as a tab and go down. 280 // If it is a dir and not .. or . then add it as a tab and go down.
272 if(file->isDir()){ 281 if(file->isDir()){
273 if(file->fileName() != ".." && file->fileName() != ".") { 282 if(file->fileName() != ".." && file->fileName() != ".") {
274 rescanFolder(directory + "/" + file->fileName()); 283 rescanFolder(directory + "/" + file->fileName());
275 } 284 }
276 } 285 }
277 else{ 286 else{
278 // If it is a backup file add to list. 287 // If it is a backup file add to list.
279 if(file->fileName().contains(EXTENSION)) 288 if(file->fileName().contains(EXTENSION))
280 (void)new QListViewItem(restoreList, file->fileName()); 289 (void)new QListViewItem(restoreList, file->fileName());
281 } 290 }
282 ++it; 291 ++it;
283 } 292 }
284} 293}
285 294
286/** 295/**
287 * Restore a backup file. 296 * Restore a backup file.
288 * Report errors or success 297 * Report errors or success
289 */ 298 */
290void BackupAndRestore::restore(){ 299void BackupAndRestore::restore(){
291 QListViewItem *restoreItem = restoreList->currentItem(); 300 QListViewItem *restoreItem = restoreList->currentItem();
292 if(!restoreItem){ 301 if(!restoreItem){
293 QMessageBox::critical(this, "Message", 302 QMessageBox::critical(this, "Message",
294 "Please select something to restore.",QString("Ok") ); 303 "Please select something to restore.",QString("Ok") );
295 return; 304 return;
296 } 305 }
297 QString restoreFile = backupLocations[restoreSource->currentText()]; 306 QString restoreFile = backupLocations[restoreSource->currentText()];
298 307
299 restoreFile += "/" + restoreItem->text(0); 308 restoreFile += "/" + restoreItem->text(0);
300 309
301 int r = system(QString("tar -C / -zxf %1").arg(restoreFile).latin1()); 310 int r = system(QString("tar -C / -zxf %1").arg(restoreFile).latin1());
302 if(r != 0){ 311 if(r != 0){
303 QMessageBox::critical(this, "Message", 312 QMessageBox::critical(this, "Message",
304 "Restore Failed.",QString("Ok") ); 313 "Restore Failed.",QString("Ok") );
305 } 314 }
306 else{ 315 else{
307 QMessageBox::critical(this, "Message", 316 QMessageBox::critical(this, "Message",
308 "Restore Successfull.",QString("Ok") ); 317 "Restore Successfull.",QString("Ok") );
309 } 318 }
310} 319}
311 320
312// backuprestore.cpp 321// backuprestore.cpp
313 322