source: branches/2.06/mondo/mondo/xmondo/xmondo.cpp @ 2708

Last change on this file since 2708 was 2708, checked in by bruno, 8 years ago

r4184@localhost: bruno | 2011-01-27 15:52:51 +0100

  • Adds support for hpsa driver (new HP Smart Array driver)
  • Property svn:keywords set to Id
File size: 42.3 KB
Line 
1/***************************************************************************
2                          xmondo.cpp  -  description
3                             -------------------
4    begin                : Thu Apr 24 19:44:32 PDT 2003
5    copyright            : (C) 2003 by Joshua Oreman
6    email                : oremanj@get-linux.org
7    cvsid                : $Id: xmondo.cpp 2708 2011-01-27 18:31:44Z bruno $
8 ***************************************************************************/
9
10/***************************************************************************
11 *                                                                         *
12 *   This program is free software; you can redistribute it and/or modify  *
13 *   it under the terms of the GNU General Public License as published by  *
14 *   the Free Software Foundation; either version 2 of the License, or     *
15 *   (at your option) any later version.                                   *
16 *                                                                         *
17 ***************************************************************************/
18
19#include "xmondo.h"
20#include "xmondobackup.h"
21#include "xmondorestore.h"
22#include <config.h>
23#include <qwidgetstack.h>
24#include <qpushbutton.h>
25#include <qsize.h>
26#include <qgrid.h>
27#include <qlayout.h>
28#include <qbuttongroup.h>
29#include <qvbuttongroup.h>
30#include <qhbuttongroup.h>
31#include <qradiobutton.h>
32#include <qlabel.h>
33#include <qthread.h>
34#include <qlineedit.h>
35#include <qlistview.h>
36#include <qmessagebox.h>
37#include <qcheckbox.h>
38#include <qsizepolicy.h>
39#include <qstringlist.h>
40#include <qregexp.h>
41#include <qfile.h>
42#include <qtextstream.h>
43#include <kaboutdialog.h>
44#include <kapp.h>
45
46#include "X-specific.h"
47extern "C" {
48#define bool int
49#include "libmondo-files-EXT.h"
50#include "libmondo-fork-EXT.h"
51#include "libmondo-devices-EXT.h"
52#include "libmondo-string-EXT.h"
53#include "libmondo-tools-EXT.h"
54#undef bool
55}
56
57int g_operation_in_progress = 0;
58
59static char cvsid[] = "$Id: xmondo.cpp 2708 2011-01-27 18:31:44Z bruno $";
60
61QProgressBar            *XMondoProgress;
62QLabel                  *XMondoProgressWhat, *XMondoProgressWhat2, *XMondoProgressWhat3;
63QCheckBox               *XMondoVerbose;
64QMultiLineEdit          *XMondoLog;
65QLabel                  *XMondoStatus;
66QLabel                  *XMondoTimeTaken, *XMondoTimeToGo, *XMondoProgressPercent;
67QPushButton             *XMondoCancel;
68XMEventHolder            events;
69
70/* log to both the X window and the logfile */
71void xlog_debug_msg (int debug_level, const char *szFile,
72             const char *szFunction, int nLine, const char *fmt, ...)
73{
74    char buf[MAX_STR_LEN];
75
76    va_list ap;
77    va_start (ap, fmt);
78    vsprintf (buf, fmt, ap);
79    va_end (ap);
80
81    log_to_screen (buf);
82    standard_log_debug_msg (debug_level, szFile, szFunction, nLine, buf);
83}
84
85XMondo::XMondo(QWidget *parent, const char *name) : KMainWindow(parent, name)
86{
87    if (does_file_exist (MONDO_LOGFILE)) {
88    unlink (MONDO_LOGFILE);
89    }
90    log_it ("+----------------- XMondo v%-8s -----------+", VERSION);
91    log_it ("| DON'T PANIC! Mondo logs almost everything, so|");
92    log_it ("| don't start worrying just because you see a  |");
93    log_it ("| few error messages in the log. Mondo will    |");
94    log_it ("| tell you if something really has gone wrong, |");
95    log_it ("| so if it says everything is all right, it    |");
96    log_it ("| probably is. But remember to compare your    |");
97    log_it ("| backups before trusting them.        -- Josh |");
98    log_it ("+----------------------------------------------+");
99
100    QBoxLayout *mainHBox = new QHBoxLayout (this, 5, 5, "mainHBox");
101    buttons = new QVButtonGroup (this, "buttons");
102    QPushButton *bBackup, *bCompare, *bRestore, *bAbout, *bQuit;
103    bBackup  = new QPushButton ("Backup", buttons, "bBackup");
104    bCompare = new QPushButton ("Compare", buttons, "bCompare");
105    bRestore = new QPushButton ("Restore", buttons, "bRestore");
106    bAbout   = new QPushButton ("About", buttons, "bAbout");
107    bQuit    = new QPushButton ("Quit", buttons, "bQuit");
108    mainButtons = buttons;
109    connect (buttons, SIGNAL(clicked(int)), this, SLOT(slotMode(int)));
110    buttons->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Expanding));
111    mainHBox->addWidget (buttons);
112       
113    stack = new QWidgetStack (this, "stack");
114    mainHBox->addWidget (stack);
115
116    QWidget *backupPane = new QWidget (stack, "backupPane");
117    QBoxLayout *backupVBox = new QVBoxLayout (backupPane, 5, 5, "backupVBox");
118    backup = new QTabWidget (backupPane, "backup");
119    backupVBox->addWidget (backup);
120    bStartBackup = new QPushButton ("START", backupPane, "startBackup");
121    connect (bStartBackup, SIGNAL(clicked()), this, SLOT(slotStartBackup()));
122    backupVBox->addWidget (bStartBackup);
123    QWidget *bBkpinfoTab, *bOptionsTab, *bAdvancedTab;
124
125    initBackupTab (bBkpinfoTab);
126    tabHardware = bBkpinfoTab;
127    initOptionsTab (bOptionsTab);
128    tabOptions = bOptionsTab;
129    initAdvancedTab (bAdvancedTab);
130    tabAdvanced = bAdvancedTab;
131   
132    backup->addTab (bBkpinfoTab, "Hardware");
133    backup->addTab (bOptionsTab, "Options");
134    backup->addTab (bAdvancedTab, "Advanced");
135    connect (backup, SIGNAL(currentChanged(QWidget*)), this, SLOT(slotTabChange(QWidget*)));
136    stack->addWidget (backupPane, 0);
137   
138    compare = new QWidget (stack, "compare");
139    initCompareTab (compare);
140    stack->addWidget (compare, 1);
141
142    restore = new QWidget (stack, "restore");
143    QBoxLayout *restoreBox = new QVBoxLayout (restore, 0, 0, "restoreBox");
144    restoreStack = new QWidgetStack (restore, "restoreStack");
145    restoreInfo = new QWidget (restoreStack, "restoreInfo");
146    initRestoreTab (restoreInfo);
147    QWidget *restoreButtonsWidget = new QWidget (restore, "restoreButtonsWidget");
148    restoreButtonsWidget->setSizePolicy (QSizePolicy (QSizePolicy::Expanding, QSizePolicy::Fixed));
149    QBoxLayout *restoreButtons = new QHBoxLayout (restoreButtonsWidget, 5, 5, "restoreButtons");
150    rPrev   = new QPushButton ("<- Prev", restoreButtonsWidget, "rPrev");
151    rNext   = new QPushButton ("Next ->", restoreButtonsWidget, "rNext");
152    rPrev->hide();
153    rNext->show();
154    connect (rPrev, SIGNAL(clicked()), this, SLOT(slotPrevRestore()));
155    connect (rNext, SIGNAL(clicked()), this, SLOT(slotNextRestore()));
156    restoreButtons->addWidget (rPrev);
157    restoreButtons->addWidget (rNext);
158    restoreBox->addWidget (restoreStack);
159    restoreBox->addWidget (restoreButtonsWidget);
160    restoreStack->addWidget (restoreInfo, 0);
161    restoreStack->raiseWidget (0);
162
163    stack->addWidget (restore, 2);
164   
165    QWidget *progress   = new QWidget (stack, "progress");
166    QGridLayout *grid   = new QGridLayout (progress, 9, 2, 5, 5);
167    XMondoProgress      = new QProgressBar (progress);
168    XMondoProgressWhat  = new QLabel (progress);
169    XMondoProgressWhat2 = new QLabel (progress);
170    XMondoProgressWhat3 = new QLabel (progress);
171    XMondoVerbose       = new QCheckBox ("Verbose", progress);
172    XMondoLog           = new QMultiLineEdit (progress);
173    XMondoStatus        = new QLabel (progress);
174    XMondoTimeTaken     = new QLabel (progress);
175    XMondoTimeToGo      = new QLabel (progress);
176    XMondoCancel        = new QPushButton ("Cancel", progress, "bCancel");   
177    grid->addMultiCellWidget (XMondoStatus,        0, 0, 0, 1);
178    grid->addMultiCellWidget (XMondoVerbose,       1, 1, 0, 1, AlignRight);
179    grid->addMultiCellWidget (XMondoLog,           2, 2, 0, 1);
180    grid->addMultiCellWidget (XMondoProgressWhat,  3, 3, 0, 1);
181    grid->addMultiCellWidget (XMondoProgressWhat2, 4, 4, 0, 1);
182    grid->addMultiCellWidget (XMondoProgressWhat3, 5, 5, 0, 1);
183    grid->addMultiCellWidget (XMondoProgress,      6, 6, 0, 1);
184    grid->addWidget          (XMondoTimeTaken,        7,    0);
185    grid->addWidget          (XMondoTimeToGo,         7,    1);
186    grid->addMultiCellWidget (XMondoCancel,        8, 8, 0, 1);
187
188    connect (XMondoVerbose, SIGNAL(toggled(bool)), this, SLOT(slotVerboseChange(bool)));
189    slotVerboseChange (false);
190
191    stack->addWidget (progress, 3);
192    stack->raiseWidget (0);
193}
194
195XMondo::~XMondo()
196{
197    if (rstr) delete rstr;
198}
199
200void XMondo::slotVerboseChange (bool on) 
201{
202    if (on) {
203    log_debug_msg = xlog_debug_msg;
204    } else {
205    log_debug_msg = standard_log_debug_msg;
206    }
207}
208
209void XMondo::slotMode (int x)
210{
211    if (x < 3) {
212    stack->raiseWidget (x);
213    return;
214    }
215
216    if (x >= 4) {
217    kapp->quit();
218    return;
219    }
220
221    KAboutDialog *about;
222
223    about = new KAboutDialog (0, "about");
224    about->setCaption ("About XMondo");
225    about->setVersion ("Version 0.1");
226    QPixmap logo;
227    if (logo.load ("mondo.png")) {
228    about->setLogo (logo);
229    } else {
230    char logo_location[MAX_STR_LEN];
231
232    if (find_and_store_mondoarchives_home (logo_location) == 0) {
233        strcat (logo_location, "/mondo.png");
234        if (logo.load (logo_location)) {
235        about->setLogo (logo);
236        } else {
237        qDebug ("Warning - logo not found in Mondo's home directory");
238        }
239    } else {
240        qDebug ("Warning - can't find & store Mondo's home directory");
241    }
242    }
243
244    about->setMaintainer ("Joshua Oreman", "oremanj@get-linux.org", "", "Author of XMondo");
245    about->setAuthor ("Hugo Rabson", "hugo.rabson@mondorescue.org", "http://www.mondorescue.org/", "Author of Mondo and Mindi");
246    about->addContributor ("Stan Benoit", "troff@nakedsoul.org", "http://www.nakedsoul.org/~troff/", "Beta testing & bugfixes");
247    about->addContributor ("Jesse Keating", "hosting@j2solutions.net", "http://geek.j2solutions.net/", "Package maintainer");
248    about->addContributor ("Hector Alvarez", "hector@debian.org", "", "Debian package maintainer");
249    about->exec();
250}
251
252void doMediaType (int x, QLabel *lDOption, QLineEdit *editDOption, QLineEdit *editMediaSize,
253          QLabel *nfsRemoteDir, QLineEdit *editNFSRemoteDir)
254{
255    char cdrw_dev [100], cdrom_dev [100];
256    if (find_cdrw_device (cdrw_dev)) strcpy (cdrw_dev, "0,0,0");
257    if (find_cdrom_device (cdrom_dev, 0)) strcpy (cdrom_dev, "");
258
259    switch (x) {
260    case 0:
261    lDOption->setText ("CD-R node:");
262    editDOption->setText (cdrw_dev);
263    if (editMediaSize) {
264        editMediaSize->setText ("650");
265        editMediaSize->setEnabled (true);
266    }
267    nfsRemoteDir->setEnabled (false);
268    editNFSRemoteDir->setEnabled (false);
269    break;
270    case 1:
271    lDOption->setText ("CD-RW node:");
272    editDOption->setText (cdrw_dev);
273    if (editMediaSize) {
274        editMediaSize->setText ("650");
275        editMediaSize->setEnabled (true);
276    }
277    nfsRemoteDir->setEnabled (false);
278    editNFSRemoteDir->setEnabled (false);
279    break;
280    case 2:
281    lDOption->setText ("CD streamer node:");
282    editDOption->setText (cdrw_dev);
283    if (editMediaSize) {
284        editMediaSize->setText ("650");
285        editMediaSize->setEnabled (true);
286    }
287    nfsRemoteDir->setEnabled (false);
288    editNFSRemoteDir->setEnabled (false);
289    break;
290    case 3:
291    lDOption->setText ("DVD /dev entry:");
292    editDOption->setText (cdrom_dev);
293    if (editMediaSize) {
294        editMediaSize->setText ("4480");
295        editMediaSize->setEnabled (true);
296    }
297    nfsRemoteDir->setEnabled (false);
298    editNFSRemoteDir->setEnabled (false);
299    break;
300    case 4:
301    lDOption->setText ("Directory for ISOs:");
302    editDOption->setText ("/root/images/mondo");
303    if (editMediaSize) {
304        editMediaSize->setText ("650");
305        editMediaSize->setEnabled (true);
306    }
307    nfsRemoteDir->setEnabled (false);
308    editNFSRemoteDir->setEnabled (false);
309    break;
310    case 5:
311    lDOption->setText ("NFS share:");
312    editDOption->setText ("");
313    if (editMediaSize) {
314        editMediaSize->setText ("4600");
315        editMediaSize->setEnabled (true);
316    }
317    nfsRemoteDir->setEnabled (true);
318    editNFSRemoteDir->setEnabled (true);
319    editNFSRemoteDir->setText ("");
320    break;
321    case 6:
322    lDOption->setText ("Tape /dev entry:");
323#if __FreeBSD__
324    editDOption->setText ("/dev/sa0");
325#elif linux
326    editDOption->setText ("/dev/st0");
327#else
328    editDOption->setText ("");
329#endif
330    if (editMediaSize) {
331        editMediaSize->setText ("n/a");
332        editMediaSize->setEnabled (false);
333    }
334    nfsRemoteDir->setEnabled (false);
335    editNFSRemoteDir->setEnabled (false);
336    break;
337    case 7:
338    lDOption->setText ("Device/file to use:");
339    editDOption->setText ("");
340    if (editMediaSize) {
341        editMediaSize->setText ("n/a");
342        editMediaSize->setEnabled (false);
343    }
344    nfsRemoteDir->setEnabled (false);
345    editNFSRemoteDir->setEnabled (false);
346    break;
347    }
348}
349
350void XMondo::slotMediaType (int x)
351{
352    doMediaType (x, lDOption, editDOption, editMediaSize, nfsRemoteDir, editNFSRemoteDir);
353}
354
355void XMondo::slotCompareMediaType (int x)
356{
357    doMediaType (x, compareLDOption, compareEditDOption, 0, compareNFSRemoteDir, compareEditNFSRemoteDir);
358}
359
360void XMondo::slotRestoreMediaType (int x)
361{
362    char cdrom_device[256];
363    if (does_file_exist ("/dev/cdroms/cdrom0")) {
364    strcpy (cdrom_device, "/dev/cdroms/cdrom0");
365    } else if (does_file_exist ("/dev/cdrom")) {
366    strcpy (cdrom_device, "/dev/cdrom");
367    } else {
368    find_cdrom_device (cdrom_device, false);
369    }
370
371    switch (x) {
372    case 0:
373    restoreLDOption->setText ("CD device:");
374    restoreEditDOption->setText (cdrom_device);
375    restoreNFSRemoteDir->setEnabled (false);
376    restoreEditNFSRemoteDir->setEnabled (false);
377    break;
378    case 1:
379    restoreLDOption->setText ("CD device:");
380    restoreEditDOption->setText (cdrom_device);
381    restoreNFSRemoteDir->setEnabled (false);
382    restoreEditNFSRemoteDir->setEnabled (false);
383    break;
384    case 2:
385    restoreLDOption->setText ("CD device:");
386    restoreEditDOption->setText (cdrom_device);
387    restoreNFSRemoteDir->setEnabled (false);
388    restoreEditNFSRemoteDir->setEnabled (false);
389    break;
390    case 3:
391    restoreLDOption->setText ("DVD device:");
392    restoreEditDOption->setText (cdrom_device);
393    restoreNFSRemoteDir->setEnabled (false);
394    restoreEditNFSRemoteDir->setEnabled (false);
395    break;
396    case 4:
397    restoreLDOption->setText ("Directory for ISOs:");
398    restoreEditDOption->setText ("/root/images/mondo");
399    restoreNFSRemoteDir->setEnabled (false);
400    restoreEditNFSRemoteDir->setEnabled (false);
401    break;
402    case 5:
403    restoreLDOption->setText ("NFS share:");
404    restoreEditDOption->setText ("");
405    restoreNFSRemoteDir->setEnabled (true);
406    restoreEditNFSRemoteDir->setEnabled (true);
407    restoreEditNFSRemoteDir->setText ("");
408    break;
409    case 6:
410    restoreLDOption->setText ("Tape /dev entry:");
411#if __FreeBSD__
412    restoreEditDOption->setText ("/dev/sa0");
413#elif linux
414    restoreEditDOption->setText ("/dev/st0");
415#else
416    restoreEditDOption->setText ("");
417#endif
418    restoreNFSRemoteDir->setEnabled (false);
419    restoreEditNFSRemoteDir->setEnabled (false);
420    break;
421    case 7:
422    restoreLDOption->setText ("Device/file to use:");
423    restoreEditDOption->setText ("");
424    restoreNFSRemoteDir->setEnabled (false);
425    restoreEditNFSRemoteDir->setEnabled (false);
426    break;
427    }
428}
429   
430void XMondo::initBackupTab (QWidget *& bBkpinfoTab)
431{
432    QGridLayout *bBkpinfoGrid;
433    QVButtonGroup *mediaType, *compression;
434    QLabel *dOption, *mediaSize;
435    QRadioButton *mTape, *mUdev, *mISO, *mNFS, *mCDR, *mCDRW, *mCDStream, *mDVD;
436    QRadioButton *cMax, *cAvg, *cMin, *cNone;
437    char *cdrwDev = new char [100];
438    if (find_cdrw_device (cdrwDev)) strcpy (cdrwDev, "0,0,0");
439    bBkpinfoTab   = new QWidget (backup, "bBkpinfoTab");
440    mediaType     = new QVButtonGroup ("&Media Type:", bBkpinfoTab, "mediaType");
441    mCDR          = new QRadioButton ("CD-R discs", mediaType);
442    mCDRW         = new QRadioButton ("CD-RW discs", mediaType);
443    mCDStream     = new QRadioButton ("CD streamer", mediaType);
444    mDVD          = new QRadioButton ("DVD discs", mediaType);
445    mISO          = new QRadioButton ("ISOs in dir.", mediaType);
446    mNFS          = new QRadioButton ("NFS (network)", mediaType);
447    mTape         = new QRadioButton ("Tape streamer", mediaType);
448    mUdev         = new QRadioButton ("Universal device", mediaType);
449    compression   = new QVButtonGroup ("&Compression", bBkpinfoTab, "compression");
450    cMax          = new QRadioButton ("Maximum (very slow)", compression);
451    cAvg          = new QRadioButton ("Average compression", compression);
452    cMin          = new QRadioButton ("Minimum (very fast)", compression);
453    cNone         = new QRadioButton ("No software compression", compression);
454    dOption       = new QLabel ("CD-R node:", bBkpinfoTab, "dOption");
455    nfsRemoteDir  = new QLabel ("NFS remote directory:", bBkpinfoTab, "nfsRemoteDir");
456    mediaSize     = new QLabel ("Media size (MB):", bBkpinfoTab, "mediaSize");
457    editDOption   = new QLineEdit (bBkpinfoTab, "editDOption");
458    editNFSRemoteDir=new QLineEdit(bBkpinfoTab, "editNFSRemoteDir");
459    editMediaSize = new QLineEdit (bBkpinfoTab, "editMediaSize");
460    mCDR->setChecked (true);
461    cAvg->setChecked (true);
462    editDOption->setText (cdrwDev);
463    nfsRemoteDir->setEnabled (false);
464    editNFSRemoteDir->setEnabled (false);
465    editMediaSize->setText ("650");
466    bBkpinfoGrid = new QGridLayout (bBkpinfoTab, 5, 2, 5, 5, "bBkpinfoGrid");
467    bBkpinfoGrid->addMultiCellWidget (mediaType, 0, 1, 0, 0);
468    bBkpinfoGrid->addMultiCellWidget (compression, 0, 1, 1, 1);
469    bBkpinfoGrid->addWidget (dOption, 2, 0, AlignRight);
470    bBkpinfoGrid->addWidget (mediaSize, 3, 0, AlignRight);
471    bBkpinfoGrid->addWidget (nfsRemoteDir, 4, 0, AlignRight);
472    bBkpinfoGrid->addWidget (editDOption, 2, 1); 
473    bBkpinfoGrid->addWidget (editMediaSize, 3, 1);
474    bBkpinfoGrid->addWidget (editNFSRemoteDir, 4, 1);
475    connect (mediaType, SIGNAL(clicked(int)), this, SLOT(slotMediaType(int)));
476    lDOption = dOption;
477    bgMediaType = mediaType; bgCompression = compression;
478}
479
480void XMondo::initCompareTab (QWidget *& bBkpinfoTab)
481{
482    QGridLayout *bBkpinfoGrid;
483    QVButtonGroup *mediaType;
484    QLabel *dOption, *mediaSize;
485    QRadioButton *mTape, *mUdev, *mISO, *mNFS, *mCDR, *mCDRW, *mCDStream, *mDVD;
486    char *cdrwDev = new char [100];
487    if (find_cdrw_device (cdrwDev)) strcpy (cdrwDev, "0,0,0");
488    bBkpinfoTab          = new QWidget (backup, "bBkpinfoTab");
489    mediaType            = new QVButtonGroup ("&Media type to compare:", bBkpinfoTab, "compareMediaType");
490    mCDR                 = new QRadioButton ("CD-R discs", mediaType);
491    mCDRW                = new QRadioButton ("CD-RW discs", mediaType);
492    mCDStream            = new QRadioButton ("CD streamer", mediaType);
493    mDVD                 = new QRadioButton ("DVD discs", mediaType);
494    mISO                 = new QRadioButton ("ISOs in dir.", mediaType);
495    mNFS                 = new QRadioButton ("NFS (network)", mediaType);
496    mTape                = new QRadioButton ("Tape streamer", mediaType);
497    mUdev                = new QRadioButton ("Universal device", mediaType);
498    dOption              = new QLabel ("CD-R node:", bBkpinfoTab, "compareDOption");
499    compareNFSRemoteDir  = new QLabel ("NFS remote directory:", bBkpinfoTab, "compareNFSRemoteDir");
500    compareEditDOption   = new QLineEdit (bBkpinfoTab, "compareEditDOption");
501    compareEditNFSRemoteDir=new QLineEdit(bBkpinfoTab, "compareEditNFSRemoteDir");
502    mCDR->setChecked (true);
503    compareEditDOption->setText (cdrwDev);
504    compareNFSRemoteDir->setEnabled (false);
505    compareEditNFSRemoteDir->setEnabled (false);
506    bBkpinfoGrid = new QGridLayout (bBkpinfoTab, 4, 2, 5, 5, "bBkpinfoGrid");
507    bBkpinfoGrid->addMultiCellWidget (mediaType, 0, 1, 0, 1);
508    bBkpinfoGrid->addWidget (dOption, 2, 0, AlignRight);
509    bBkpinfoGrid->addWidget (compareNFSRemoteDir, 3, 0, AlignRight);
510    bBkpinfoGrid->addWidget (compareEditDOption, 2, 1);
511    bBkpinfoGrid->addWidget (compareEditNFSRemoteDir, 3, 1);
512    bStartCompare = new QPushButton ("START", bBkpinfoTab, "startCompare");
513    connect (bStartCompare, SIGNAL(clicked()), this, SLOT(slotStartCompare()));
514    bBkpinfoGrid->addMultiCellWidget (bStartCompare, 4, 4, 0, 3);
515    connect (mediaType, SIGNAL(clicked(int)), this, SLOT(slotCompareMediaType(int)));
516    compareLDOption = dOption;
517    bgCompareMediaType = mediaType;
518}
519
520void XMondo::initRestoreTab (QWidget *& bRestoreTab)
521{
522    QGridLayout *bRestoreGrid;
523    QVButtonGroup *mediaType;
524    QLabel *dOption, *mediaSize, *filter;
525    QRadioButton *mTape, *mUdev, *mISO, *mNFS, *mCDR, *mCDRW, *mCDStream, *mDVD;
526    char *cdrom_device = new char [100];
527    if (does_file_exist ("/dev/cdroms/cdrom0")) {
528    strcpy (cdrom_device, "/dev/cdroms/cdrom0");
529    } else if (does_file_exist ("/dev/cdrom")) {
530    strcpy (cdrom_device, "/dev/cdrom");
531    } else {
532    find_cdrom_device (cdrom_device, false);
533    }
534    bRestoreTab          = new QWidget (backup, "bRestoreTab");
535    mediaType            = new QVButtonGroup ("&Media type to restore from:", bRestoreTab, "restoreMediaType");
536    mCDR                 = new QRadioButton ("CD-R discs", mediaType);
537    mCDRW                = new QRadioButton ("CD-RW discs", mediaType);
538    mCDStream            = new QRadioButton ("CD streamer", mediaType);
539    mDVD                 = new QRadioButton ("DVD discs", mediaType);
540    mISO                 = new QRadioButton ("ISOs in dir.", mediaType);
541    mNFS                 = new QRadioButton ("NFS (network)", mediaType);
542    mTape                = new QRadioButton ("Tape streamer", mediaType);
543    mUdev                = new QRadioButton ("Universal device", mediaType);
544    dOption              = new QLabel ("CD-R node:", bRestoreTab, "restoreDOption");
545    restoreNFSRemoteDir  = new QLabel ("NFS remote directory:", bRestoreTab, "restoreNFSRemoteDir");
546    restoreEditDOption   = new QLineEdit (bRestoreTab, "restoreEditDOption");
547    restoreEditNFSRemoteDir=new QLineEdit(bRestoreTab, "restoreEditNFSRemoteDir");
548    filter               = new QLabel ("Filelist filter (regexp):", bRestoreTab);
549    restoreFilter        = new QLineEdit (bRestoreTab, "restoreFilter");
550    mCDR->setChecked (true);
551    restoreEditDOption->setText (cdrom_device);
552    restoreNFSRemoteDir->setEnabled (false);
553    restoreEditNFSRemoteDir->setEnabled (false);
554    bRestoreGrid = new QGridLayout (bRestoreTab, 5, 2, 5, 5, "bRestoreGrid");
555    bRestoreGrid->addMultiCellWidget (mediaType, 0, 1, 0, 1);
556    bRestoreGrid->addWidget (dOption, 2, 0, AlignRight);
557    bRestoreGrid->addWidget (restoreNFSRemoteDir, 3, 0, AlignRight);
558    bRestoreGrid->addWidget (filter, 4, 0, AlignRight);
559    bRestoreGrid->addWidget (restoreEditDOption, 2, 1);
560    bRestoreGrid->addWidget (restoreEditNFSRemoteDir, 3, 1);
561    bRestoreGrid->addWidget (restoreFilter, 4, 1);
562    connect (mediaType, SIGNAL(clicked(int)), this, SLOT(slotRestoreMediaType(int)));
563    restoreLDOption = dOption;
564    bgRestoreMediaType = mediaType;
565}
566
567void XMondo::initOptionsTab (QWidget *& bOptionsTab)
568{
569    QGridLayout *bOptionsGrid;
570    QListView *imageDevs, *exclude, *include;
571    QPushButton *incAdd, *incDel, *exAdd, *exDel;
572    QLineEdit *incPending, *exPending;
573    QCheckBox *compare, *bnfs, *diff;
574
575    bOptionsTab  = new QWidget (backup, "bOptionsTab");
576    bOptionsGrid = new QGridLayout (bOptionsTab, 19, 5, 5, 5, "bOptionsGrid");
577    imageDevs    = new QListView (bOptionsTab, "imageDevs");
578    exclude      = new QListView (bOptionsTab, "exclude");
579    include      = new QListView (bOptionsTab, "include");
580    incAdd       = new QPushButton ("Add", bOptionsTab);
581    incDel       = new QPushButton ("Delete", bOptionsTab);
582    exAdd        = new QPushButton ("Add", bOptionsTab);
583    exDel        = new QPushButton ("Delete", bOptionsTab);
584    incPending   = new QLineEdit (bOptionsTab);
585    exPending    = new QLineEdit (bOptionsTab);
586    compare      = new QCheckBox ("Compare after backup", bOptionsTab);
587    bnfs         = new QCheckBox ("Backup NFS mounts", bOptionsTab);
588    diff         = new QCheckBox ("Differential backup", bOptionsTab);
589
590    imageDevs->addColumn ("Devices to back up as images:");
591    exclude->addColumn ("Exclude paths:");
592    include->addColumn ("Include paths:");
593    (void) new QListViewItem (include, "/");
594
595    connect (incAdd, SIGNAL(clicked()), this, SLOT(slotAddInclude()));
596    connect (incDel, SIGNAL(clicked()), this, SLOT(slotDelInclude()));
597    connect (exAdd,  SIGNAL(clicked()), this, SLOT(slotAddExclude()));
598    connect (exDel,  SIGNAL(clicked()), this, SLOT(slotDelExclude()));
599       
600    bOptionsGrid->addMultiCellWidget (imageDevs,    0,  5, 0, 4);
601    bOptionsGrid->addRowSpacing (6, 10);
602    bOptionsGrid->addRowSpacing (2, 90);
603    bOptionsGrid->addMultiCellWidget (exclude,      7, 12, 3, 4);
604    bOptionsGrid->addMultiCellWidget (include,      7, 12, 0, 1);
605    bOptionsGrid->addRowSpacing (10, 90);
606    bOptionsGrid->addWidget (incAdd, 13, 0);
607    bOptionsGrid->addWidget (incDel, 13, 1);
608    bOptionsGrid->addWidget (exAdd,  13, 3);
609    bOptionsGrid->addWidget (exDel,  13, 4);
610    bOptionsGrid->addMultiCellWidget (incPending,  14, 14, 0, 1);
611    bOptionsGrid->addMultiCellWidget (exPending,   14, 14, 3, 4);
612    bOptionsGrid->addRowSpacing (15, 10);
613    bOptionsGrid->addMultiCellWidget (compare,     16, 16, 0, 4);
614    bOptionsGrid->addMultiCellWidget (bnfs,        17, 17, 0, 4);
615    bOptionsGrid->addMultiCellWidget (diff,        18, 18, 0, 4);
616
617    listImageDevs     = imageDevs;
618    listInclude       = include;
619    listExclude       = exclude;
620    checkBackupNFS    = bnfs;
621    checkCompare      = compare;
622    checkDifferential = diff;
623    pendingInclude    = incPending;
624    pendingExclude    = exPending;
625}
626
627void XMondo::initAdvancedTab (QWidget *&bAdvancedTab)
628{
629    QGridLayout *bAdvancedGrid;
630    QListView *excludeDevs;
631    QCheckBox *useLilo, *makeBootFloppies;
632#ifndef __FreeBSD__
633    QLabel *kernel;
634#endif
635    QLabel *bootDevice, *bootLoader;
636    QRadioButton *grub, *lilo, *boot0, *raw, *autodetect;
637    QHButtonGroup *radioBootLoader;
638    int rowAdd = 0;
639
640    bAdvancedTab     = new QWidget (backup, "bAdvancedTab");
641#ifndef __FreeBSD__
642    bAdvancedGrid    = new QGridLayout (bAdvancedTab, 11, 2, 5, 5, "bAdvancedGrid");
643    kernel           = new QLabel ("Kernel path:", bAdvancedTab, "kernel");
644    editKernel       = new QLineEdit (bAdvancedTab, "editKernel");
645    useLilo          = new QCheckBox ("Use LILO (instead of syslinux) for boot disk", bAdvancedTab, "useLilo");
646#else
647    bAdvancedGrid    = new QGridLayout (bAdvancedTab, 9, 2, 5, 5, "bAdvancedGrid");
648    useLilo          = 0;
649#endif
650    excludeDevs      = new QListView (bAdvancedTab, "excludeDevs");
651    makeBootFloppies = new QCheckBox ("Make boot floppies after backup", bAdvancedTab, "makeFloppies");
652    makeBootFloppies    -> setChecked (true);
653    bootDevice       = new QLabel ("Boot device:", bAdvancedTab, "bootDevice");
654    bootLoader       = new QLabel ("Boot loader:", bAdvancedTab, "bootLoader");
655    editBootDevice   = new QLineEdit (bAdvancedTab, "editBootDevice");
656    radioBootLoader  = new QHButtonGroup (bAdvancedTab, "radioBootLoader");
657    grub             = new QRadioButton ("GRUB", radioBootLoader);
658#ifdef __IA64
659    lilo             = new QRadioButton ("ELILO", radioBootLoader);
660#else
661    lilo             = new QRadioButton ("LILO", radioBootLoader);
662#endif
663#ifdef __FreeBSD__
664    boot0            = new QRadioButton ("boot0", radioBootLoader);
665#endif
666    raw              = new QRadioButton ("Raw", radioBootLoader);
667    autodetect       = new QRadioButton ("Auto", radioBootLoader);
668    autodetect          -> setChecked (true);
669
670    excludeDevs->addColumn ("Devices to exclude from backup:");
671    bAdvancedGrid->addMultiCellWidget (excludeDevs, 0, 5, 0, 1);
672#ifndef __FreeBSD__
673    bAdvancedGrid->addWidget (kernel, 6, 0, AlignRight);
674    bAdvancedGrid->addWidget (editKernel, 6, 1);
675    rowAdd = 1;
676#endif
677    bAdvancedGrid->addWidget (bootDevice, 6 + rowAdd, 0, AlignRight);
678    bAdvancedGrid->addWidget (editBootDevice, 6 + rowAdd, 1);
679    bAdvancedGrid->addWidget (bootLoader, 7 + rowAdd, 0, AlignRight);
680    bAdvancedGrid->addWidget (radioBootLoader, 7 + rowAdd, 1);
681    bAdvancedGrid->addMultiCellWidget (makeBootFloppies, 8 + rowAdd, 8 + rowAdd, 0, 1);
682#ifndef __FreeBSD__
683    // We know rowAdd = 1 so we can just use 10 instead of 9+rowAdd...
684    bAdvancedGrid->addMultiCellWidget (useLilo, 10, 10, 0, 1);
685#endif
686
687    listExcludeDevs       = excludeDevs;
688    bgBootLoader          = radioBootLoader;
689    checkUseLilo          = useLilo;
690    checkMakeBootFloppies = makeBootFloppies;
691}
692
693void XMondo::fillBkpinfo (struct s_bkpinfo *bkpinfo)
694{
695    reset_bkpinfo (bkpinfo);
696
697    switch (bgMediaType->id (bgMediaType->selected())) {
698    case 0:
699    bkpinfo->backup_media_type = cdr;
700    break;
701    case 1:
702    bkpinfo->backup_media_type = cdrw;
703    bkpinfo->wipe_media_first  = 1;
704    break;
705    case 2:
706    bkpinfo->backup_media_type = cdstream;
707    break;
708    case 3:
709    bkpinfo->backup_media_type = dvd;
710    break;
711    case 4:
712    bkpinfo->backup_media_type = iso;
713    strcpy (bkpinfo->isodir, editDOption->text());
714    break;
715    case 5:
716    bkpinfo->backup_media_type = nfs;
717    strcpy (bkpinfo->nfs_mount, editDOption->text());
718    while (system (QString ("mount | grep -qx '%1 .*'").arg (bkpinfo->nfs_mount))) {
719        if (QMessageBox::warning (this, "XMondo", QString ("%1 must be mounted. Please mount it and press Retry, or press Cancel to abort..").arg (bkpinfo->nfs_mount), "&Retry", "&Cancel")) {
720        return;
721        }
722    }
723    strcpy (bkpinfo->nfs_remote_dir, editNFSRemoteDir->text());
724    break;
725    case 6:
726    bkpinfo->backup_media_type = tape;
727    break;
728    case 7:
729    bkpinfo->backup_media_type = udev;
730    break;
731    }
732    switch (bgCompression->id (bgCompression->selected())) {
733    case 0:
734    bkpinfo->compression_level = 9;
735    break;
736    case 1:
737    bkpinfo->compression_level = 6;
738    break;
739    case 2:
740    bkpinfo->compression_level = 1;
741    break;
742    case 3:
743    bkpinfo->compression_level = 0;
744    break;
745    }
746    bkpinfo->cdrw_speed         = (bkpinfo->backup_media_type == cdstream) ? 2 : 4;
747    bkpinfo->use_lzo            = (bkpinfo->backup_media_type == cdstream) ? 1 : 0;
748    bkpinfo->nonbootable_backup = 0;
749    strcpy (bkpinfo->media_device, editDOption->text());
750    for (int i = 0; i <= MAX_NOOF_MEDIA; ++i) {
751    if (bkpinfo->backup_media_type != udev && bkpinfo->backup_media_type != tape) {
752        bkpinfo->media_size[i]  = editMediaSize->text().toInt();
753    } else {
754        bkpinfo->media_size[i]  = 0;
755    }
756    }
757    strcpy (bkpinfo->boot_device, editBootDevice->text());
758    switch (bgBootLoader->id (bgBootLoader->selected())) {
759    case 0:
760    bkpinfo->boot_loader    = 'G';
761    break;
762    case 1:
763    bkpinfo->boot_loader    = 'L';
764    break;
765#ifdef __FreeBSD__
766    case 2:
767    bkpinfo->boot_loader    = 'B';
768    break;
769    case 3:
770    bkpinfo->boot_loader    = 'R';
771    break;
772#else
773    case 2:
774    bkpinfo->boot_loader    = 'R';
775    break;
776#endif
777    default:
778    bkpinfo->boot_loader    = which_boot_loader (bkpinfo->boot_device);
779    break;
780    }
781#ifndef __FreeBSD__
782    bkpinfo->make_cd_use_lilo   = checkUseLilo->isChecked();
783#endif
784    bkpinfo->backup_data        = 1;
785    bkpinfo->verify_data        = checkCompare->isChecked();
786    bkpinfo->differential       = checkDifferential->isChecked();
787#ifndef __FreeBSD__
788    strcpy (bkpinfo->kernel_path, editKernel->text());
789    if (!bkpinfo->kernel_path[0]) {
790    strcpy (bkpinfo->kernel_path, call_program_and_get_last_line_of_output ("mindi --findkernel"));
791    if (!bkpinfo->kernel_path[0]) {
792        popup_and_OK_sub ("You left the kernel blank and I couldn't find one for you. Using my failsafe kernel.");
793        strcpy (bkpinfo->kernel_path, "FAILSAFE");
794    }
795    }
796    else if (!strcasecmp (bkpinfo->kernel_path, "FAILSAFE") ||
797         !strcasecmp (bkpinfo->kernel_path, "SUCKS")) {
798    for (char *p = bkpinfo->kernel_path; *p; ++p) {
799        *p = toupper (*p);
800    }
801    }
802    else if (!does_file_exist (bkpinfo->kernel_path)) {
803    strcpy (bkpinfo->kernel_path, call_program_and_get_last_line_of_output ("mindi --findkernel"));
804    if (!bkpinfo->kernel_path[0]) {
805        popup_and_OK_sub ("You specified a nonexistent kernel and I couldn't find one. Please correct the kernel location on the \"Advanced\" tab.");
806        return;
807    }
808    }
809#endif
810
811    for (QListViewItem *li = listImageDevs->firstChild(); li; li = li->itemBelow()) {
812    QCheckListItem *cli;
813    if ((cli = dynamic_cast <QCheckListItem*> (li)) && cli->isOn()) {
814        if (bkpinfo->image_devs[0])
815        strcat (bkpinfo->image_devs, " ");
816        strcat (bkpinfo->image_devs, li->text (0));
817    }
818    }
819    bkpinfo->include_paths[0] = '\0';
820    for (QListViewItem *li = listInclude->firstChild(); li; li = li->itemBelow()) {
821    if (bkpinfo->include_paths[0])
822        strcat (bkpinfo->include_paths, " ");
823    strcat (bkpinfo->include_paths, li->text (0));
824    }
825    for (QListViewItem *li = listExclude->firstChild(); li; li = li->itemBelow()) {
826    if (bkpinfo->exclude_paths[0])
827        strcat (bkpinfo->exclude_paths, " ");
828    strcat (bkpinfo->exclude_paths, li->text (0));
829    }
830    for (QListViewItem *li = listExcludeDevs->firstChild(); li; li = li->itemBelow()) {
831    QCheckListItem *cli;
832    if ((cli = dynamic_cast <QCheckListItem*> (li)) && cli->isOn()) {
833        if (bkpinfo->exclude_paths[0])
834        strcat (bkpinfo->exclude_paths, " ");
835        strcat (bkpinfo->exclude_paths, li->text (0));
836    }
837    }
838
839    if (!checkBackupNFS->isChecked()) {
840    char tmp[MAX_STR_LEN];
841    strncpy(tmp, list_of_NFS_devices_and_mounts(), MAX_STR_LEN);
842    if (bkpinfo->exclude_paths[0]) { strcat(bkpinfo->exclude_paths, " "); }
843    strcat(bkpinfo->exclude_paths, tmp);
844    }
845    sensibly_set_tmpdir_and_scratchdir (bkpinfo);
846}
847
848void XMondo::slotStartBackup()
849{
850  unlink(MONDO_LOGFILE);
851
852    if (geteuid()) {
853    fatal_error_sub ("Please run as root.");
854    exit (1);
855    }
856
857    struct s_bkpinfo *bkpinfo = new s_bkpinfo;
858    reset_bkpinfo (bkpinfo);
859   
860    bStartBackup->setEnabled (false);
861    bStartBackup->setText ("Initializing...");
862   
863    if (pre_param_configuration (bkpinfo)) {
864    fatal_error_sub ("Failed to pre-param initialize.");
865    exit (1);
866    }
867
868    fillBkpinfo (bkpinfo);
869
870    if (post_param_configuration (bkpinfo)) {
871    fatal_error_sub ("Failed to post-param initialize.");
872    exit (1);
873    }
874
875    XMondoBackup *backup = new XMondoBackup;
876    system (QString ("mkdir -p %1 %2").arg (bkpinfo->tmpdir).arg (bkpinfo->scratchdir).ascii());
877    g_operation_in_progress = 1;
878
879    stack->raiseWidget (3);
880    buttons->setEnabled (false);
881    bStartBackup->setEnabled (true);
882    bStartBackup->setText ("START");
883
884    int res;
885    if ((res = backup->run (bkpinfo)) > 0) {
886    popup_and_OK_sub ("Backup completed. However, there were some errors. Please check /var/log/mondo-archive.log for details.");
887    } else if (res == 0) {
888    popup_and_OK_sub ("Backup completed with no errors.");
889    }
890
891    buttons->setEnabled (true);
892    stack->raiseWidget (0); // backup widget
893    g_operation_in_progress = 0;
894}
895
896
897
898class XMondoDiffList : public QDialog
899{
900public:
901    XMondoDiffList (QWidget *parent, const char *name = 0, bool modal = TRUE, WFlags f = 0)
902    : QDialog (parent, name, modal, f)
903    {
904    QVBoxLayout *box = new QVBoxLayout (this, 5, 5, "xmondoDiffListBox");
905    QLabel *infoText = new QLabel ("<b>The following files were found to contain differences:</b>", this);
906    QListView *diffs = new QListView (this);
907    QPushButton *bOK = new QPushButton ("OK", this);
908
909    diffs->addColumn ("File");
910    diffs->addColumn ("Severity (1 to 3, 1 is low)");
911    diffs->setSelectionMode (QListView::NoSelection);
912    bOK->setDefault (true);
913    connect (bOK, SIGNAL(clicked()), this, SLOT(accept()));
914
915    box->addWidget (infoText);
916    box->addWidget (diffs);
917    box->addWidget (bOK);
918
919    QFile file ("/tmp/changed.files");
920    if (file.open (IO_ReadOnly)) {
921        QTextStream stream (&file);
922        QString line;
923        int i = 1;
924        while (!stream.atEnd()) {
925        line = stream.readLine();
926        (void) new QListViewItem (diffs, line, QString::number
927                      (severity_of_difference (const_cast<char*> (line.ascii()), 0)));
928        }
929        file.close();
930    } else {
931        popup_and_OK_sub ("Compare completed with errors.");
932    }
933    }
934
935    virtual ~XMondoDiffList() {}
936};
937
938void XMondo::slotStartCompare()
939{
940    struct s_bkpinfo bi;
941    struct s_bkpinfo *bkpinfo = &bi;
942    reset_bkpinfo (bkpinfo);
943   
944    if (geteuid()) {
945    fatal_error_sub ("Please run as root.");
946    }
947
948    bStartCompare->setEnabled (false);
949    bStartCompare->setText ("Initializing...");
950
951    if (pre_param_configuration (bkpinfo)) {
952    fatal_error_sub ("Failed to pre-param initialize.");
953    exit (1);
954    }
955    switch (bgCompareMediaType->id (bgCompareMediaType->selected())) {
956    case 0:
957    bkpinfo->backup_media_type = cdr;
958    break;
959    case 1:
960    bkpinfo->backup_media_type = cdrw;
961    bkpinfo->wipe_media_first  = 1;
962    break;
963    case 2:
964    bkpinfo->backup_media_type = cdstream;
965    break;
966    case 3:
967    bkpinfo->backup_media_type = dvd;
968    break;
969    case 4:
970    bkpinfo->backup_media_type = iso;
971    strcpy (bkpinfo->isodir, compareEditDOption->text());
972    break;
973    case 5:
974    bkpinfo->backup_media_type = nfs;
975    strcpy (bkpinfo->nfs_mount, compareEditDOption->text());
976    while (system (QString ("mount | grep -qx '%1 .*'").arg (bkpinfo->nfs_mount))) {
977        if (QMessageBox::warning (this, "XMondo", QString ("%1 must be mounted. Please mount it and press Retry, or press Quit to abort..").arg (bkpinfo->nfs_mount), "&Retry", "&Quit")) {
978        return;
979        }
980    }
981    strcpy (bkpinfo->nfs_remote_dir, compareEditNFSRemoteDir->text());
982    break;
983    case 6:
984    bkpinfo->backup_media_type = tape;
985    break;
986    case 7:
987    bkpinfo->backup_media_type = udev;
988    break;
989    }
990
991    strcpy (bkpinfo->media_device, compareEditDOption->text());
992    bkpinfo->verify_data        = 1;
993    bkpinfo->backup_data        = 0;
994
995    sensibly_set_tmpdir_and_scratchdir (bkpinfo);
996    if (post_param_configuration (bkpinfo)) {
997    fatal_error_sub ("Failed to post-param initialize.");
998    exit (1);
999    }
1000
1001    XMondoBackup *backup = new XMondoBackup;
1002    system (QString ("mkdir -p %1 %2").arg (bkpinfo->tmpdir).arg (bkpinfo->scratchdir).ascii());
1003    g_operation_in_progress = 1;
1004
1005    stack->raiseWidget (3);
1006    buttons->setEnabled (false);
1007    bStartCompare->setEnabled (true);
1008    bStartCompare->setText ("START");
1009
1010    if (backup->compare (bkpinfo)) {
1011    if (does_file_exist ("/tmp/changed.files")) {
1012        XMondoDiffList *xmdl = new XMondoDiffList (this);
1013        xmdl->exec();
1014        unlink ("/tmp/changed.txt");
1015        unlink ("/tmp/changed.files");
1016    } else
1017        popup_and_OK_sub ("Compare completed with errors.");
1018    } else {
1019    popup_and_OK_sub ("Compare completed with no differences. Your backup is perfect.");
1020    }
1021
1022    buttons->setEnabled (true);
1023    stack->raiseWidget (1); // compare widget
1024    g_operation_in_progress = 0;
1025}
1026
1027void XMondo::slotPrevRestore()
1028{
1029    rPrev->hide();
1030    rNext->setText ("Next ->");
1031    rNext->setEnabled (true);
1032    rNext->show();
1033    delete rstr; rstr = 0;
1034    restoreStack->raiseWidget (0);
1035    delete restoreFiles;
1036}
1037
1038void XMondo::slotNextRestore() 
1039{
1040    if (rNext->text() == "Next ->") {
1041    rNext->setEnabled (false);
1042    rNext->setText ("Finish");
1043    rPrev->show();
1044
1045    restoreFiles = new QWidget (restoreStack);
1046    restoreStack->addWidget (restoreFiles, 1);
1047
1048    rstr = new XMondoRestore (restoreFiles, bgRestoreMediaType, restoreEditDOption, restoreEditNFSRemoteDir, restoreFilter);
1049    if (!rstr->good()) {
1050        slotPrevRestore();
1051        return;
1052    }
1053    restoreStack->raiseWidget (1);
1054    while (rstr && !rstr->isSetupDone() && rstr->good()) {
1055        kapp->processEvents();
1056        usleep (50000);
1057    }
1058    if (!rstr) return;
1059    if (rstr->isSetupDone() && rstr->good()) {
1060        rNext->setEnabled (true);
1061    }
1062    } else {
1063    stack->raiseWidget (3);
1064    buttons->setEnabled (false);
1065    rstr->go();
1066    if (!rstr->good()) {
1067        return;
1068    }
1069    delete rstr; rstr = 0;
1070    stack->raiseWidget (2);
1071    buttons->setEnabled (true);
1072
1073    rNext->setText ("Next ->");
1074    rNext->setEnabled (true);
1075    rPrev->hide();
1076    restoreStack->raiseWidget (0);
1077    delete restoreFiles;
1078    }
1079    rNext->show();
1080}
1081
1082void XMondo::slotAddInclude()
1083{
1084    if (!(pendingInclude->text().isEmpty()) && pendingInclude->text().at(0) == '/') {
1085    (void) new QListViewItem (listInclude, pendingInclude->text());
1086    pendingInclude->setText ("");
1087    }
1088}
1089
1090void XMondo::slotDelInclude()
1091{
1092    QListViewItem *selection = listInclude->selectedItem();
1093    if (!selection) return;
1094    QString txt = selection->text (0);
1095    listInclude->takeItem (selection);
1096    delete selection;
1097    pendingInclude->setText (txt);
1098}
1099
1100void XMondo::slotAddExclude()
1101{
1102    if (!(pendingExclude->text().isEmpty()) && pendingExclude->text().at(0) == '/') {
1103    (void) new QListViewItem (listExclude, pendingExclude->text());
1104    pendingExclude->setText ("");
1105    }
1106}
1107
1108void XMondo::slotDelExclude()
1109{
1110    QListViewItem *selection = listExclude->selectedItem();
1111    if (!selection) return;
1112    QString txt = selection->text (0);
1113    listExclude->takeItem (selection);
1114    delete selection;
1115    pendingExclude->setText (txt);
1116}
1117
1118void XMondo::slotTabChange (QWidget *newtab)
1119{
1120    if (newtab == tabOptions) {
1121    QStringList result;
1122    QListViewItem *item, *itembelow;
1123    QCheckListItem *checkitem, *below;
1124    QStringList checkedBoxes;
1125#ifdef __FreeBSD__
1126    result = QStringList::split (" ", call_program_and_get_last_line_of_output ("ls -1 /dev/ad??* /dev/da??* 2>/dev/null | tr '\n' ' ' | tr -s ' '; echo"));
1127#else
1128    result = QStringList::split (" ", call_program_and_get_last_line_of_output ("ls -1 /dev/ide/host?/bus?/target?/lun?/part? /dev/hd??* /dev/scsi/host?/bus?/target?/lun?/part? /dev/sd??* 2>/dev/null | tr '\n' ' ' | tr -s ' '; echo"));
1129#endif
1130    for (item = listImageDevs->firstChild(); item; item = itembelow) {
1131        if ((checkitem = dynamic_cast <QCheckListItem*> (item))) {
1132        if (checkitem->isOn()) {
1133            if (checkedBoxes.grep (checkitem->text()).empty()) {
1134            checkedBoxes += checkitem->text();
1135            }
1136        }
1137        }
1138        itembelow = item->itemBelow();
1139        listImageDevs->takeItem (item);
1140        delete item;
1141    }
1142    for (QStringList::iterator it = result.begin(); it != result.end(); ++it) {
1143        if (is_this_device_mounted (const_cast <char*> ((*it).ascii()))) continue;
1144        checkitem = new QCheckListItem (listImageDevs, *it, QCheckListItem::CheckBox);
1145        for (itembelow = listExcludeDevs->firstChild(); itembelow; itembelow = itembelow->itemBelow()) {
1146        if (itembelow->text (0) == checkitem->text (0) && (below = dynamic_cast <QCheckListItem*> (itembelow)) && below->isOn()) {
1147            delete checkitem;
1148            checkitem = 0;
1149            (void) new QListViewItem (listImageDevs, QString ("%1 is excluded (can't be both)").arg (*it));
1150            break;
1151        }
1152        }
1153        if (checkedBoxes.grep (QRegExp (*it + "$")).count() && checkitem) {
1154        checkitem->setOn (true);
1155        }
1156    }
1157    }
1158    if (newtab == tabAdvanced) {
1159    QStringList result;
1160    QListViewItem *item, *itembelow;
1161    QCheckListItem *checkitem, *below;
1162    QStringList checkedBoxes;
1163    result = QStringList::split (" ", call_program_and_get_last_line_of_output ("mount | grep '^/dev/' | cut -d' ' -f1 | tr '\n' ' '; echo"));
1164    for (item = listExcludeDevs->firstChild(); item; item = itembelow) {
1165        if ((checkitem = dynamic_cast <QCheckListItem*> (item))) {
1166        if (checkitem->isOn()) {
1167            if (checkedBoxes.grep (checkitem->text()).empty()) {
1168            checkedBoxes += checkitem->text();
1169            }
1170        }
1171        }
1172        itembelow = item->itemBelow();
1173        listExcludeDevs->takeItem (item);
1174        delete item;
1175    }
1176    for (QStringList::iterator it = result.begin(); it != result.end(); ++it) {
1177        checkitem = new QCheckListItem (listExcludeDevs, *it, QCheckListItem::CheckBox);
1178        for (itembelow = listImageDevs->firstChild(); itembelow; itembelow = itembelow->itemBelow()) {
1179        if (itembelow->text (0) == checkitem->text (0) && (below = dynamic_cast <QCheckListItem*> (itembelow)) && below->isOn()) {
1180            delete checkitem;
1181            checkitem = 0;
1182            (void) new QListViewItem (listExcludeDevs, QString ("%1 is imaged (can't be both)").arg (*it));
1183            break;
1184        }
1185        }
1186        if (checkedBoxes.grep (QRegExp (*it + "$")).count() && checkitem) {
1187        checkitem->setOn (true);
1188        }
1189    }
1190    }
1191
1192}
Note: See TracBrowser for help on using the repository browser.