📄 synchronizer.cpp
字号:
setPermanent( parent ); bool doRefresh = false; if( marked ) { fileCount++; if( autoScroll && markParentDirectories( item ) ) doRefresh = true; } resultList.append( item ); emit comparedFileData( item ); if( doRefresh ) refresh( true ); if( marked && (displayUpdateCount++ % DISPLAY_UPDATE_PERIOD == (DISPLAY_UPDATE_PERIOD-1) ) ) qApp->processEvents(); } else temporaryList.append( item ); return item;}void Synchronizer::compareContentResult( SynchronizerFileItem * item, bool res ) { item->compareContentResult( res ); bool marked = autoScroll ? isMarked( item->task(), item->existsInLeft() && item->existsInRight() ) : false; item->setMarked( marked ); if( marked ) { markParentDirectories( item ); fileCount++; emit markChanged( item, true ); }}void Synchronizer::setPermanent( SynchronizerFileItem *item ){ if( item->parent() && item->parent()->isTemporary() ) setPermanent( item->parent() ); item->setPermanent(); resultList.append( item ); emit comparedFileData( item );}SynchronizerFileItem * Synchronizer::addLeftOnlyItem( SynchronizerFileItem *parent, const QString &file_name, const QString &dir, KIO::filesize_t size, time_t date, const QString &link, const QString &owner, const QString &group, mode_t mode, const QString &acl, bool isDir, bool isTemp ){ return addItem( parent, file_name, file_name, dir, dir, true, false, size, 0, date, 0, link, QString::null, owner, QString::null, group, QString::null, mode, (mode_t)-1, acl, QString::null, asymmetric ? TT_DELETE : TT_COPY_TO_RIGHT, isDir, isTemp );}SynchronizerFileItem * Synchronizer::addRightOnlyItem( SynchronizerFileItem *parent, const QString &file_name, const QString &dir, KIO::filesize_t size, time_t date, const QString &link, const QString &owner, const QString &group, mode_t mode, const QString &acl, bool isDir, bool isTemp ){ return addItem( parent, file_name, file_name, dir, dir, false, true, 0, size, 0, date, QString::null, link, QString::null, owner, QString::null, group, (mode_t)-1, mode, QString::null, acl, TT_COPY_TO_LEFT, isDir, isTemp );}SynchronizerFileItem * Synchronizer::addDuplicateItem( SynchronizerFileItem *parent, const QString &leftName, const QString &rightName, const QString &leftDir, const QString &rightDir, KIO::filesize_t leftSize, KIO::filesize_t rightSize, time_t leftDate, time_t rightDate, const QString &leftLink, const QString &rightLink, const QString &leftOwner, const QString &rightOwner, const QString &leftGroup, const QString &rightGroup, mode_t leftMode, mode_t rightMode, const QString &leftACL, const QString &rightACL, bool isDir, bool isTemp ){ TaskType task; int checkedRightDate = rightDate - timeOffset; int uncertain = 0; do { if( isDir ) { task = TT_EQUALS; break; } if( leftSize == rightSize ) { if( !leftLink.isNull() || !rightLink.isNull() ) { if( leftLink == rightLink ) { task = TT_EQUALS; break; } } else if( cmpByContent ) uncertain = TT_UNKNOWN; else { if( ignoreDate || leftDate == checkedRightDate ) { task = TT_EQUALS; break; } time_t diff = ( leftDate > checkedRightDate ) ? leftDate - checkedRightDate : checkedRightDate - leftDate; if( diff <= equalsThreshold ) { task = TT_EQUALS; break; } } } if( asymmetric ) task = TT_COPY_TO_LEFT; else if( ignoreDate ) task = TT_DIFFERS; else if( leftDate > checkedRightDate ) task = TT_COPY_TO_RIGHT; else if( leftDate < checkedRightDate ) task = TT_COPY_TO_LEFT; else task = TT_DIFFERS; }while( false ); SynchronizerFileItem * item = addItem( parent, leftName, rightName, leftDir, rightDir, true, true, leftSize, rightSize, leftDate, rightDate, leftLink, rightLink, leftOwner, rightOwner, leftGroup, rightGroup, leftMode, rightMode, leftACL, rightACL, (TaskType)(task + uncertain), isDir, isTemp ); if( uncertain == TT_UNKNOWN ) { KURL leftURL = vfs::fromPathOrURL( leftDir.isEmpty() ? leftBaseDir + leftName : leftBaseDir + leftDir + "/" + leftName ); KURL rightURL = vfs::fromPathOrURL( rightDir.isEmpty() ? rightBaseDir + rightName : rightBaseDir + rightDir + "/" + rightName ); stack.append( new CompareContentTask( this, item, leftURL, rightURL, leftSize ) ); } return item;}void Synchronizer::addSingleDirectory( SynchronizerFileItem *parent, SynchronizerDirList *directory, const QString &dirName, bool isLeft ){ const QString &url = directory->url(); vfile * file; QString file_name; /* walking through the directory files */ for( file=directory->first(); file != 0 && !stopped; file = directory->next() ) { if ( isDir( file ) ) continue; file_name = file->vfile_getName(); if( !query->match( file ) ) continue; if( isLeft ) addLeftOnlyItem( parent, file_name, dirName, file->vfile_getSize(), file->vfile_getTime_t(), readLink( file ), file->vfile_getOwner(), file->vfile_getGroup(), file->vfile_getMode(), file->vfile_getACL() ); else addRightOnlyItem( parent, file_name, dirName, file->vfile_getSize(), file->vfile_getTime_t(), readLink( file ), file->vfile_getOwner(), file->vfile_getGroup(), file->vfile_getMode(), file->vfile_getACL() ); } /* walking through the subdirectories */ for( file=directory->first(); file != 0 && !stopped; file=directory->next() ) { if ( file->vfile_isDir() && (followSymLinks || !file->vfile_isSymLink()) ) { file_name = file->vfile_getName(); if( excludedPaths.contains( dirName.isEmpty() ? file_name : dirName+"/"+file_name ) ) continue; if( !query->matchDirName( file_name ) ) continue; SynchronizerFileItem *me; if( isLeft ) me = addLeftOnlyItem( parent, file_name, dirName, 0, file->vfile_getTime_t(), readLink( file ), file->vfile_getOwner(), file->vfile_getGroup(), file->vfile_getMode(), file->vfile_getACL(), true, !query->match( file ) ); else me = addRightOnlyItem( parent, file_name, dirName, 0, file->vfile_getTime_t(), readLink( file ), file->vfile_getOwner(), file->vfile_getGroup(), file->vfile_getMode(), file->vfile_getACL(), true, !query->match( file ) ); stack.append( new CompareTask( me, url+file_name+"/", dirName.isEmpty() ? file_name : dirName+"/"+file_name, isLeft, ignoreHidden ) ); } }}void Synchronizer::setMarkFlags( bool left, bool equal, bool differs, bool right, bool dup, bool sing, bool del ){ markEquals = equal; markDiffers = differs; markCopyToLeft = left; markCopyToRight = right; markDeletable = del; markDuplicates = dup; markSingles = sing;}bool Synchronizer::isMarked( TaskType task, bool isDuplicate ){ if( (isDuplicate && !markDuplicates) || (!isDuplicate && !markSingles) ) return false; switch( task ) { case TT_EQUALS: return markEquals; case TT_DIFFERS: return markDiffers; case TT_COPY_TO_LEFT: return markCopyToLeft; case TT_COPY_TO_RIGHT: return markCopyToRight; case TT_DELETE: return markDeletable; default: return false; }}bool Synchronizer::markParentDirectories( SynchronizerFileItem *item ){ if( item->parent() == 0 || item->parent()->isMarked() ) return false; markParentDirectories( item->parent() ); item->parent()->setMarked( true ); fileCount++; emit markChanged( item->parent(), false ); return true;}int Synchronizer::refresh(bool nostatus){ fileCount = 0; SynchronizerFileItem *item = resultList.first(); while( item ) { bool marked = isMarked( item->task(), item->existsInLeft() && item->existsInRight() ); item->setMarked( marked ); if( marked ) { markParentDirectories( item ); fileCount++; } item = resultList.next(); } item = resultList.first(); while( item ) { emit markChanged( item, false ); item = resultList.next(); } if( !nostatus ) emit statusInfo( i18n( "Number of files: %1" ).arg( fileCount ) ); return fileCount;}void Synchronizer::operate( SynchronizerFileItem *item, void (*executeOperation)(SynchronizerFileItem *) ){ executeOperation( item ); if( item->isDir() ) { QString leftDirName = ( item->leftDirectory() == "" ) ? item->leftName() : item->leftDirectory() + "/" + item->leftName() ; QString rightDirName = ( item->rightDirectory() == "" ) ? item->rightName() : item->rightDirectory() + "/" + item->rightName() ; item = resultList.first(); while( item ) { if( item->leftDirectory() == leftDirName || item->leftDirectory().startsWith( leftDirName + "/" ) || item->rightDirectory() == rightDirName || item->rightDirectory().startsWith( rightDirName + "/" ) ) executeOperation( item ); item = resultList.next(); } }}void Synchronizer::excludeOperation( SynchronizerFileItem *item ){ item->setTask( TT_DIFFERS );}void Synchronizer::exclude( SynchronizerFileItem *item ){ if( !item->parent() || item->parent()->task() != TT_DELETE ) operate( item, excludeOperation ); /* exclude only if the parent task is not DEL */}void Synchronizer::restoreOperation( SynchronizerFileItem *item ){ item->restoreOriginalTask();}void Synchronizer::restore( SynchronizerFileItem *item ){ operate( item, restoreOperation ); while( ( item = item->parent() ) != 0 ) /* in case of restore, the parent directories */ { /* must be changed for being consistent */ if( item->task() != TT_DIFFERS ) break; if( item->originalTask() == TT_DELETE ) /* if the parent original task is delete */ break; /* don't touch it */ item->restoreOriginalTask(); /* restore */ }}void Synchronizer::reverseDirectionOperation( SynchronizerFileItem *item ){ if( item->existsInRight() && item->existsInLeft() ) { if( item->task() == TT_COPY_TO_LEFT ) item->setTask( TT_COPY_TO_RIGHT ); else if( item->task() == TT_COPY_TO_RIGHT ) item->setTask( TT_COPY_TO_LEFT ); }}void Synchronizer::reverseDirection( SynchronizerFileItem *item ){ operate( item, reverseDirectionOperation );}void Synchronizer::deleteLeftOperation( SynchronizerFileItem *item ){ if( !item->existsInRight() && item->existsInLeft() ) item->setTask( TT_DELETE );}void Synchronizer::deleteLeft( SynchronizerFileItem *item ){ operate( item, deleteLeftOperation );}void Synchronizer::copyToLeftOperation( SynchronizerFileItem *item ){ if( item->existsInRight() ) { if( !item->isDir() ) item->setTask( TT_COPY_TO_LEFT ); else { if( item->existsInLeft() && item->existsInRight() ) item->setTask( TT_EQUALS ); else if( !item->existsInLeft() && item->existsInRight() ) item->setTask( TT_COPY_TO_LEFT ); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -