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

📄 synchronizer.cpp

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