Mega Code Archive

 
Categories / C++ / Qt
 

Qt based Ftp dialog

Foundations of Qt Development\Chapter14\ftp\ftpdialog.cpp /*  * Copyright (c) 2006-2007, Johan Thelin  *   * All rights reserved.  *   * Redistribution and use in source and binary forms, with or without modification,   * are permitted provided that the following conditions are met:  *   *     * Redistributions of source code must retain the above copyright notice,   *       this list of conditions and the following disclaimer.  *     * Redistributions in binary form must reproduce the above copyright notice,    *       this list of conditions and the following disclaimer in the documentation   *       and/or other materials provided with the distribution.  *     * Neither the name of APress nor the names of its contributors   *       may be used to endorse or promote products derived from this software   *       without specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  *  */ #include <QFileDialog> #include <QMessageBox> #include "ftpdialog.h" FtpDialog::FtpDialog() : QDialog() {   file = 0;      ui.setupUi( this );      connect( ui.connectButton, SIGNAL(clicked()), this, SLOT(connectClicked()) );   connect( ui.disconnectButton, SIGNAL(clicked()), this, SLOT(disconnectClicked()) );   connect( ui.cdButton, SIGNAL(clicked()), this, SLOT(cdClicked()) );   connect( ui.upButton, SIGNAL(clicked()), this, SLOT(upClicked()) );   connect( ui.getButton, SIGNAL(clicked()), this, SLOT(getClicked()) );      connect( ui.dirList, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged()) );      connect( &ftp, SIGNAL(commandFinished(int,bool)), this, SLOT(ftpFinished(int,bool)) );   connect( &ftp, SIGNAL(listInfo(QUrlInfo)), this, SLOT(ftpListInfo(QUrlInfo)) );   connect( &ftp, SIGNAL(dataTransferProgress(qint64,qint64)), this, SLOT(ftpProgress(qint64,qint64)) );      ui.disconnectButton->setEnabled( false );   ui.cdButton->setEnabled( false );   ui.upButton->setEnabled( false );   ui.getButton->setEnabled( false ); } void FtpDialog::connectClicked() {   ui.connectButton->setEnabled( false );      ftp.connectToHost( "ftp.trolltech.com" );   ui.statusLabel->setText( tr("Connecting to host...") ); } void FtpDialog::disconnectClicked() {   ui.disconnectButton->setEnabled( false );   ui.cdButton->setEnabled( false );   ui.upButton->setEnabled( false );   ui.getButton->setEnabled( false );      ftp.close(); } void FtpDialog::cdClicked() {   ui.disconnectButton->setEnabled( false );   ui.cdButton->setEnabled( false );   ui.upButton->setEnabled( false );   ui.getButton->setEnabled( false );   ftp.cd( ui.dirList->selectedItems()[0]->text() );   ui.statusLabel->setText( tr("Changing directory...") ); } void FtpDialog::upClicked() {   ui.disconnectButton->setEnabled( false );   ui.cdButton->setEnabled( false );   ui.upButton->setEnabled( false );   ui.getButton->setEnabled( false );   ftp.cd("..");   ui.statusLabel->setText( tr("Changing directory...") ); } void FtpDialog::getClicked() {   QString fileName = QFileDialog::getSaveFileName( this, tr("Get File"), ui.dirList->selectedItems()[0]->text() );   if( fileName.isEmpty() )     return;        file = new QFile( fileName, this );   if( !file->open( QIODevice::WriteOnly ) )   {     QMessageBox::warning( this, tr("Error"), tr("Failed to open file %1 for writing.").arg( fileName ) );          delete file;     file = 0;          return;   }   ui.disconnectButton->setEnabled( false );   ui.cdButton->setEnabled( false );   ui.upButton->setEnabled( false );   ui.getButton->setEnabled( false );   ftp.get( ui.dirList->selectedItems()[0]->text(), file );   ui.statusLabel->setText( tr("Downloading file...") ); } void FtpDialog::ftpProgress( qint64 done, qint64 total ) {   if( total == 0 )     return;        ui.statusLabel->setText( tr("Downloading file... (%1%)").arg( QString::number( double(done)*100/double(total), 'f', 1 ) ) ); } void FtpDialog::selectionChanged() {   if( ui.dirList->selectedItems().count() == 1 )   {     if( files.indexOf( ui.dirList->selectedItems()[0]->text() ) == -1 )     {       ui.cdButton->setEnabled( ui.disconnectButton->isEnabled() );       ui.getButton->setEnabled( false );     }     else     {       ui.cdButton->setEnabled( false );       ui.getButton->setEnabled( ui.disconnectButton->isEnabled() );     }   }   else   {     ui.cdButton->setEnabled( false );     ui.getButton->setEnabled( false );   } } void FtpDialog::getFileList() {   ui.disconnectButton->setEnabled( false );   ui.cdButton->setEnabled( false );   ui.upButton->setEnabled( false );   ui.getButton->setEnabled( false );   ui.dirList->clear();   files.clear();      if( ftp.state() == QFtp::LoggedIn )     ftp.list(); } void FtpDialog::ftpListInfo( QUrlInfo info ) {   ui.dirList->addItem( info.name() );   if( info.isFile() )     files << info.name(); } void FtpDialog::ftpFinished( int request, bool error ) {   if( error )   {     switch( ftp.currentCommand() )     {       case QFtp::ConnectToHost:         QMessageBox::warning( this, tr("Error"), tr("Failed to connect to host.") );         ui.connectButton->setEnabled( true );                  break;        case QFtp::Login:         QMessageBox::warning( this, tr("Error"), tr("Failed to login.") );         ui.connectButton->setEnabled( true );                  break;        case QFtp::List:         QMessageBox::warning( this, tr("Error"), tr("Failed to get file list.\nClosing connection.") );         ftp.close();                  break;       case QFtp::Cd:         QMessageBox::warning( this, tr("Error"), tr("Failed to change directory.") );         getFileList();                  break;       case QFtp::Get:         QMessageBox::warning( this, tr("Error"), tr("Failed to get file?") );         file->close();         file->remove();                  delete file;         file = 0;                  ui.disconnectButton->setEnabled( true );         ui.upButton->setEnabled( true );         selectionChanged();                  break;     }          ui.statusLabel->setText( tr("Ready.") );   }   else   {     switch( ftp.currentCommand() )     {       case QFtp::ConnectToHost:         ftp.login();         break;       case QFtp::Login:         getFileList();                  break;       case QFtp::Close:         ui.connectButton->setEnabled( true );         getFileList();                  break;       case QFtp::List:         ui.disconnectButton->setEnabled( true );         ui.upButton->setEnabled( true );         ui.statusLabel->setText( tr("Ready.") );                  break;       case QFtp::Cd:         getFileList();                  break;       case QFtp::Get:         file->close();                  delete file;         file = 0;                  ui.disconnectButton->setEnabled( true );         ui.upButton->setEnabled( true );         selectionChanged();         ui.statusLabel->setText( tr("Ready.") );         break;             }   } } Foundations of Qt Development\Chapter14\ftp\ftpdialog.h /*  * Copyright (c) 2006-2007, Johan Thelin  *   * All rights reserved.  *   * Redistribution and use in source and binary forms, with or without modification,   * are permitted provided that the following conditions are met:  *   *     * Redistributions of source code must retain the above copyright notice,   *       this list of conditions and the following disclaimer.  *     * Redistributions in binary form must reproduce the above copyright notice,    *       this list of conditions and the following disclaimer in the documentation   *       and/or other materials provided with the distribution.  *     * Neither the name of APress nor the names of its contributors   *       may be used to endorse or promote products derived from this software   *       without specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  *  */ #ifndef FTPDIALOG_H #define FTPDIALOG_H #include <QFtp> #include <QDialog> #include <QFile> #include "ui_ftpdialog.h" class FtpDialog : public QDialog {   Q_OBJECT public:   FtpDialog();    private slots:   void connectClicked();   void disconnectClicked();   void cdClicked();   void upClicked();   void getClicked();      void selectionChanged();      void ftpFinished(int,bool);   void ftpListInfo(QUrlInfo);   void ftpProgress(qint64,qint64);    private:   void getFileList();        Ui::FtpDialog ui;        QFtp ftp;   QFile *file;      QStringList files; }; #endif // FTPDIALOG_H Foundations of Qt Development\Chapter14\ftp\main.cpp /*  * Copyright (c) 2006-2007, Johan Thelin  *   * All rights reserved.  *   * Redistribution and use in source and binary forms, with or without modification,   * are permitted provided that the following conditions are met:  *   *     * Redistributions of source code must retain the above copyright notice,   *       this list of conditions and the following disclaimer.  *     * Redistributions in binary form must reproduce the above copyright notice,    *       this list of conditions and the following disclaimer in the documentation   *       and/or other materials provided with the distribution.  *     * Neither the name of APress nor the names of its contributors   *       may be used to endorse or promote products derived from this software   *       without specific prior written permission.  *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  *  */ #include <QApplication> #include "ftpdialog.h" int main( int argc, char **argv ) {   QApplication app( argc, argv );      FtpDialog dlg;   dlg.show();      return app.exec(); }