⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 synchronizer.cpp

📁 LINUX 下, 以 QT/KDE 写的档案管理员
💻 CPP
📖 第 1 页 / 共 4 页
字号:
       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 + -