/***************************************************************************
 *   Copyright (C) 2004 by ImoLUG Staff                                    *
 *   developers@imolug.org                                                 *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#include "qtswaret.h"
#include <stdlib.h>
#include <unistd.h>
#include <kapplication.h>
#include <kaboutdata.h>
#include <kcmdlineargs.h>
#include <klocale.h>
#include <qmessagebox.h>
#include <qfile.h>
// Cotruttore della classe

QtSwaret::QtSwaret(QWidget* parent, const char* name, WFlags fl)
    : MainDlg(parent,name,fl)
{
    // Imposto l'indice della progressbar a zero
    ipd = 0;
    // La progressdialog e' NULL quando non viene visualizzata e utilizzata
    pd = NULL;
    // Il processo proc e' NULL all'inizio
    proc = NULL;
    // Leggo il file di configurazione
    ReadConfigFile();
    // File di configurazione SPI
    readSPIConfigFile();
    // Listo i pacchetti installati nella sezione remove
    ListInstalled();
    // Controllo se e' installato SPI
    QFile* binspi = new QFile( BINSPI );
    if(! binspi->exists() )
        ConfTab->setTabEnabled( ConfTab->page( 3 ), FALSE );
if(! binspi->exists() )
	BtnSearchPacket_2->setEnabled( FALSE );
if(! binspi->exists() )
	pushButton23->setEnabled( FALSE );
if( getuid() )
	{
		ConfTab->setTabEnabled(  ConfTab->page( 0 ), FALSE );
		ConfTab->setTabEnabled(  ConfTab->page( 1 ), FALSE );
		ConfTab->setTabEnabled(  ConfTab->page( 2 ), FALSE );
		ConfTab->setTabEnabled(  ConfTab->page( 3 ), FALSE );
		BtnSearchPacket->setEnabled( FALSE );
    		BtnPacketInstall->setEnabled( FALSE );
    		BtnPacketUpgrade->setEnabled( FALSE );
    		BtnAllUpgrade->setEnabled( FALSE );
		BtnPacketRemove->setEnabled( FALSE );
    		BtnUpdate->setEnabled( FALSE );
		pushButton21->setEnabled( FALSE );
	}
}
// Disruttore della classe (non metto nulla, quando viene distrutta la classe si chiude l'applicazione)

QtSwaret::~QtSwaret()
{}


// Invocata quando viene selezionato un pacchetto dalla lista dei pacchetti trovati

void QtSwaret::PacketIsSelected()
{
    QListViewItem *selectedRow = 0;
    
    // Svuoto la finestra delle info
    TextInfo->clear();
    //TextInfo2->clear();
    
    // Prendo il nome del pacchetto che si vuol visualizzare
    QString myPacketName = "";
      
        if( MainTab->currentPageIndex() == 0 )
        selectedRow = ListPacketFound->currentItem();
    
    
    if( selectedRow != 0 )
        myPacketName = selectedRow->text( 0 );
    
    if(myPacketName == "")
    	QMessageBox::warning( 0, "QtSwaret - Error", "No package selected!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {        
        // Scrivo il log
	//TextInfo->append("");
        
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();
        
        // Creo il processo Swaret --show
    	proc = new QProcess;
    	proc->addArgument("swaret");
    	proc->addArgument("--show");
    	proc->addArgument(myPacketName);
    
    	// Connetto il processo per catturare l'output
    	connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadShowOutput()) );
    	connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );
    
    	// Lancio il processo
    	proc->start();
    }
}


// Invocata sul click del bottone CERCA

void QtSwaret::SearchPacket()
{
    // Prendo il nome del pacchetto che si vuol cercare
    QString myPacketName = EditSearchPacket->text();
    
    // Pulisco la lista dei pacchetti trovati
    ListPacketFound->clear();
    
    if(myPacketName == "")
    	QMessageBox::warning( 0, "QtSwaret - Error", "No package to search!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {
	// Scrivo il log
	EditLogs->append("" + myPacketName + "");
	
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();
        
        // Creo la progress dialog
        pd = new QProgressDialog ( "Search for packages contains \n" + myPacketName + "\n keyword, Please wait...", "Exit", 100, this, "ProgressDialog", TRUE );
        
	// Creo il processo Swaret --search
	proc = new QProcess;
	proc->addArgument("swaret");
	proc->addArgument("--search");
	proc->addArgument(myPacketName);
	
	// Connetto il processo per catturare l'output
	connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadSearchOutput()) );
	connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );
	
	// Lancio il processo
	proc->start();
    }
}

// Invocata sul click del bottone INSTALL

void QtSwaret::InstallPacket()
{
    // Prendo il nome del pacchetto che si vuol installare
    QString myPacketName = "";
    QListViewItem *selectedRow = ListPacketFound->currentItem();
    if( selectedRow != 0 )
        myPacketName = selectedRow->text( 0 );
    
    if(myPacketName == "")
    	QMessageBox::warning( 0, "QtSwaret - Error", "No package selected!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {
    	// Scrivo il log
	EditLogs->append("Installing...");
	
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();
	
	// Creo la progress dialog
        pd = new QProgressDialog ( "Download and Install \n" + myPacketName + " \n Please wait...", "Exit", 100, this, "ProgressDialog", TRUE );
        
    	// Creo il processo Swaret --install
        proc = new QProcess;
        proc->addArgument("swaret");
        proc->addArgument("--install");
        proc->addArgument(myPacketName);
    
    	// Connetto il processo per catturare l'output
    	connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadInstallOutput()) );
    	connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );
    
    	// Lancio il processo
    	proc->start();
    }
}

// Invocata sul click del bottone AGGIORNA

void QtSwaret::UpgradePacket()
{
    // Prendo il nome del pacchetto che si vuol installare
    QString myPacketName = "";
    QListViewItem *selectedRow = ListPacketFound->currentItem();
    if( selectedRow != 0 )
        myPacketName = selectedRow->text( 0 );
    
    if(myPacketName == "")
    	QMessageBox::warning( 0, "QtSwaret - Error", "No package selected!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {
    	// Scrivo il log
	EditLogs->append("Upgrading...");
	
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();
	
	// Creo la progress dialog
        pd = new QProgressDialog ( "Upgrading " + myPacketName + ", Please wait...", "Exit", 100, this, "ProgressDialog", TRUE );
        
    	// Creo il processo Swaret --upgrade nomepacchetto
        proc = new QProcess;
        proc->addArgument("swaret");
        proc->addArgument("--upgrade");
        proc->addArgument(myPacketName);
    
    	// Connetto il processo per catturare l'output
    	connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadUpgradeOutput()) );
    	connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );
    
    	// Lancio il processo
    	proc->start();
    }
}

// Invocata sul click del bottone AGGIORNA TUTTI

void QtSwaret::UpgradeAll()
{
    if ( QMessageBox::question( 0, "QtSwaret - Question", "Do you want to upgrade your distribution?", tr("&Yes"), tr("&No"),  QString::null, 0, 1 ) )
        return;
    
    // Pulisco la lista dei pacchetti trovati
    ListPacketFound->clear();
        
    // Disabilito i bottoni per prevenire l'input da parte del'utente
    DisableButtons();
    
    // Scrivo il log
    EditLogs->append("*** Upgrading distribution. Please wait...***\n");
    
    // Creo il processo Swaret --upgrade all
    proc = new QProcess;
    proc->addArgument("swaret");
    proc->addArgument("--upgrade");

    // Connetto il processo per catturare l'output
    connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadUpgradeAllOutput()) );
    connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );

    // Lancio il processo
    proc->start();
}

// Invocata sul click del bottone PULISCI

void QtSwaret::Clear()
{
    // Pulisco la finestra delle info
    TextInfo->clear();
    
    // Pulisco la lista dei pacchetti trovati
    ListPacketFound->clear();
    
    // Pulisco la edit della ricerca
    EditSearchPacket->clear();
}

// Invocata sul click del bottone PULISCI LOGS

void QtSwaret::ClearLogs()
{
    // Pulisce la edit dei logs delle operazioni
    EditLogs->clear();
}

// Invocata sul click del bottone REFRESH

void QtSwaret::ListInstalled()
{
    // Pulisco la lista dei pacchetti trovati
    ListInstalledPacket->clear();
    
    // Creo la lista dei files contenuti nella sirectory '/var/log/packages'
    QDir d( "/var/log/packages" );
    if (! d.exists() )
    {
        QMessageBox::critical( 0, "QtSwaret - Error", "CORRUPTED SLACKWARE INSTALLATION!", QMessageBox::Ok, QMessageBox::NoButton );
        return;
    }
    
    const QFileInfoList *list = d.entryInfoList();
    QFileInfoListIterator it( *list );
    QFileInfo *fi;

    // Riempio la lista dei pacchetti installati
    while ( (fi = it.current()) != 0 ) 
    {
        QString *myFileName = new QString( fi->fileName() );
        if(! myFileName->startsWith( "." ) && ! myFileName->startsWith( ".." ) )
            ListInstalledPacket->insertItem( *myFileName );
        ++it;
    }
}

// Invocata sul click del bottone REMOVE

void QtSwaret::RemovePacket()
{
    QString packetToRemove = ListInstalledPacket->currentText();
    
    if(packetToRemove == "")
        QMessageBox::warning( 0, "QtSwaret - Error", "No package selected!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {
        if ( QMessageBox::question( 0, "QtSwaret - Question", "Do you want to remove " + packetToRemove + "?", tr("&Yes"), tr("&No"),  QString::null, 0, 1 ) )
            return;
        
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();    
	
	// Creo la progress dialog
        pd = new QProgressDialog ( "Removing selected package, Please wait...", "Exit", 2, this, "ProgressDialog", TRUE );
                  
        // Creo il processo RemovePKG
        proc = new QProcess;
        proc->addArgument("removepkg");
        proc->addArgument(packetToRemove);
    
        // Connetto il processo per catturare l'output
        connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadRemoveOutput()) );
        connect(proc, SIGNAL(processExited()), this, SLOT(RemoveFinished()) );
        
        // Lancio il processo
        proc->start();
    }
}

// Invocata sul click del bottone UPDATE

void QtSwaret::Update()
{
    // Se risponde no esco dalla funzione
    if ( QMessageBox::question( 0, "QtSwaret - Question", "Do you want to start the database update?", tr("&Yes"), tr("&No"),  QString::null, 0, 1 ) )
        return;
   
    // Disabilito i bottoni per prevenire l'input da parte del'utente
    DisableButtons();
    
    // Scrivo il log
    EditLogs->append("Swaret Database updating...");
    
    // Creo la progress dialog
    pd = new QProgressDialog ( "Please wait...", "Exit", 3, this, "ProgressDialog", TRUE );
	
    // Creo il processo Swaret --update
    proc = new QProcess;
    proc->addArgument("swaret");
    proc->addArgument("--update");
   

    // Connetto il processo per catturare l'output del processo terminato
    connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadUpdateOutput()) );
    connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );

    // Lancio il processo
    proc->start();
}

// Invocata sul click del bottone SALVA CONFIGURAZIONE 2

void QtSwaret::SaveConf()
{
    if ( QMessageBox::question( 0, "QtSwaret - Question", "Do you want to write the configuration file?", tr("&Yes"), tr("&No"),  QString::null, 0, 1 ) )
        return;
        
    WriteConfigFile();
}


//--------------------------------------------------------------------------------------------------------------------------------------------


// Funzione generale che cattura l'output di show di SWARET

void QtSwaret::ReadShowOutput()
{    
    // Fino a che il processo restituisce un output lo inserisco nella finestra delle info
    while(!((StdoutStr = new QString(proc->readStdout()))->isNull()))
    {
	if(! (StdoutStr->startsWith("swaret")) && ! (StdoutStr->startsWith("Please")) && ! ((StdoutStr->ascii())[0] == '') )
        {
            if( MainTab->currentPageIndex() == 0 )
                TextInfo->append(*StdoutStr); 
            //else if( MainTab->currentPageIndex() == 2 )
               // TextInfo2->append(*StdoutStr); 
        }
	
    }

    			
	
}

// Funzione generale che cattura l'output di update database di SWARET

void QtSwaret::ReadUpdateOutput()
{    
    // Avanzamento progress bar
    pd->setProgress( 1 );
    
    // Fino a che il processo restituisce un output lo inserisco nella finestra dei logs
    while(!((StdoutStr = new QString(proc->readStdout()))->isNull()))
    {
	if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
	if( StdoutStr->contains( "Generating" ) )
	{
            QMessageBox::information( 0, "Swaret Update", "Success! Check logs to examine the result", QMessageBox::Ok, QMessageBox::NoButton );
	    return;
	}
        // Se l'utente ha cancellato il processo 'killo' pkgtool
        if ( pd->wasCanceled() )
            proc->kill();            
    }
}

// Funzione che cattura l'output di installazione di SWARET

void QtSwaret::ReadInstallOutput()
{    
    QString depsString = "";
    QString tmpString = "";
    bool isDep = FALSE;
    
    // Fino a che il processo restituisce un output 
    while(!((StdoutStr = new QString(proc->readStdout()))->isNull()))
    {  
    	// Compongo la lista delle dipendenze
        if( StdoutStr->contains( "requires" ) )
        {
            tmpString = *StdoutStr; tmpString.remove( "%" );
            depsString += tmpString.section('\n', 0, 0); depsString += "\n";
        }   
        
        // Se la lista delle dipendenze e' completa mostro il msg a video
        if( depsString != "" && ! (StdoutStr->contains( "requires" )) )
            QMessageBox::warning( 0, "QtSwaret - Dependencies", "Dependencies list:\n\n" + depsString, QMessageBox::Ok, QMessageBox::NoButton );
        
        // Quando chiede conferma chiedo all'utente se vuole continuare
	if( StdoutStr->contains( "(y/n/A/Q)" ) )
	{
            // Se e' la prima volta che chiede di installare un pacchetto NON e' una dipendenza
            if( isDep == FALSE )
            {    
                if ( QMessageBox::question( 0, "QtSwaret - Question", "Do you want to install " + StdoutStr->section(' ', 1, 1) + "?", tr("&Yes"), tr("&No"),  QString::null, 1, 0 ) )
                {
                    proc->writeToStdin( "n\n" );
                    EditLogs->append("\n\n*** Installation stopped! ***");
                    return;
                }
                else
                    proc->writeToStdin( "y\n" );
            }
            
            // Altrimenti e' una dipendenza
            else
            {
                if ( QMessageBox::question( 0, "QtSwaret - Question", "Do you want to install this dependency:\n\n" + StdoutStr->section(' ', 1, 1) + "?", tr("&Yes"), tr("&No"),  QString::null, 1, 0 ) )
                    proc->writeToStdin( "n\n" );
                else
                    proc->writeToStdin( "y\n" );
            }
            
            // Dopo la prima volta che entra in questo ciclio setto il boolenano a TRUE perche' le volte successive si trattera' di una dipendenza
            if( isDep == FALSE)   
                isDep = TRUE;
	}
        
        // Scrivo i logs dell'operazione
        if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
            
        // Avanzamento progress bar
        if( ipd < 99 )
            pd->setProgress( ++ipd );
        
        // Se l'utente ha cancellato il processo 'killo' swaret
        if ( pd->wasCanceled() )
            proc->kill();
    }    
}

// Funzione che cattura l'output di upgrade di SWARET

void QtSwaret::ReadUpgradeOutput()
{       
    // Fino a che il processo restituisce un output 
    while(!((StdoutStr = new QString(proc->readStdout()))->isNull()))
    {  
    	// Quando chiede conferma chiedo all'utente se vuole continuare
	if( StdoutStr->contains( "(y/n/A/Q)" ) )
	{
	    if ( QMessageBox::question( 0, "QtSwaret - Question", "Do you want to upgrade: " + StdoutStr->section(' ', 1, 1) + "?", tr("&Yes"), tr("&No"),  QString::null, 0, 0 ) )
            {
	    	proc->writeToStdin( "n\n" );
		EditLogs->append("\n\n*** Upgrade stopped! ***");
		return;
	    }
	    else
                proc->writeToStdin( "y\n" );
	    
	}
        
        if( StdoutStr->contains( "No installed" ) )
	{
            QMessageBox::warning( 0, "QtSwaret - Error", "No installed Packages found!\nUpgrade cannot be done!", QMessageBox::Ok, QMessageBox::NoButton );
            return;
        }
        
        // Scrivo i logs dell'operazione
        if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
            
        // Avanzamento progress bar
            if( ipd < 99 )
        pd->setProgress( ++ipd );
            
        // Se l'utente ha cancellato il processo 'killo' swaret
        if ( pd->wasCanceled() )
            proc->kill();
    }    
}

// Funzione che cattura l'output di upgrade all di SWARET

void QtSwaret::ReadUpgradeAllOutput()
{    
    // Fino a che il processo restituisce un output 
    while(!((StdoutStr = new QString(proc->readStdout()))->isNull()))
    {  
        if( StdoutStr->startsWith( "New:" ) )
        {
            QString newPacket = StdoutStr->section(' ', 1, 1);
            QString packetSize = StdoutStr->section(' ', 2, 3); packetSize.remove( "(" );  packetSize.remove( ")" );
            QString packetMirror = StdoutStr->section(' ', 4, 4); packetMirror.remove( "(" );  packetMirror.remove( ")" );
            QString packetState = ("Upgradable");
	    QString installedPacketName = StdoutStr->section(' ', 7, 7);
            new QListViewItem( ListPacketFound, newPacket, packetSize, packetMirror, packetState, installedPacketName );
            continue;
        }
        
        // Quando chiede conferma chiedo all'utente se vuole continuare
	if( StdoutStr->contains( "(y/n/A/Q)" ) )
	{
	    int iReply = QMessageBox::question( 0, "QtSwaret - Question", "Do you want to upgrade: " + StdoutStr->section(' ', 1, 1) + " to: " + StdoutStr->section(' ', 3, 3) + "?", tr("&Yes"), tr("&No"), tr("&Exit"), 0, 0 );
            if ( iReply == 0)
	    	proc->writeToStdin( "y\n" );
	    else if ( iReply == 1)
                proc->writeToStdin( "n\n" );
            else if ( iReply == 2)
                proc->writeToStdin( "Q\n" );    
            
	}
        
        // Scrivo i logs dell'operazione
        if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
    }    
}

// Funzione generale che cattura l'output di remove di PKGTOOL

void QtSwaret::ReadRemoveOutput()
{    
    // Avanzamento progress bar
    pd->setProgress( 1 );
            
    // Fino a che il processo restituisce un output lo inserisco nella finestra delle info
    while(!((StdoutStr = new QString(proc->readStdout()))->isNull()))
    {
	if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
            
        // Se l'utente ha cancellato il processo 'killo' pkgtool
        if ( pd->wasCanceled() )
            proc->kill();
     }       
}

// Funzione che cattura l'output di ricerca di SWARET

void QtSwaret::ReadSearchOutput()
{       
    QString *packetStatus = 0;
    QString *packetInstalled = new QString( "" );
    int i = 0;
    
    // Fino a che il processo restituisce un output 
    while( !((StdoutStr = new QString(proc->readStdout()))->isNull()) )
    {
        // Faccio il parse dell'output dei pacchetti trovati
        if(! (StdoutStr->startsWith("swaret")) && ! (StdoutStr->startsWith("Please")) && ! (StdoutStr->startsWith("Listing")) && ! ((StdoutStr->ascii())[0] == '') && ! (*StdoutStr == "\n") && ! (StdoutStr->startsWith("=>")) && ! (StdoutStr->startsWith(".")) && ! (StdoutStr->contains("DONE")) )
        {
            // Se non viene trovato nessun pacchetto esco dalla routine e scrivo il msg a video
            if( StdoutStr->contains("No available") )
            {
                QMessageBox::warning( 0, "QtSwaret - Error", "No packages found!", QMessageBox::Ok, QMessageBox::NoButton );
                return;    
            }
	    
            // Se non viene trovata la connessione esco dalla routine e scrivo il msg a video
            if( StdoutStr->contains("Network Connection down") )
            {
                QMessageBox::warning( 0, "QtSwaret - Error", "Network Connection down!\nTake a look to 'NIC' in the configuration file!", QMessageBox::Ok, QMessageBox::NoButton );
                return;    
            }
            // Leggo il nome del pacchetto
            QString packetName = StdoutStr->section(' ', 0, 0);
	    //Leggo nella descrizione
	    QString packetDescr = StdoutStr->section(' ', 3, 3);
            // Leggo la dimensione del pacchetto
            QString packetSize = StdoutStr->section(' ', 1, 2); packetSize.remove( "(" );  packetSize.remove( ")" );
            // Leggo il mirror
            QString packetMirror = StdoutStr->section(' ', 3, 3); 
            if(! packetMirror.startsWith( "(" ) )
            {
                packetMirror = "Slackware";
                i = 4;
                packetStatus = new QString( StdoutStr->section(' ', i, i) );
            }
            else
            {
                packetMirror.remove( "(" );  packetMirror.remove( ")" );
                i = 5; 
                packetStatus = new QString( StdoutStr->section(' ', i, i) );
            }
            // Leggo lo stato del pacchetto
            if( packetStatus->contains("NOT") )
            {
                *packetStatus = "No";
                *packetInstalled = StdoutStr->section(' ', i+1, i+1);
                if(! packetInstalled->contains( "]" ) )
                {
                    *packetInstalled = StdoutStr->section(' ', i+3, i+3);
                    packetInstalled->remove( ")" );
                    packetInstalled->remove( "]" );
                }
                else
                   *packetInstalled = "";
            }
            else if( packetStatus->contains("INSTALLED") )
                *packetStatus = "Yes";
            else
                *packetStatus = "";
            // Creo la lista dei pacchetti trovati
            new QListViewItem( ListPacketFound, packetName, packetSize, packetMirror, *packetStatus, *packetInstalled );
            
            // Avanzamento progress bar
            if( ipd < 99 )
                pd->setProgress( ++ipd );
            
            // Se l'utente ha cancellato il processo 'killo' swaret
            if ( pd->wasCanceled() )
                proc->kill();
        }
        
        // Scrivo i logs dell'operazione
        if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
    }
}

// Invocata sempre alla fine del processo SWARET

void QtSwaret::ProcFinished()
{   
    // Se il processo e' terminato con errore
    if(!(proc->normalExit()))
    	EditLogs->append("\n*** There was an error! ***");
    // Se il processo e' terminato correttamente
    else
    	EditLogs->append("\n*** Done! ***");
    // Riabilito i bottoni e chiudi la progress dialog a processo terminato
    EnableButtons();
    // Chiudo la progress bar se era aperta
    if(pd)
    {
        pd->close(); pd = NULL; ipd = 0;
    }
} 

// Invocata sempre alla fine del processo REMOVEPKG

void QtSwaret::RemoveFinished()
{   
    // Se il processo e' terminato con errore
    if(!(proc->normalExit()))
        QMessageBox::critical( 0, "QtSwaret - Error", "Uninstallation failed!", QMessageBox::Ok, QMessageBox::NoButton );	
    // Se il processo e' terminato correttamente
    else
    {
        QMessageBox::information( 0, "QtSwaret - Info", "Package removed succesfully !", QMessageBox::Ok, QMessageBox::NoButton );
        // Rigenero la lista dei pacchetti installati
        ListInstalled();
    }
    // Riabilito i bottoni e chiudi la progress dialog a processo terminato
    EnableButtons();
    if(pd)
    {
        pd->close(); pd = NULL; ipd = 0;
    }
} 


//--------------------------------------------------------------------------------------------------------------------------------------------


// Esce dal programma QTSWARET

void QtSwaret::Exit()
{
    KillProcesses();
    exit(0);
}

// Uccide i processi in uscita dall'applicativo

void QtSwaret::KillProcesses()
{
    if(proc && proc->isRunning() )
    {
	proc->tryTerminate();
	QTimer::singleShot( 2000, proc, SLOT( kill() ) );
    }
}

// Disabilita i bottoni

void QtSwaret::DisableButtons()
{
    BtnSearchPacket->setEnabled( FALSE );
    BtnPacketInstall->setEnabled( FALSE );
    BtnPacketUpgrade->setEnabled( FALSE );
    BtnAllUpgrade->setEnabled( FALSE );
    BtnClear->setEnabled( FALSE );
    BtnListRemovablePacket->setEnabled( FALSE );
    BtnPacketRemove->setEnabled( FALSE );
    BtnUpdate->setEnabled( FALSE );
    BtnSearchPacket_2->setEnabled( FALSE );
    pushButton21->setEnabled( FALSE );
    pushButton23->setEnabled( FALSE );
    pushButton94->setEnabled( FALSE ); 
	BtnUpgradable->setEnabled( FALSE );
	pushButton239->setEnabled( FALSE );
	pushButton240->setEnabled( FALSE );
	btnManual->setEnabled( FALSE );
	btnManual_2->setEnabled( FALSE );
	BtnSave->setEnabled( FALSE );
	BtnSave_2->setEnabled( FALSE );
	removeBtn->setEnabled( FALSE );
	listPatchBtn->setEnabled( FALSE );
}

// Riabilita i bottoni

void QtSwaret::EnableButtons()
{
    BtnSearchPacket->setEnabled( TRUE );
    BtnPacketInstall->setEnabled( TRUE );
    BtnPacketUpgrade->setEnabled( TRUE );
    BtnAllUpgrade->setEnabled( TRUE );
    BtnClear->setEnabled( TRUE );
    BtnListRemovablePacket->setEnabled( TRUE );
    BtnPacketRemove->setEnabled( TRUE );
    BtnUpdate->setEnabled( TRUE );
    BtnSearchPacket_2->setEnabled( TRUE );
    pushButton21->setEnabled( TRUE );
    pushButton23->setEnabled( TRUE ); 
    pushButton94->setEnabled( TRUE ); 
	BtnUpgradable->setEnabled( TRUE );
	pushButton239->setEnabled( TRUE );
	pushButton240->setEnabled( TRUE );
	btnManual->setEnabled( TRUE );
	btnManual_2->setEnabled( TRUE );
	BtnSave->setEnabled( TRUE );
	BtnSave_2->setEnabled( TRUE );
	removeBtn->setEnabled( TRUE );
	listPatchBtn->setEnabled( TRUE );
}


//--------------------------------------------------------------------------------------------------------------------------------------------


// Routine che legge il file di configurazione e mette i valori nei widgets del TAB configuration

void QtSwaret::ReadConfigFile()
{
    //Creo il buffer
    QString *myBuffer = new QString( "" );
    
    // Definisco il file di config
    QFile configFile( SWARETCONFIGFILE );
    
    // Testo se il fil esiste
    if(! configFile.exists() )
    {
        QMessageBox::critical( 0, "QtSwaret - Error", "Configuration file does not exist!", QMessageBox::Ok, QMessageBox::NoButton );
	return;
    }
       
    // Apro il file in sola lettura 
    if( configFile.open(IO_ReadOnly) )
    {
	// Creo lo stream
        QTextStream configStream( &configFile );
	
        // Leggo il file fino alla fine e lo metto nel buffer e lo visualizzo anche nella form
	while( !configStream.atEnd() )
        {
            *myBuffer = configStream.readLine();
            
            // Se inizia con # lo ignoro
            if( (myBuffer->ascii())[0] == '' )
                continue;
                
            // Versione di Slackware 
            if( myBuffer->startsWith( "VERSION" ) )
                EditVersion->setText( myBuffer->section( '=', 1, 1) );
                
            // Lingua di Swaret
            //if( myBuffer->startsWith( "LANGUAGE" ) )
                //ComboLang->setCurrentText( myBuffer->section( '=', 1, 1) );
            
            // ROOT Mirrors
            if( myBuffer->startsWith( "ROOT=" ) )
                ListMirrors->insertItem( myBuffer->section( '=', 1, 1) );
                
            // REPOS_ROOT Mirrors
            if( myBuffer->startsWith( "REPOS_ROOT=" ) )
                ListRep->insertItem( myBuffer->section( '=', 1, 1) );
                
            // DEP_ROOT Mirrors
            if( myBuffer->startsWith( "DEP_ROOT=" ) )
                ListDep->insertItem( myBuffer->section( '=', 1, 1) );
                
            // EXCLUDE packages
            if( myBuffer->startsWith( "EXCLUDE" ) )
                ListExclude->insertItem( myBuffer->section( '=', 1, 1) );
               
            // Mirrors casuali
           // if( myBuffer->startsWith( "RANDOMR" ) )
           // {
            //    if( myBuffer->section( '=', 1, 1) == "0" )
                   // ComboRand->setCurrentItem( 0 );
              //  else
             //       ComboRand->setCurrentItem( 1 );
            //}
            
            // Use PKG Description
            if( myBuffer->startsWith( "USEPKGDESC" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    CmboUseDesc->setCurrentItem( 0 );
                else
                    CmboUseDesc->setCurrentItem( 1 );
            } 
                                     
            // Trova dipendenze 
            if( myBuffer->startsWith( "DEPENDENCY" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboFindDep->setCurrentItem( 0 );
                else
                    ComboFindDep->setCurrentItem( 1 );
            }
            
            // Try to found missing library
            if( myBuffer->startsWith( "DSEARCHLIB" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboMissLib->setCurrentItem( 0 );
                else
                    ComboMissLib->setCurrentItem( 1 );
            }
            
            // Found missing library with slocate
            if( myBuffer->startsWith( "DSEARCHM" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboSlocate->setCurrentItem( 0 );
                else
                    ComboSlocate->setCurrentItem( 1 );
            }
                
            // MD5 Check 
            if( myBuffer->startsWith( "MD5CHECK" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboMD5->setCurrentItem( 0 );
                else
                    ComboMD5->setCurrentItem( 1 );   
            }
            
            // GPG Check 
            if( myBuffer->startsWith( "GPGCHECK" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboGpg->setCurrentItem( 0 );
                else
                    ComboGpg->setCurrentItem( 1 );   
            }
            
            // Show Descriptions
            if( myBuffer->startsWith( "DESC=" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboShowDesc->setCurrentItem( 0 );
                else
                    ComboShowDesc->setCurrentItem( 1 );   
            }
            
            // Cache Dir
            if( myBuffer->startsWith( "CACHE_DIR" ) )
                EditCacheDir->setText( myBuffer->section( '=', 1, 1) );
                
            // Do Logs
            if( myBuffer->startsWith( "LOG=" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboLog->setCurrentItem( 0 );
                else
                    ComboLog->setCurrentItem( 1 );   
            }
                
            // Log File
            if( myBuffer->startsWith( "LOG_FILE" ) )
                EditLogFile->setText( myBuffer->section( '=', 1, 1) );   
                
            // Show Warnings
            if( myBuffer->startsWith( "WARNINGS" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboWarn->setCurrentItem( 0 );
                else
                    ComboWarn->setCurrentItem( 1 );   
            }
            
            // Show Information
            if( myBuffer->startsWith( "INFORMATION" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboShowInfo->setCurrentItem( 0 );
                else
                    ComboShowInfo->setCurrentItem( 1 );  
            }
            
            // NIC settings
            if( myBuffer->startsWith( "NIC=" ) )
                EditNic->setText( myBuffer->section( '=', 1, 1) );
                
            // Timeout
            if( myBuffer->startsWith( "TIMEOUT=" ) )
                EditTimeOut->setText( myBuffer->section( '=', 1, 1) );  
                
            // Retries
            if( myBuffer->startsWith( "RETRIES=" ) )
                EditRetries->setText( myBuffer->section( '=', 1, 1) );  
                
            // FTP Passivo
            if( myBuffer->startsWith( "PASSIVE_FTP" ) )
            {
                if( myBuffer->section( '=', 1, 1) == "0" )
                    ComboFtp->setCurrentItem( 0 );
                else
                    ComboFtp->setCurrentItem( 1 );  
            }
            
            // WGET Proxy
            if( myBuffer->startsWith( "WGET_PROXY" ) )
                EditProxy1->setText( myBuffer->section( '=', 1, 1) );   
                
            // RSYNC PROXY
            if( myBuffer->startsWith( "RSYNC_PROXY" ) )
                EditProxy2->setText( myBuffer->section( '=', 1, 1) );   
	}
        
        // Chiudo il file
	configFile.close();
    }
}

// Routine che scrive il nuovo file di config partendo dai valori immessi nei widgets del TAB configuration

void QtSwaret::WriteConfigFile()
{
    QString myBuffer = "";
    QString Appoggio = "";
    
    // Creo una copia di backup
    system( "cp -f /etc/swaret.conf /etc/swaret.conf~" );
    
    QFile configFile( SWARETCONFIGFILE );
    
    // Apro il file in scrittura
    if( configFile.open( IO_WriteOnly ) )
    {
	QTextStream configStream( &configFile );
        
        // Creo il nuovo file di configurazione
        myBuffer = "### Configuration file generated by QtSwaret ###\n#\n#\n";
        
        myBuffer += "VERSION=" + EditVersion->text() + "\n";
        
        //myBuffer += "LANGUAGE=" + ComboLang->selectedText() + "\n";
        
        myBuffer += "LANGUAGE=" + ComboLang->currentText() + "\n";
        
        myBuffer += "NIC=" + EditNic->text() + "\n";
        
        myBuffer += "TIMEOUT=" + EditTimeOut->text() + "\n";
        
        myBuffer += "RETRIES=" + EditRetries->text() + "\n";
        
        (ComboFtp->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "PASSIVE_FTP=" + Appoggio + "\n";
        
        myBuffer += "WGET_PROXY=" + EditProxy1->text() + "\n";
        
        myBuffer += "RSYNC_PROXY=" + EditProxy2->text() + "\n";
        
        (ComboFindDep->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "DEPENDENCY=" + Appoggio + "\n";    
           
        (ComboMD5->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "MD5CHECK=" + Appoggio + "\n";
        
        (ComboLog->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "LOG=" + Appoggio + "\n";
        
        myBuffer += "LOG_FILE=" + EditLogFile->text() + "\n";
        
        myBuffer += "CACHE_DIR=" + EditCacheDir->text() + "\n";  
        
//        (ComboRand->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
  //      myBuffer += "RANDOMR=" + Appoggio + "\n";
        
        (ComboMissLib->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "DSEARCHLIB=" + Appoggio + "\n";
        
        (ComboSlocate->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "DSEARCHM=" + Appoggio + "\n";
        
        (ComboGpg->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "GPGCHECK=" + Appoggio + "\n";
        
        (ComboShowDesc->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "DESC=" + Appoggio + "\n";
        
        (CmboUseDesc->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "USEPKGDESC=" + Appoggio + "\n";
        
        (ComboWarn->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "WARNINGS=" + Appoggio + "\n";
        
        (ComboShowInfo->currentText() == "Yes") ? Appoggio = "1" : Appoggio = "0";
        myBuffer += "INFORMATION=" + Appoggio + "\n";
        
        int i = ListExclude->numRows();
        for( int k = 0; k < i; k++ )
            myBuffer += "EXCLUDE=" + ListExclude->text( k ) + "\n";
            
        i = ListMirrors->numRows();
        for( int k = 0; k < i; k++ )
            myBuffer += "ROOT=" + ListMirrors->text( k ) + "\n";
            
        i = ListRep->numRows();
        for( int k = 0; k < i; k++ )
            myBuffer += "REPOS_ROOT=" + ListRep->text( k ) + "\n";
            
        i = ListDep->numRows();
        for( int k = 0; k < i; k++ )
            myBuffer += "DEP_ROOT=" + ListDep->text( k ) + "\n";
            
        myBuffer += "#\n#\n### End of configuration file ###\n";
        // Fine della creazione del nuovo file di configurazione

        // Scrivo il contenuto del buffer nel file       
        configStream << myBuffer;

	// Chiudo il file e do il msg di salvataggio riuscito
        configFile.close();
        QMessageBox::information( 0, "QtSwaret - Info", "Configuration file written succesfully!", QMessageBox::Ok, QMessageBox::NoButton );
    }
    else
        // Messaggio di errore nell'operazione di salvataggio
        QMessageBox::critical( 0, "QtSwaret - Error", "Write error!", QMessageBox::Ok, QMessageBox::NoButton );
}

// Funzioni richiamate dai bottoni ADD e REMOVE del TAB configuration

void QtSwaret::AddExclude()
{
    ListExclude->insertItem( EditNewExclude->text() );
    EditNewExclude->clear();
}

void QtSwaret::RemoveExclude()
{
    ListExclude->removeItem( ListExclude->currentItem() );
}

void QtSwaret::AddMirror()
{
    ListMirrors->insertItem( EditNewMirror->text() );
    EditNewMirror->clear();
}

void QtSwaret::RemoveMirror()
{
    ListMirrors->removeItem( ListMirrors->currentItem() );
}

void QtSwaret::AddRep()
{
    ListRep->insertItem( EditNewRep->text() );
    EditNewRep->clear();
}

void QtSwaret::RemoveRep()
{
    ListRep->removeItem( ListRep->currentItem() );
}

void QtSwaret::AddDep()
{
    ListDep->insertItem( EditNewDep->text() );
    EditNewDep->clear();
}

void QtSwaret::RemoveDep()
{
    ListDep->removeItem( ListDep->currentItem() );
}

void QtSwaret::ReInstallPacket()
{ // Prendo il nome del pacchetto che si vuol installare
    QString myPacketName = "";
    QListViewItem *selectedRow = ListPacketFound->currentItem();
    if( selectedRow != 0 )
        myPacketName = selectedRow->text( 0 );
    
    if(myPacketName == "")
    	QMessageBox::warning( 0, "QtSwaret - Error", "No package selected!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {
    	// Scrivo il log
	EditLogs->append("ReInstalling...");
	
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();
	
	// Creo la progress dialog
        pd = new QProgressDialog ( "Reinstalling " + myPacketName + ", Please wait...", "Exit", 100, this, "ProgressDialog", TRUE );
        
    	// Creo il processo Swaret --install
        proc = new QProcess;
        proc->addArgument("swaret");
        proc->addArgument("--reinstall");
        proc->addArgument(myPacketName);
    
    	// Connetto il processo per catturare l'output
    	connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadInstallOutput()) );
    	connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );
    
    	// Lancio il processo
    	proc->start();
    }
}

void QtSwaret::FilenameSearch()
{
    // Prendo il nome del pacchetto che si vuol cercare
    QString myPacketName = EditSearchPacket->text();
    
    // Pulisco la lista dei pacchetti trovati
    ListPacketFound->clear();
    
    if(myPacketName == "")
    	QMessageBox::warning( 0, "SPI - Error", "No file to search!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {
	// Scrivo il log
	EditLogs->append("" + myPacketName + "");
	
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();
        
        // Creo la progress dialog
        pd = new QProgressDialog ( "Search for " + myPacketName + " in filenames, \n Please wait...", "Exit", 100, this, "ProgressDialog", TRUE );
        
	// Creo il processo Swaret --search
	proc = new QProcess;
	proc->addArgument("spi");
	proc->addArgument("-e");
	proc->addArgument(myPacketName);
	
	// Connetto il processo per catturare l'output
	connect(proc, SIGNAL(readyReadStdout()), this, SLOT(FilenameSearchOutput()) );
	connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );
	
	// Lancio il processo
	proc->start();
    }
}
void QtSwaret::FilenameSearchOutput()
{       
    QString *packetStatus = 0;
    QString *packetInstalled = new QString( "" );
    int i = 0;
    
    // Fino a che il processo restituisce un output 
    while( !((StdoutStr = new QString(proc->readStdout()))->isNull()) )
    {
        // Faccio il parse dell'output dei pacchetti trovati
        if(! (StdoutStr->startsWith("Match")) && ! (StdoutStr->startsWith("SECTION:")) )
        {
            // Leggo il nome del pacchetto
            QString packetName = StdoutStr->section(' ', 4, 4); packetName.remove( "SECTION:" );
	    //Leggo nella descrizione
	    //QString packetDescr = StdoutStr->section(' ', 3, 3);
            // Leggo la dimensione del pacchetto
            QString packetSize = StdoutStr->section(' ', 2, 1);
            // Leggo il mirror
            QString packetMirror = StdoutStr->section(' ', 5, 5); packetMirror.remove( "SECTION:" ); packetMirror.remove( "STATUS:" );
         if(! packetMirror.startsWith( "(" ) )
            {
                //packetMirror = "-";
                i = 4;
                packetStatus = new QString( StdoutStr->section(' ', i+1, i+2) );
            }
            else
            {
                packetMirror.remove( "(" );  packetMirror.remove( ")" );
                i = 5; 
                packetStatus = new QString( StdoutStr->section(' ', i, i) );
            }
            // Leggo lo stato del pacchetto
            if( packetStatus->contains("NOT") )
            {
                *packetStatus = "NOT INSTALLED";
                *packetInstalled = StdoutStr->section(' ', i+1, i+2);
                if(! packetInstalled->contains( "]" ) )
                {
                    *packetInstalled = StdoutStr->section(' ', i+3, i+3);
                    packetInstalled->remove( ")" );
                    packetInstalled->remove( "]" );
                }
                else
                   *packetInstalled = "-";
            }
            else if( packetStatus->contains("INSTALLED") )
                *packetStatus = "INSTALLED";
            else
                *packetStatus = "";
            // Creo la lista dei pacchetti trovati
            new QListViewItem( ListPacketFound, packetName, packetSize, packetMirror, *packetStatus, *packetInstalled );
            
            // Avanzamento progress bar
            if( ipd < 99 )
                pd->setProgress( ++ipd );
            
            // Se l'utente ha cancellato il processo 'killo' swaret
            if ( pd->wasCanceled() )
                proc->kill();
        }
        
        // Scrivo i logs dell'operazione
        if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
    }

}

void QtSwaret::SPIUpdt()
{
    // Se risponde no esco dalla funzione
    if ( QMessageBox::question( 0, "QtSwaret - Question", "Do you want to start the SPI database update?", tr("&Yes"), tr("&No"),  QString::null, 0, 1 ) )
        return;
   
    // Disabilito i bottoni per prevenire l'input da parte del'utente
    DisableButtons();
    
    // Scrivo il log
    EditLogs->append("SPI Database updating...");
    
    // Creo la progress dialog
    pd = new QProgressDialog ( "Sync Network Database, Please wait...", "Exit", 3, this, "ProgressDialog", TRUE );
	
    // Creo il processo Swaret --update
    proc = new QProcess;
    proc->addArgument("spi");
    proc->addArgument("-u");
    proc->addArgument("-n");
    proc->addArgument("all");
    // Connetto il processo per catturare l'output del processo terminato
    connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadUpdateOutput()) );
    connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );

    // Lancio il processo
    proc->start();
}

void QtSwaret::listFiles()
{
	QString myPacketName = "";
    	QListViewItem *selectedRow = ListPacketFound->currentItem();
    if( selectedRow != 0 )
        myPacketName = selectedRow->text( 0 );
    
    if(myPacketName == "")
    	QMessageBox::warning( 0, "QtSwaret - Error", "No package selected!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {
    	// Scrivo il log
	EditLogs->append("File listing...");
	
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();
	
	// Creo la progress dialog
        pd = new QProgressDialog ( "Listing package's files, Please wait...", "Exit", 100, this, "ProgressDialog", TRUE );
        
    	// Creo il processo Swaret --install
        proc = new QProcess;
        proc->addArgument("spi");
        proc->addArgument("-m");
        proc->addArgument(myPacketName);
    
    	// Connetto il processo per catturare l'output
    	connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadShowOutput()) );
    	connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );
    
    	// Lancio il processo
    	proc->start();
    }
}

void QtSwaret::readSPIConfigFile()
{  // Creo il buffer
    QString myBuffer2;
    
    // Pulisco la finestra del file di config
    EditConfigFile2->clear();
    
    // Definisco il file di config
    QFile configFile2( SPICONFIGFILE );
    
    // Testo se il fil esiste
    if(! configFile2.exists() )
    {
        QMessageBox::critical( 0, "QtSwaret - Error", "SPI Configuration file does not exist!", QMessageBox::Ok, QMessageBox::NoButton );
	return;
    }
       
    // Apro il file in sola lettura 
    if( configFile2.open(IO_ReadOnly) )
    {
	// Creo lo stream
        QTextStream configStream2( &configFile2 );
	
        // Leggo il file fino alla fine e lo metto nel buffer e lo visualizzo anche nella form
	while( !configStream2.atEnd() )
            EditConfigFile2->append( configStream2.readLine() );

        // Chiudo il file
	configFile2.close();
    }
    
    // Posiziono il cursore all'inizio del testo
    EditConfigFile2->setCursorPosition( 0, 0 );
}
void QtSwaret::WriteSPIConfigFile()
{
   
     
    // Salvataggio del file di config di SPI
           
    // Creo una copia di backup
    system( "cp -f /etc/spi/spi.conf /etc/spi/spi.conf~" );
    
    QFile configFile2( SPICONFIGFILE );
    
    // Apro il file in scrittura
    if( configFile2.open( IO_WriteOnly ) )
    {
	QTextStream configStream2( &configFile2 );
        
        // Copio il contenuto della TextEdit nel file
        QString *myBuffer2 = new QString( EditConfigFile2->text() );
        configStream2 << *myBuffer2;
	
	// Chiudo il file e do il msg di salvataggio riuscito
        configFile2.close();
    }
    else
    {
        // Messaggio di errore nell'operazione di salvataggio
        QMessageBox::critical( 0, "QtSwaret - Error", "Write error!", QMessageBox::Ok, QMessageBox::NoButton );
        return;
    }
    
    // Se tutto va bene do il mesg di salvataggio riuscito
    QMessageBox::information( 0, "QtSwaret - Info", "Configuration file written succesfully!", QMessageBox::Ok, QMessageBox::NoButton );
}

void QtSwaret::SPILocalUPDT()
{ // Se risponde no esco dalla funzione
    if ( QMessageBox::question( 0, "SPI - Question", "Do you want to start the SPI database update?", tr("&Yes"), tr("&No"),  QString::null, 0, 1 ) )
        return;
   
    // Disabilito i bottoni per prevenire l'input da parte del'utente
    DisableButtons();
    
    // Scrivo il log
    EditLogs->append("SPI Database updating...");
    
    // Creo la progress dialog
    pd = new QProgressDialog ( "Local SPI Database Update, Please wait...", "Exit", 3, this, "ProgressDialog", TRUE );
	
    // Creo il processo Swaret --update
    proc = new QProcess;
    proc->addArgument("spi");
    proc->addArgument("-u");
   
    // Connetto il processo per catturare l'output del processo terminato
    connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadUpdateOutput()) );
    connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );

    // Lancio il processo
    proc->start();
}

void QtSwaret::SPIDBBuild()
{// Se risponde no esco dalla funzione
    if ( QMessageBox::question( 0, "SPI - Question", "Do you want to start the SPI DB Build?", tr("&Yes"), tr("&No"),  QString::null, 0, 1 ) )
        return;
   
    // Disabilito i bottoni per prevenire l'input da parte del'utente
    DisableButtons();
    
    // Scrivo il log
    EditLogs->append("SPI Database Building...");
    
    // Creo la progress dialog
    pd = new QProgressDialog ( "Building SPI Database, Please wait...", "Exit", 3, this, "ProgressDialog", TRUE );
	
    // Creo il processo Swaret --update
    proc = new QProcess;
    proc->addArgument("spi");
    proc->addArgument("-b");
   
    // Connetto il processo per catturare l'output del processo terminato
    connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadUpdateOutput()) );
    connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );

    // Lancio il processo
    proc->start();
}

void QtSwaret::listUpgradable()
{
		
    
    // Pulisco la lista dei pacchetti trovati
    ListPacketFound->clear();
        
    // Disabilito i bottoni per prevenire l'input da parte del'utente
    DisableButtons();
    
    // Scrivo il log
    EditLogs->append("*** Listing Upgradable Packages. Please wait...***\n");
    

    pd = new QProgressDialog ( "Listing all upgradable packages, Please wait...", "Exit", 20, this, "ProgressDialog", TRUE );
    // Creo il processo Swaret --upgrade all
    proc = new QProcess;
    proc->addArgument("swaret");
    proc->addArgument("--list");
    proc->addArgument("-u");

    // Connetto il processo per catturare l'output
    connect(proc, SIGNAL(readyReadStdout()), this, SLOT(listUpgradableOutput()) );
    connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );

    // Lancio il processo
    proc->start();
}

void QtSwaret::listUpgradableOutput()
 { 
// Fino a che il processo restituisce un output 
    while(!((StdoutStr = new QString(proc->readStdout()))->isNull()))
    {  
        if( StdoutStr->startsWith( "New:" ) )
        {
            QString newPacket = StdoutStr->section(' ', 1, 1);
            QString packetSize = StdoutStr->section(' ', 2, 3); packetSize.remove( "(" );  packetSize.remove( ")" );
            QString packetMirror = StdoutStr->section(' ', 4, 4); packetMirror.remove( "(" );  packetMirror.remove( ")" );
            QString installedPacketName = StdoutStr->section(' ', 6, 7);
            new QListViewItem( ListPacketFound, newPacket, packetSize, packetMirror, installedPacketName );
            continue;
        }
        
        
        if ( pd->wasCanceled() )
            proc->kill();

	// Avanzamento progress bar
            if( ipd < 99 )
        pd->setProgress( ++ipd );

        // Scrivo i logs dell'operazione
        if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
    	
	

	}    
    }

void QtSwaret::killProcess()
{
	if(proc && proc->isRunning() )
    {
	proc->tryTerminate();
	QTimer::singleShot( 2000, proc, SLOT( kill() ) );
    }
}

void QtSwaret::readSwaretManual()
{	
	
     system( "swaret --manual > /tmp/manual.txt" );
	
	proc = new QProcess;
   	proc->addArgument("/opt/kde/bin/kdialog");
	proc->addArgument("--textbox");
	proc->addArgument("/tmp/manual.txt");
	proc->addArgument("800");
	proc->addArgument("400");
	
	// Lancio il processo
    proc->start();
}
void QtSwaret::readSPIManual()
{	
	
     system( "man spi > /tmp/spimanual.txt" );
	
	proc = new QProcess;
   	proc->addArgument("/opt/kde/bin/kdialog");
	proc->addArgument("--textbox");
	proc->addArgument("/tmp/spimanual.txt");
	proc->addArgument("800");
	proc->addArgument("400");
	
	// Lancio il processo
    proc->start();
}

void QtSwaret::swaretRemove()
{
	// Prendo il nome del pacchetto che si vuol installare
    QString myPacketName = "";
    QListViewItem *selectedRow = ListPacketFound->currentItem();
    if( selectedRow != 0 )
        myPacketName = selectedRow->text( 0 );
    
    if(myPacketName == "")
    	QMessageBox::warning( 0, "QtSwaret - Error", "No package selected!", QMessageBox::Ok, QMessageBox::NoButton );
    else
    {
    	// Scrivo il log
	EditLogs->append("Removing...");
	
        // Disabilito i bottoni per prevenire l'input da parte del'utente
        DisableButtons();
	
	// Creo la progress dialog
        pd = new QProgressDialog ( "Removing selected package, Please wait...", "Exit", 100, this, "ProgressDialog", TRUE );
        
    	// Creo il processo Swaret --install
        proc = new QProcess;
        proc->addArgument("removepkg");
        proc->addArgument(myPacketName);
    
    	// Connetto il processo per catturare l'output
    	connect(proc, SIGNAL(readyReadStdout()), this, SLOT(ReadInstallOutput()) );
    	connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );
    
    	// Lancio il processo
    	proc->start();
    }
}

void QtSwaret::listPatches()
{
// Pulisco la lista dei pacchetti trovati
    ListPacketFound->clear();
        
    // Disabilito i bottoni per prevenire l'input da parte del'utente
    DisableButtons();
    
    // Scrivo il log
    EditLogs->append("*** Listing Patches. Please wait...***\n");
    

    pd = new QProgressDialog ( "Listing all available patches, Please wait...", "Exit", 20, this, "ProgressDialog", TRUE );
    // Creo il processo Swaret --upgrade all
    proc = new QProcess;
    proc->addArgument("swaret");
    proc->addArgument("--list");
    proc->addArgument("-p");

    // Connetto il processo per catturare l'output
    connect(proc, SIGNAL(readyReadStdout()), this, SLOT(listPatchesOutput()) );
    connect(proc, SIGNAL(processExited()), this, SLOT(ProcFinished()) );

    // Lancio il processo
    proc->start();
}

void QtSwaret::listPatchesOutput()
 { 
QString *packetStatus = 0;
    QString *packetInstalled = new QString( "" );
    int i = 0;
    
    // Fino a che il processo restituisce un output 
    while( !((StdoutStr = new QString(proc->readStdout()))->isNull()) )
    {
        // Faccio il parse dell'output dei pacchetti trovati
        if(! (StdoutStr->startsWith("swaret")) && ! (StdoutStr->startsWith("Please")) && ! (StdoutStr->startsWith("Listing")) && ! ((StdoutStr->ascii())[0] == '') && ! (*StdoutStr == "\n") && ! (StdoutStr->startsWith("=>")) && ! (StdoutStr->startsWith(".")) && ! (StdoutStr->contains("DONE")) )
        {
            // Se non viene trovato nessun pacchetto esco dalla routine e scrivo il msg a video
            if( StdoutStr->contains("No available") )
            {
                QMessageBox::warning( 0, "QtSwaret - Error", "No packages found!", QMessageBox::Ok, QMessageBox::NoButton );
                return;    
            }
	    
            // Se non viene trovata la connessione esco dalla routine e scrivo il msg a video
            if( StdoutStr->contains("Network Connection down") )
            {
                QMessageBox::warning( 0, "QtSwaret - Error", "Network Connection down!\nTake a look to 'NIC' in the configuration file!", QMessageBox::Ok, QMessageBox::NoButton );
                return;    
            }
            // Leggo il nome del pacchetto
            QString packetName = StdoutStr->section(' ', 0, 0);
	    //Leggo nella descrizione
	    QString packetDescr = StdoutStr->section(' ', 3, 3);
            // Leggo la dimensione del pacchetto
            QString packetSize = StdoutStr->section(' ', 1, 2); packetSize.remove( "(" );  packetSize.remove( ")" );
            // Leggo il mirror
            QString packetMirror = StdoutStr->section(' ', 3, 3); 
            if(! packetMirror.startsWith( "(" ) )
            {
                packetMirror = "Slackware";
                i = 4;
                packetStatus = new QString( StdoutStr->section(' ', i, i) );
            }
            else
            {
                packetMirror.remove( "(" );  packetMirror.remove( ")" );
                i = 5; 
                packetStatus = new QString( StdoutStr->section(' ', i, i) );
            }
            // Leggo lo stato del pacchetto
            if( packetStatus->contains("NOT") )
            {
                *packetStatus = "No";
                *packetInstalled = StdoutStr->section(' ', i+1, i+1);
                if(! packetInstalled->contains( "]" ) )
                {
                    *packetInstalled = StdoutStr->section(' ', i+3, i+3);
                    packetInstalled->remove( ")" );
                    packetInstalled->remove( "]" );
                }
                else
                   *packetInstalled = "";
            }
            else if( packetStatus->contains("INSTALLED") )
                *packetStatus = "Yes";
            else
                *packetStatus = "";
            // Creo la lista dei pacchetti trovati
            new QListViewItem( ListPacketFound, packetName, packetSize, packetMirror, *packetStatus, *packetInstalled );
            
            // Avanzamento progress bar
            if( ipd < 99 )
                pd->setProgress( ++ipd );
            
            // Se l'utente ha cancellato il processo 'killo' swaret
            if ( pd->wasCanceled() )
                proc->kill();
        }
        
        // Scrivo i logs dell'operazione
        if(! ((StdoutStr->ascii())[0] == '') )
            EditLogs->append(*StdoutStr);
    }
    }



    
  

#include "qtswaret.moc"
