Projects/ds4clonerestore/ds4clonerestore/src/revmanager.cpp

00001 /******************************************************
00002 * DS4 Clone-Restore
00003 *
00004 * DS4 Laser Technology srl
00005 *
00006 * author: Carsana Francesco <francescocarsana@ds4.it>
00007 *******************************************************/
00008 
00009 
00010 #include "revmanager.h"
00011 
00012 
00013 RevManager::RevManager(QWidget* parent, const char* name, WFlags fl)
00014         : revManagerDlg(parent,name,fl)
00015 {
00016     mainWin = parent;
00017     proc = new QProcess(); // oggetto per lanciare un comando esterno
00018     
00019     strcpy(deviceRev,RevDevice().ascii());
00020 
00021     // collegamento per gestire standard output/error del comando
00022     connect( proc, SIGNAL(readyReadStdout()), this, SLOT(readFromStdErrOut()) );
00023     connect( proc, SIGNAL(readyReadStderr()), this, SLOT(readFromStdErrOut()) );
00024 }
00025 
00026 
00027 RevManager::~RevManager()
00028 {
00029     delete proc;
00030     proc = NULL;
00031 }
00032 
00033 
00034 void RevManager::Init(bool *mounted)
00035 {
00036     revMounted = mounted;
00037     if (*revMounted == FALSE) // se il Rev è smontato
00038     {
00039         if (MountRev() == TRUE) // monto il Rev
00040         {
00041             *revMounted = TRUE;
00042             ledStatus->setColor(Qt::green); // led verde
00043             this->UpdatePgbUsage(); // Calcolo lo spazio rimanente sul Rev e aggiorno la progress bar
00044         }
00045         else
00046         {
00047             *revMounted = FALSE;
00048             ledStatus->setColor(Qt::red); // led rosso
00049             pgbUsage->setProgress(0); // svuoto la progress bar di utilizzo del Rev
00050         }
00051     }
00052     else // Rev montato
00053     {
00054         this->UpdatePgbUsage(); // Calcolo lo spazio rimanente sul Rev e aggiorno la progress bar
00055     }
00056 }
00057 
00058 
00059 void RevManager::UpdatePgbUsage()
00060 {
00061     QTextStream t (dfStringErrOut, IO_ReadOnly); // stream per leggere l'utput di df
00062     QString s; // stringa temporanea
00063 
00064     dfStringErrOut=""; // cancello l'eventuale output
00065 
00066     proc->clearArguments(); // cancello il comando precedente
00067 
00068     proc->addArgument("df"); // comando df (spazio libero device)
00069     proc->addArgument("-hT"); // primo parametro
00070     proc->addArgument("--type=udf"); // secondo parametro
00071     proc->addArgument("--sync"); // terzo parametro
00072 
00073     proc->start(); // eseguo il comando
00074 
00075     while (proc->isRunning()) // aspetto la terminazione del comando
00076     {
00077         qApp->processEvents();
00078     }
00079 
00080     // Calcolo lo spazio rimanente sul Rev e aggiorno la progress bar
00081     s = t.readLine(); // leggo una linea dell'output
00082     if ( (s.isEmpty()) || ( s.left(10) != "Filesystem" ) ) // se l'output di df non è quello atteso
00083     {
00084         // dialog di errore
00085         QMessageBox::critical(this,"Error","Error running df command!",
00086                               QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00087         return;
00088     }
00089 
00090     // faccio il parsing dell'output
00091     while (!t.eof()) // se non raggiungo la fine dell'output
00092     {
00093         s = t.readLine(); // leggo una linea dell'output
00094         s = s.simplifyWhiteSpace(); // rimuovo gli spazi superflui
00095         if (!s.isEmpty()) // se la stringa non è vuota
00096         {
00097             if (s.find(' ') < 0) // nome del dispositivo troppo lungo
00098             {
00099                 if (!t.eof()) // se non sono alla fine dello stream
00100                 {
00101                     s = s.append(t.readLine()); // appendo la linea successiva
00102                     s = s.simplifyWhiteSpace(); // rimuovo gli spazi superflui
00103                 }
00104             }
00105 
00106             if(s.left(s.find(' ')) == deviceRev) // se la linea di output descrive il rev
00107             {
00108                 QString p; // stringa temporanea per la percentuale
00109 
00110                 s = s.remove(0,s.find(' ')+1); // elimino dalla stringa il nome del dispositivo
00111 
00112                 s = s.remove(0,s.find(' ')+1); // elimino dalla stringa il tipo di filesystem
00113                 // con i parametri che ho passato visualizzo solo udffs
00114 
00115                 s = s.remove(0,s.find(' ')+1); // elimino dalla stringa la dimensione del Rev (la conosco!)
00116 
00117                 spaceUsed = s.left(s.find(' ')); // estraggo lo spazio utilizzato
00118                 lblUsed->setText("Used space: " + spaceUsed); // aggiorno la label spazio occupato
00119                 s = s.remove(0,s.find(' ')+1); // elimino dalla stringa lo spazio utilizzato
00120 
00121                 spaceFree = s.left(s.find(' ')); // estraggo lo spazio rimanente
00122                 lblFree->setText("Free space: " + spaceFree); // aggiorno la label spazio libero
00123                 s = s.remove(0,s.find(' ')+1); // elimino dalla stringa lo spazio utilizzato
00124 
00125                 p = s.left(s.find(' ')); // estraggo la percentuale occupata
00126                 p = p.remove('%'); // rimuovo il carattere %
00127                 percent = p.toInt(); // converto in intero
00128                 pgbUsage->setProgress(percent); // aggiorno la progress bar di occupazione
00129 
00130                 s = "";
00131             }
00132         }
00133     }
00134 }
00135 
00136 
00137 void RevManager::btnFormat_clicked()
00138 {
00139     if (*revMounted == TRUE) // se il Rev è montato
00140     {
00141         if (UmountRev() == TRUE) // smonto il Rev
00142         {
00143             *revMounted = FALSE;
00144             ledStatus->setColor(Qt::red); // led rosso
00145             pgbUsage->setProgress(0); // svuoto la progress bar di utilizzo del Rev
00146             lblUsed->setText("Used space: "); // cancello la label spazio occupato
00147             lblFree->setText("Free space: "); // cancello la label spazio libero
00148         }
00149         else
00150         {
00151             *revMounted = TRUE;
00152             // dialog di errore
00153             QMessageBox::critical(this,"Error","Unable to umount Rev!",
00154                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00155             return;
00156         }
00157     }
00158     else // se il Rev è smontato
00159     {
00160         // monto e smonto il Rev per vedere se è inserito
00161 
00162         if (MountRev() == FALSE) // monto il Rev
00163         {
00164             // se non riesco a montarlo
00165             // dialog di errore
00166             QMessageBox::critical(this,"Error","Rev Error!",
00167                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00168             return;
00169         }
00170         if (UmountRev() == FALSE) // smonto il Rev
00171         {
00172             // se non riesco a smontarlo
00173             // dialog di errore
00174             QMessageBox::critical(this,"Error","Rev Error!",
00175                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00176             pgbUsage->setProgress(0); // svuoto la progress bar di utilizzo del Rev
00177             lblUsed->setText("Used space: "); // cancello la label spazio occupato
00178             lblFree->setText("Free space: "); // cancello la label spazio libero
00179         }
00180     }
00181 
00182     if( QMessageBox::warning(this,"Format","Do you want to format Rev?\n\nAll data will be lost!",                                        "Format","Cancel", 0, 0, 1 ) == 0)
00183     {
00184         // Formatto il Rev
00185 
00186         proc->clearArguments(); // cancello il comando precedente
00187 
00188         proc->addArgument("mkudffs"); // comando formattazione
00189         proc->addArgument(deviceRev); // primo parametro
00190 
00191         proc->start(); // eseguo il comando
00192 
00193         while (proc->isRunning()) // aspetto la terminazione del comando
00194         {
00195             qApp->processEvents();
00196         }
00197         
00198         QMessageBox::information(this,"Finish","Rev formatted successfully!",
00199                                  QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00200     }
00201 }
00202 
00203 
00204 void RevManager::btnMount_clicked()
00205 {
00206     if (*revMounted == TRUE) // se il Rev è montato
00207     {
00208         if (UmountRev() == TRUE) // smonto il Rev
00209         {
00210             EjectRev(); // espulsione Rev
00211             *revMounted = FALSE;
00212             ledStatus->setColor(Qt::red); // led rosso
00213             pgbUsage->setProgress(0); // svuoto la progress bar di utilizzo del Rev
00214             lblUsed->setText("Used space: "); // cancello la label spazio occupato
00215             lblFree->setText("Free space: "); // cancello la label spazio libero
00216         }
00217         else
00218         {
00219             *revMounted = TRUE;
00220             // dialog di errore
00221             QMessageBox::critical(this,"Error","Unable to umount Rev!",
00222                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00223         }
00224     }
00225     else // se il Rev è smontato
00226     {
00227         if (MountRev() == TRUE) // monto il Rev
00228         {
00229             *revMounted = TRUE;
00230             ledStatus->setColor(Qt::green); // led verde
00231             this->UpdatePgbUsage(); // Calcolo lo spazio rimanente sul Rev e aggiorno la progress bar
00232         }
00233         else
00234         {
00235             *revMounted = FALSE;
00236             // dialog di errore
00237             QMessageBox::critical(this,"Error","Unable to mount Rev!",
00238                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00239         }
00240     }
00241 }
00242 
00243 
00244 void RevManager::btnCancel_clicked()
00245 {
00246     this->Close(); // chiudo la finestra di gestione del Rev
00247 }
00248 
00249 
00250 void RevManager::closeEvent (QCloseEvent *e)
00251 {
00252     e->accept(); // accetto l'evento di chiusura
00253     this->Close(); // chiudo la finestra di gestione del Rev
00254 }
00255 
00256 
00257 void RevManager::Close()
00258 {
00259     this->hide(); // nascondo la finestra di gestione del Rev
00260     mainWin->setEnabled(TRUE); // abilito la finestra principale
00261 }
00262 
00263 
00264 void RevManager::readFromStdErrOut()
00265 {
00266     dfStringErrOut.append(proc->readStdout()); // aggiungo l'output
00267 }
00268 
00269 #include "revmanager.moc"
00270 

Generato il Wed Jun 13 18:59:37 2007 per DS4CloneRestore da  doxygen 1.5.2