diff options
Diffstat (limited to 'src/app/VFS/ftp_vfs.cpp')
-rw-r--r-- | src/app/VFS/ftp_vfs.cpp | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/src/app/VFS/ftp_vfs.cpp b/src/app/VFS/ftp_vfs.cpp new file mode 100644 index 0000000..2da0665 --- /dev/null +++ b/src/app/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 +// TQt includes +#include <tqdir.h> +#include <tqregexp.h> +#include <tqtimer.h> +#include <tqeventloop.h> +// TDE includes +#include <tdeio/jobclasses.h> +#include <tdelocale.h> +#include <tdeio/job.h> +#include <tdemessagebox.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( TQObject* panel ) : vfs( panel ), busy( false ) { + // set the writable attribute + isWritable = true; + vfs_type = FTP; +} + +ftp_vfs::~ftp_vfs() { + busy = false; +} + +void ftp_vfs::slotAddFiles( TDEIO::Job *, const TDEIO::UDSEntryList& entries ) { + int rwx = -1; + + TQString prot = vfs_origin.protocol(); + if( prot == "krarc" || prot == "tar" || prot == "zip" ) + rwx = PERM_ALL; + + TDEIO::UDSEntryListConstIterator it = entries.begin(); + TDEIO::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 + TQString name = kfi.text(); + // ignore un-needed entries + if ( name.isEmpty() || name == "." || name == ".." ) continue; + + TDEIO::filesize_t size = kfi.size(); + time_t mtime = kfi.time( TDEIO::UDS_MODIFICATION_TIME ); + bool symLink = kfi.isLink(); + mode_t mode = kfi.mode() | kfi.permissions(); + TQString perm = KRpermHandler::mode2TQString( mode ); + // set the mimetype + TQString mime = kfi.mimetype(); + TQString 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 { + TQString 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 TQString() + } + } +#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( TDEIO::Job*, const KURL&, const KURL& newUrl ) { + vfs_origin = newUrl; + vfs_origin.adjustPath(-1); +} + +void ftp_vfs::slotRedirection( TDEIO::Job *, const KURL &url ) { + // update the origin + vfs_origin = url; + vfs_origin.adjustPath(-1); +} + +void ftp_vfs::slotListResult( TDEIO::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 ) { + TQString errorMsg = TQString(); + 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); + + //TQTimer::singleShot( 0,this,TQ_SLOT(startLister()) ); + listError = false; + // Open the directory marked by origin + krConfig->setGroup( "Look&Feel" ); + //vfs_origin.adjustPath(+1); + TDEIO::Job *job = TDEIO::listDir( vfs_origin, false, showHidden ); + connect( job, TQ_SIGNAL( entries( TDEIO::Job*, const TDEIO::UDSEntryList& ) ), + this, TQ_SLOT( slotAddFiles( TDEIO::Job*, const TDEIO::UDSEntryList& ) ) ); + connect( job, TQ_SIGNAL( redirection( TDEIO::Job*, const KURL& ) ), + this, TQ_SLOT( slotRedirection( TDEIO::Job*, const KURL& ) ) ); + connect( job, TQ_SIGNAL( permanentRedirection( TDEIO::Job*, const KURL&, const KURL& ) ), + this, TQ_SLOT( slotPermanentRedirection( TDEIO::Job*, const KURL&, const KURL& ) ) ); + + connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ), + this, TQ_SLOT( slotListResult( TDEIO::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, TDEIO::CopyJob::CopyMode mode, TQObject* toNotify, TQString 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 ( TQDir( destUrl.path( -1 ) ).exists() ) + destUrl.setProtocol( "file" ); // if we get out from the archive change the protocol + } + } + + TDEIO::Job* job = new TDEIO::CopyJob( *fileUrls, destUrl, mode, false, true ); + connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ), this, TQ_SLOT( vfs_refresh( TDEIO::Job* ) ) ); + if ( mode == TDEIO::CopyJob::Move ) // notify the other panel + connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ), toNotify, TQ_SLOT( vfs_refresh( TDEIO::Job* ) ) ); +} + +// remove a file from the vfs (physical) +void ftp_vfs::vfs_delFiles( TQStringList *fileNames ) { + KURL::List filesUrls; + KURL url; + + // names -> urls + for ( uint i = 0 ; i < fileNames->count(); ++i ) { + TQString filename = ( *fileNames ) [ i ]; + url = vfs_origin; + url.addPath( filename ); + filesUrls.append( url ); + } + TDEIO::Job *job = new TDEIO::DeleteJob( filesUrls, false, true ); + connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ), this, TQ_SLOT( vfs_refresh( TDEIO::Job* ) ) ); +} + + +KURL::List* ftp_vfs::vfs_getFiles( TQStringList* names ) { + KURL url; + KURL::List* urls = new KURL::List(); + for ( TQStringList::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 TQString& 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 TQString& name ) { + KURL url = vfs_origin; + url.addPath( name ); + + TDEIO::SimpleJob* job = TDEIO::mkdir( url ); + connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ), this, TQ_SLOT( vfs_refresh( TDEIO::Job* ) ) ); +} + +void ftp_vfs::vfs_rename( const TQString& fileName, const TQString& newName ) { + KURL::List fileUrls; + KURL oldUrl = vfs_origin; + oldUrl.addPath( fileName ) ; + + fileUrls.append( oldUrl ); + + KURL newUrl = vfs_origin; + newUrl.addPath( newName ); + + TDEIO::Job *job = new TDEIO::CopyJob( fileUrls, newUrl, TDEIO::CopyJob::Move, true, true ); + connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ), this, TQ_SLOT( vfs_refresh( TDEIO::Job* ) ) ); +} + +TQString ftp_vfs::vfs_workingDir() { + return vfs_origin.url( -1 ); +} + +#include "ftp_vfs.moc" |