📄 synchronizer.cpp
字号:
acl_t acl = acl_from_text( item->leftACL().latin1() ); if( acl && !acl_valid( acl ) ) acl_set_file( rightURL.path( -1 ).local8Bit(), ACL_TYPE_ACCESS, acl ); if( acl ) acl_free( acl ); }#endif } break; default: break; } } else { if( job->error() == KIO::ERR_FILE_ALREADY_EXIST && item->task() != TT_DELETE ) { KIO::RenameDlg_Result result; QString newDest; if( autoSkip ) break; if ( item->task() == TT_COPY_TO_LEFT ) { QWidget *mainWidget = qApp->mainWidget(); // WORKAROUND, don't give focus to the main widget qApp->setMainWidget( syncDlgWidget ); result = Observer::self()->open_RenameDlg ( job, i18n("File Already Exists"), vfs::pathOrURL( rightURL ), vfs::pathOrURL( leftURL ), (KIO::RenameDlg_Mode)( KIO::M_OVERWRITE | KIO::M_SKIP | KIO::M_MULTI ), newDest, item->rightSize(), item->leftSize(), (time_t)-1, (time_t)-1, item->rightDate(), item->leftDate()); qApp->setMainWidget( mainWidget ); } else { QWidget *mainWidget = qApp->mainWidget(); // WORKAROUND, don't give focus to the main widget qApp->setMainWidget( syncDlgWidget ); result = Observer::self()->open_RenameDlg ( job, i18n("File Already Exists"), vfs::pathOrURL( leftURL ), vfs::pathOrURL( rightURL ), (KIO::RenameDlg_Mode)( KIO::M_OVERWRITE | KIO::M_SKIP | KIO::M_MULTI ), newDest, item->leftSize(), item->rightSize(), (time_t)-1, (time_t)-1, item->leftDate(), item->rightDate()); qApp->setMainWidget( mainWidget ); } switch ( result ) { case KIO::R_RENAME: item->setDestination( newDest ); executeTask( item ); inTaskFinished--; return; case KIO::R_OVERWRITE: item->setOverWrite(); executeTask( item ); inTaskFinished--; return; case KIO::R_OVERWRITE_ALL: overWrite = true; executeTask( item ); inTaskFinished--; return; case KIO::R_AUTO_SKIP: autoSkip = true; case KIO::R_SKIP: default: break; } break; } if( job->error() != KIO::ERR_DOES_NOT_EXIST || item->task() != TT_DELETE ) { if( autoSkip ) break; QString error; switch( item->task() ) { case TT_COPY_TO_LEFT: error = i18n("Error at copying file %1 to %2!") .arg( vfs::pathOrURL( rightURL ) ) .arg( vfs::pathOrURL( leftURL ) ); break; case TT_COPY_TO_RIGHT: error = i18n("Error at copying file %1 to %2!") .arg( vfs::pathOrURL( leftURL ) ) .arg( vfs::pathOrURL( rightURL ) ); break; case TT_DELETE: error = i18n("Error at deleting file %1!").arg( vfs::pathOrURL( leftURL ) ); break; default: break; } QWidget *mainWidget = qApp->mainWidget(); // WORKAROUND, don't give focus to the main widget qApp->setMainWidget( syncDlgWidget ); KIO::SkipDlg_Result result = Observer::self()->open_SkipDlg( job, true, error ); qApp->setMainWidget( mainWidget ); switch( result ) { case KIO::S_CANCEL: executeTask( item ); /* simply retry */ inTaskFinished--; return; case KIO::S_AUTO_SKIP: autoSkip = true; default: break; } } } }while( false ); switch( item->task() ) { case TT_COPY_TO_LEFT: leftCopyNr++; leftCopySize += item->rightSize() - receivedSize; break; case TT_COPY_TO_RIGHT: rightCopyNr++; rightCopySize += item->leftSize() - receivedSize; break; case TT_DELETE: deleteNr++; deleteSize += item->leftSize() - receivedSize; break; default: break; } emit processedSizes( leftCopyNr, leftCopySize, rightCopyNr, rightCopySize, deleteNr, deleteSize ); if( --inTaskFinished == 0 ) { if( paused ) emit pauseAccepted(); else synchronizeLoop(); }}void Synchronizer::slotProcessedSize( KIO::Job * job , KIO::filesize_t size){ KIO::filesize_t dl = 0, dr = 0, dd = 0; SynchronizerFileItem * item = jobMap[ job ]; KIO::filesize_t lastProcessedSize = 0; if( receivedMap.contains( job ) ) lastProcessedSize = receivedMap[ job ]; receivedMap[ job ] = size; switch( item->task() ) { case TT_COPY_TO_LEFT: dl = size - lastProcessedSize; break; case TT_COPY_TO_RIGHT: dr = size - lastProcessedSize; break; case TT_DELETE: dd = size - lastProcessedSize; break; default: break; } emit processedSizes( leftCopyNr, leftCopySize+=dl, rightCopyNr, rightCopySize+=dr, deleteNr, deleteSize+=dd );}void Synchronizer::pause(){ paused = true;}void Synchronizer::resume(){ paused = false; synchronizeLoop();}QString Synchronizer::leftBaseDirectory(){ return leftBaseDir;}QString Synchronizer::rightBaseDirectory(){ return rightBaseDir;}class KgetProgressDialog : public KDialogBase{public: KgetProgressDialog( QWidget *parent=0, const char *name=0, const QString &caption=QString::null, const QString &text=QString::null, bool modal=false) : KDialogBase( KDialogBase::Plain, caption, KDialogBase::User1 | KDialogBase::Cancel, KDialogBase::Cancel, parent, name, modal ) { showButton(KDialogBase::Close, false); QFrame* mainWidget = plainPage(); QVBoxLayout* layout = new QVBoxLayout(mainWidget, 10); QLabel *mLabel = new QLabel(text, mainWidget); layout->addWidget(mLabel); mProgressBar = new KProgress(mainWidget); layout->addWidget(mProgressBar); setButtonText( KDialogBase::User1, i18n( "Pause" ) ); mCancelled = mPaused = false; } KProgress *progressBar() { return mProgressBar; } void slotUser1() { if( ( mPaused = !mPaused ) == false ) setButtonText( KDialogBase::User1, i18n( "Pause" ) ); else setButtonText( KDialogBase::User1, i18n( "Resume" ) ); } void slotCancel() { mCancelled = true; KDialogBase::slotCancel(); } bool wasCancelled() { return mCancelled; } bool isPaused() { return mPaused; }private: KProgress *mProgressBar; bool mCancelled; bool mPaused;};void Synchronizer::synchronizeWithKGet(){ bool isLeftLocal = vfs::fromPathOrURL( leftBaseDirectory() ).isLocalFile(); KgetProgressDialog *progDlg = 0; int processedCount = 0, totalCount = 0; SynchronizerFileItem *item = resultList.first(); for(; item; item = resultList.next() ) if( item->isMarked() ) totalCount++; item = resultList.first(); while( item ) { if( item->isMarked() ) { KURL downloadURL, destURL; QString leftDirName = item->leftDirectory().isEmpty() ? "" : item->leftDirectory() + "/"; QString rightDirName = item->rightDirectory().isEmpty() ? "" : item->rightDirectory() + "/"; QString destDir; if( progDlg == 0 ) { progDlg = new KgetProgressDialog( krApp, "Synchronizer Progress Dlg", i18n("Krusader::Synchronizer"), i18n( "Feeding the URLs to Kget" ), true ); progDlg->progressBar()->setTotalSteps( totalCount ); progDlg->show(); qApp->processEvents(); } if( item->task() == TT_COPY_TO_RIGHT && !isLeftLocal ) { downloadURL = vfs::fromPathOrURL( leftBaseDirectory() + leftDirName + item->leftName() ); destDir = rightBaseDirectory() + rightDirName; destURL = vfs::fromPathOrURL( destDir + item->rightName() ); if( item->isDir() ) destDir += item->leftName(); } if( item->task() == TT_COPY_TO_LEFT && isLeftLocal ) { downloadURL = vfs::fromPathOrURL( rightBaseDirectory() + rightDirName + item->rightName() ); destDir = leftBaseDirectory() + leftDirName; destURL = vfs::fromPathOrURL( destDir + item->leftName() ); if( item->isDir() ) destDir += item->rightName(); } // creating the directory system for( int i=0; i >= 0 ; i= destDir.find('/',i+1) ) if( !QDir( destDir.left(i) ).exists() ) QDir().mkdir( destDir.left(i) ); if( !item->isDir() && !downloadURL.isEmpty() ) { if( QFile( destURL.path() ).exists() ) QFile( destURL.path() ).remove(); QString source = downloadURL.prettyURL(); if( source.contains( '@' ) >= 2 ) /* is this an ftp proxy URL? */ { int lastAt = source.findRev( '@' ); QString startString = source.left( lastAt ); QString endString = source.mid( lastAt ); startString.replace( "@", "%40" ); source = startString+endString; } KProcess p; p << KrServices::fullPathName( "kget" ) << source << destURL.path(); if (!p.start(KProcess::Block)) KMessageBox::error(parentWidget,i18n("Error executing ")+KrServices::fullPathName( "kget" )+" !"); else p.detach(); } progDlg->progressBar()->setProgress( ++processedCount ); do { qApp->processEvents(); if( progDlg->wasCancelled() ) break; if( progDlg->isPaused() ) usleep( 100000 ); }while( progDlg->isPaused() ); if( progDlg->wasCancelled() ) break; } item = resultList.next(); } if( progDlg ) delete progDlg;}bool Synchronizer::isDir( const vfile * file ) { if( followSymLinks ) { return file->vfile_isDir(); } else { return file->vfile_isDir() && !file->vfile_isSymLink(); }}QString Synchronizer::readLink( const vfile * file ) { if( file->vfile_isSymLink() ) return file->vfile_getSymDest(); else return QString::null;}#include "synchronizer.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -