summaryrefslogtreecommitdiffstats
path: root/krusader/VFS/ftp_vfs.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-22 18:58:28 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-22 18:58:28 +0000
commit83b9bf0e3bfb1d842b10b80bbe749095b2c661a1 (patch)
treeb05b1793361693ae88106648c2a953bed988f423 /krusader/VFS/ftp_vfs.cpp
downloadkrusader-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.cpp297
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"