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

📄 synchronizerdirlist.cpp

📁 LINUX 下, 以 QT/KDE 写的档案管理员
💻 CPP
字号:
/***************************************************************************                   synchronizerdirlist.cpp  -  description                             -------------------    copyright            : (C) 2006 + by Csaba Karai    e-mail               : krusader@users.sourceforge.net    web site             : http://krusader.sourceforge.net ---------------------------------------------------------------------------  Description ***************************************************************************  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                                                     H e a d e r    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.                                   * *                                                                         * ***************************************************************************/#include "synchronizerdirlist.h"#include "../VFS/vfs.h"#include "../VFS/krpermhandler.h"#include <dirent.h>#include <klocale.h>#include <kmessagebox.h>#include <kfileitem.h>#include <klargefile.h>#include <qapplication.h>#include <qdir.h>#include <kdeversion.h>#if KDE_IS_VERSION(3,5,0) && defined( HAVE_POSIX_ACL )#include <sys/acl.h>#ifdef HAVE_NON_POSIX_ACL_EXTENSIONS#include <acl/libacl.h>#endif#endifSynchronizerDirList::SynchronizerDirList( QWidget *w, bool hidden ) : QObject(), QDict<vfile>(), fileIterator( 0 ),                                   parentWidget( w ), busy( false ), result( false ), ignoreHidden( hidden ), currentUrl() {  setAutoDelete( true );}SynchronizerDirList::~SynchronizerDirList() {  if( fileIterator )    delete fileIterator;}vfile * SynchronizerDirList::search( const QString &name, bool ignoreCase ) {  if( !ignoreCase )    return (*this)[ name ];  vfile *item = first();  QString file = name.lower();  while( item )  {    if( file == item->vfile_getName().lower() )      return item;    item = next();  }  return 0;}vfile * SynchronizerDirList::first() {  return fileIterator->toFirst();}vfile * SynchronizerDirList::next() {  return ++(*fileIterator);}bool SynchronizerDirList::load( const QString &urlIn, bool wait ) {  if( busy )    return false;  currentUrl = urlIn;  KURL url = vfs::fromPathOrURL( urlIn );  if( fileIterator == 0 )    fileIterator = new QDictIterator<vfile> ( *this );  clear();  if( url.isLocalFile() ) {    QString path = url.path( -1 );    DIR* dir = opendir(path.local8Bit());    if(!dir)  {      KMessageBox::error(parentWidget, i18n("Can't open the %1 directory!").arg( path ), i18n("Error"));      emit finished( result = false );      return false;    }    struct dirent* dirEnt;    QString name;    while( (dirEnt=readdir(dir)) != NULL ){      name = QString::fromLocal8Bit(dirEnt->d_name);      if (name=="." || name == "..") continue;      if (ignoreHidden && name.startsWith( "." ) ) continue;      QString fullName = path + "/" + name;      KDE_struct_stat stat_p;      KDE_lstat(fullName.local8Bit(),&stat_p);      QString perm = KRpermHandler::mode2QString(stat_p.st_mode);      bool symLink= S_ISLNK(stat_p.st_mode);      QString symlinkDest;      if( symLink ){  // who the link is pointing to ?        char symDest[256];        bzero(symDest,256);         int endOfName=0;        endOfName=readlink(fullName.local8Bit(),symDest,256);        if ( endOfName != -1 ) {          QString absSymDest = symlinkDest = QString::fromLocal8Bit( symDest );          if( !absSymDest.startsWith( "/" ) )            absSymDest = QDir::cleanDirPath( path + "/" + absSymDest );          if ( QDir( absSymDest ).exists() )            perm[0] = 'd';        }      }      QString mime = QString::null;      KURL fileURL = KURL::fromPathOrURL( fullName );      vfile* item=new vfile(name,stat_p.st_size,perm,stat_p.st_mtime,symLink,stat_p.st_uid,                        stat_p.st_gid,mime,symlinkDest,stat_p.st_mode);      item->vfile_setUrl( fileURL );      insert( name, item );    }    closedir( dir );    emit finished( result = true );    return true;  } else {    KIO::Job *job = KIO::listDir( url, false, true );    connect( job, SIGNAL( entries( KIO::Job*, const KIO::UDSEntryList& ) ),             this, SLOT( slotEntries( KIO::Job*, const KIO::UDSEntryList& ) ) );    connect( job, SIGNAL( result( KIO::Job* ) ),             this, SLOT( slotListResult( KIO::Job* ) ) );    busy = true;    if( !wait )      return true;    while( busy )      qApp->processEvents();    return result;  }}void SynchronizerDirList::slotEntries( KIO::Job * job, const KIO::UDSEntryList& entries ) {  KIO::UDSEntryListConstIterator it = entries.begin();  KIO::UDSEntryListConstIterator end = entries.end();  int rwx = -1;  QString prot = (( KIO::ListJob *)job )->url().protocol();  if( prot == "krarc" || prot == "tar" || prot == "zip" )    rwx = PERM_ALL;  while( it != end )  {    KFileItem kfi( *it, (( KIO::ListJob *)job )->url(), true, true );    QString key = kfi.text();    if( key != "." && key != ".." && (!ignoreHidden || !key.startsWith(".") ) ) {      mode_t mode = kfi.mode() | kfi.permissions();      QString perm = KRpermHandler::mode2QString( mode );      if ( kfi.isDir() )         perm[ 0 ] = 'd';      vfile *item = new vfile( kfi.text(), kfi.size(), perm, kfi.time( KIO::UDS_MODIFICATION_TIME ),          kfi.isLink(), kfi.user(), kfi.group(), kfi.user(),           kfi.mimetype(), kfi.linkDest(), mode, rwx#if KDE_IS_VERSION(3,5,0) && defined( HAVE_POSIX_ACL )                                              , kfi.ACL().asString()#endif                                                                     );      insert( key, item );    }    ++it;  }}void SynchronizerDirList::slotListResult( KIO::Job *job ) {  busy = false;  if ( job && job->error() ) {    job->showErrorDialog( parentWidget );    emit finished( result = false );    return;  }  emit finished( result = true );}#include "synchronizerdirlist.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -