diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-22 18:58:28 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-22 18:58:28 +0000 |
commit | 83b9bf0e3bfb1d842b10b80bbe749095b2c661a1 (patch) | |
tree | b05b1793361693ae88106648c2a953bed988f423 /krusader/VFS/ftp_vfs.cpp | |
download | krusader-83b9bf0e3bfb1d842b10b80bbe749095b2c661a1.tar.gz krusader-83b9bf0e3bfb1d842b10b80bbe749095b2c661a1.zip |
Added old KDE3 version of Krusader
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/krusader@1094427 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'krusader/VFS/ftp_vfs.cpp')
-rw-r--r-- | krusader/VFS/ftp_vfs.cpp | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/krusader/VFS/ftp_vfs.cpp b/krusader/VFS/ftp_vfs.cpp new file mode 100644 index 0000000..1cfb394 --- /dev/null +++ b/krusader/VFS/ftp_vfs.cpp @@ -0,0 +1,297 @@ +/*************************************************************************** + ftp_vfs.cpp + ------------------- + copyright : (C) 2000 by Rafi Yanai + e-mail : krusader@users.sourceforge.net + web site : http://krusader.sourceforge.net +--------------------------------------------------------------------------- + +*************************************************************************** + + A + + db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b. + 88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D + 88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY' + 88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b + 88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88. + YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD + + S o u r c e F i l e + +*************************************************************************** +* * +* 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. * +* * +***************************************************************************/ + +// Sys includes +#include <time.h> +#include <sys/param.h> +#include <unistd.h> +#ifdef BSD +#include <sys/types.h> +#endif +// QT includes +#include <qdir.h> +#include <qregexp.h> +#include <qtimer.h> +#include <qeventloop.h> +// KDE includes +#include <kio/jobclasses.h> +#include <klocale.h> +#include <kio/job.h> +#include <kmessagebox.h> +#include <kprotocolinfo.h> +#include <kdebug.h> +// Krusader includes +#include "ftp_vfs.h" +#include "krpermhandler.h" +#include "../Dialogs/krdialogs.h" +#include "../Dialogs/krprogress.h" +#include "../krusader.h" +#include "../defaults.h" +#include "../resources.h" + +ftp_vfs::ftp_vfs( QObject* panel ) : vfs( panel ), busy( false ) { + // set the writable attribute + isWritable = true; + vfs_type = FTP; +} + +ftp_vfs::~ftp_vfs() { + busy = false; +} + +void ftp_vfs::slotAddFiles( KIO::Job *, const KIO::UDSEntryList& entries ) { + int rwx = -1; + + QString prot = vfs_origin.protocol(); + if( prot == "krarc" || prot == "tar" || prot == "zip" ) + rwx = PERM_ALL; + + KIO::UDSEntryListConstIterator it = entries.begin(); + KIO::UDSEntryListConstIterator end = entries.end(); + + // as long as u can find files - add them to the vfs + for ( ; it != end; ++it ) { + KFileItem kfi( *it, vfs_origin, true, true ); + vfile *temp; + + // get file statistics + QString name = kfi.text(); + // ignore un-needed entries + if ( name.isEmpty() || name == "." || name == ".." ) continue; + + KIO::filesize_t size = kfi.size(); + time_t mtime = kfi.time( KIO::UDS_MODIFICATION_TIME ); + bool symLink = kfi.isLink(); + mode_t mode = kfi.mode() | kfi.permissions(); + QString perm = KRpermHandler::mode2QString( mode ); + // set the mimetype + QString mime = kfi.mimetype(); + QString symDest = ""; + if ( symLink ) { + symDest = kfi.linkDest(); + if ( kfi.isDir() ) perm[ 0 ] = 'd'; + } + + // create a new virtual file object + if ( kfi.user().isEmpty() ) + temp = new vfile( name, size, perm, mtime, symLink, getuid(), getgid(), mime, symDest, mode, rwx ); + else { + QString currentUser = vfs_origin.user(); + if ( currentUser.contains( "@" ) ) /* remove the FTP proxy tags from the username */ + currentUser.truncate( currentUser.find( '@' ) ); + if ( currentUser.isEmpty() ) { + if( vfs_origin.host().isEmpty() ) + currentUser = KRpermHandler::uid2user( getuid() ); + else { + currentUser = ""; // empty, but not QString::null + } + } +#if KDE_IS_VERSION(3,5,0) + temp = new vfile( name, size, perm, mtime, symLink, + kfi.user(), kfi.group(), currentUser, + mime, symDest, mode, rwx, kfi.ACL().asString(), + kfi.defaultACL().asString() ); +#else + temp = new vfile( name, size, perm, mtime, symLink, kfi.user(), kfi.group(), currentUser, mime, symDest, mode, rwx ); +#endif + } + +#if KDE_IS_VERSION(3,4,0) + if( !kfi.localPath().isEmpty() ){ + temp->vfile_setUrl( kfi.localPath() ); + } else { + temp->vfile_setUrl( kfi.url() ); + } +#else + temp->vfile_setUrl( kfi.url() ); +#endif + temp->vfile_setIcon( kfi.iconName() ); + foundVfile( temp ); + } +} + +void ftp_vfs::slotPermanentRedirection( KIO::Job*, const KURL&, const KURL& newUrl ) { + vfs_origin = newUrl; + vfs_origin.adjustPath(-1); +} + +void ftp_vfs::slotRedirection( KIO::Job *, const KURL &url ) { + // update the origin + vfs_origin = url; + vfs_origin.adjustPath(-1); +} + +void ftp_vfs::slotListResult( KIO::Job *job ) { + if ( job && job->error() ) { + // we failed to refresh + listError = true; + // display error message + if ( !quietMode ) job->showErrorDialog( krApp ); + } + busy = false; +} + +bool ftp_vfs::populateVfsList( const KURL& origin, bool showHidden ) { + QString errorMsg = QString::null; + if ( !origin.isValid() ) + errorMsg = i18n( "Malformed URL:\n%1" ).arg( origin.url() ); + if ( !KProtocolInfo::supportsListing( origin ) ) { + if( origin.protocol() == "ftp" && KProtocolInfo::supportsReading( origin ) ) + errorMsg = i18n( "Krusader doesn't support FTP access via HTTP.\nIf it is not the case, please check and change the Proxy settings in kcontrol." ); + else + errorMsg = i18n( "Protocol not supported by Krusader:\n%1" ).arg( origin.url() ); + } + + if ( !errorMsg.isEmpty() ) { + if ( !quietMode ) KMessageBox::sorry( krApp, errorMsg ); + return false; + } + + busy = true; + + vfs_origin = origin; + vfs_origin.adjustPath(-1); + + //QTimer::singleShot( 0,this,SLOT(startLister()) ); + listError = false; + // Open the directory marked by origin + krConfig->setGroup( "Look&Feel" ); + //vfs_origin.adjustPath(+1); + KIO::Job *job = KIO::listDir( vfs_origin, false, showHidden ); + connect( job, SIGNAL( entries( KIO::Job*, const KIO::UDSEntryList& ) ), + this, SLOT( slotAddFiles( KIO::Job*, const KIO::UDSEntryList& ) ) ); + connect( job, SIGNAL( redirection( KIO::Job*, const KURL& ) ), + this, SLOT( slotRedirection( KIO::Job*, const KURL& ) ) ); + connect( job, SIGNAL( permanentRedirection( KIO::Job*, const KURL&, const KURL& ) ), + this, SLOT( slotPermanentRedirection( KIO::Job*, const KURL&, const KURL& ) ) ); + + connect( job, SIGNAL( result( KIO::Job* ) ), + this, SLOT( slotListResult( KIO::Job* ) ) ); + + job->setWindow( krApp ); + + if ( !quietMode ) { + emit startJob( job ); + //new KrProgress(job); ==> disabled because of in-panel refresh + } + + while ( busy && vfs_processEvents()); + + if ( listError ) return false; + + return true; +} + + +// copy a file to the vfs (physical) +void ftp_vfs::vfs_addFiles( KURL::List *fileUrls, KIO::CopyJob::CopyMode mode, QObject* toNotify, QString dir, PreserveMode /*pmode*/ ) { + KURL destUrl = vfs_origin; + + if ( dir != "" ) { + destUrl.addPath( dir ); + destUrl.cleanPath(); // removes the '..', '.' and extra slashes from the URL. + + if ( destUrl.protocol() == "tar" || destUrl.protocol() == "zip" || destUrl.protocol() == "krarc" ) { + if ( QDir( destUrl.path( -1 ) ).exists() ) + destUrl.setProtocol( "file" ); // if we get out from the archive change the protocol + } + } + + KIO::Job* job = new KIO::CopyJob( *fileUrls, destUrl, mode, false, true ); + connect( job, SIGNAL( result( KIO::Job* ) ), this, SLOT( vfs_refresh( KIO::Job* ) ) ); + if ( mode == KIO::CopyJob::Move ) // notify the other panel + connect( job, SIGNAL( result( KIO::Job* ) ), toNotify, SLOT( vfs_refresh( KIO::Job* ) ) ); +} + +// remove a file from the vfs (physical) +void ftp_vfs::vfs_delFiles( QStringList *fileNames ) { + KURL::List filesUrls; + KURL url; + + // names -> urls + for ( uint i = 0 ; i < fileNames->count(); ++i ) { + QString filename = ( *fileNames ) [ i ]; + url = vfs_origin; + url.addPath( filename ); + filesUrls.append( url ); + } + KIO::Job *job = new KIO::DeleteJob( filesUrls, false, true ); + connect( job, SIGNAL( result( KIO::Job* ) ), this, SLOT( vfs_refresh( KIO::Job* ) ) ); +} + + +KURL::List* ftp_vfs::vfs_getFiles( QStringList* names ) { + KURL url; + KURL::List* urls = new KURL::List(); + for ( QStringList::Iterator name = names->begin(); name != names->end(); ++name ) { + url = vfs_getFile( *name ); + urls->append( url ); + } + return urls; +} + + +// return a path to the file +KURL ftp_vfs::vfs_getFile( const QString& name ) { + vfile * vf = vfs_search( name ); + if ( !vf ) return KURL(); // empty + + KURL url = vf->vfile_getUrl(); + if ( vf->vfile_isDir() ) url.adjustPath( + 1 ); + return url; +} + +void ftp_vfs::vfs_mkdir( const QString& name ) { + KURL url = vfs_origin; + url.addPath( name ); + + KIO::SimpleJob* job = KIO::mkdir( url ); + connect( job, SIGNAL( result( KIO::Job* ) ), this, SLOT( vfs_refresh( KIO::Job* ) ) ); +} + +void ftp_vfs::vfs_rename( const QString& fileName, const QString& newName ) { + KURL::List fileUrls; + KURL oldUrl = vfs_origin; + oldUrl.addPath( fileName ) ; + + fileUrls.append( oldUrl ); + + KURL newUrl = vfs_origin; + newUrl.addPath( newName ); + + KIO::Job *job = new KIO::CopyJob( fileUrls, newUrl, KIO::CopyJob::Move, true, true ); + connect( job, SIGNAL( result( KIO::Job* ) ), this, SLOT( vfs_refresh( KIO::Job* ) ) ); +} + +QString ftp_vfs::vfs_workingDir() { + return vfs_origin.url( -1 ); +} + +#include "ftp_vfs.moc" |