📄 ftp_vfs.cpp
字号:
/*************************************************************************** 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 fileKURL 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"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -