22 #include "kdirlister.h"
25 #include <tqptrlist.h>
27 #include <tqeventloop.h>
29 #include <tdeapplication.h>
31 #include <tdelocale.h>
32 #include <tdeio/job.h>
33 #include <tdemessagebox.h>
34 #include <tdeglobal.h>
35 #include <tdeglobalsettings.h>
36 #include <kstaticdeleter.h>
37 #include <kprotocolinfo.h>
39 #include "kdirlister_p.h"
44 KDirListerCache* KDirListerCache::s_pSelf = 0;
45 static KStaticDeleter<KDirListerCache> sd_KDirListerCache;
55 KDirListerCache::KDirListerCache(
int maxCount )
56 : itemsCached( maxCount )
58 kdDebug(7004) <<
"+KDirListerCache" << endl;
60 itemsInUse.setAutoDelete(
false );
61 itemsCached.setAutoDelete(
true );
62 urlsCurrentlyListed.setAutoDelete(
true );
63 urlsCurrentlyHeld.setAutoDelete(
true );
64 pendingUpdates.setAutoDelete(
true );
66 connect( kdirwatch, TQT_SIGNAL( dirty(
const KURL& ) ),
67 this, TQT_SLOT( slotFileDirty(
const KURL& ) ) );
68 connect( kdirwatch, TQT_SIGNAL( created(
const TQString& ) ),
69 this, TQT_SLOT( slotFileCreated(
const TQString& ) ) );
70 connect( kdirwatch, TQT_SIGNAL( deleted(
const TQString& ) ),
71 this, TQT_SLOT( slotFileDeleted(
const TQString& ) ) );
74 KDirListerCache::~KDirListerCache()
76 kdDebug(7004) <<
"-KDirListerCache" << endl;
78 itemsInUse.setAutoDelete(
true );
81 urlsCurrentlyListed.clear();
82 urlsCurrentlyHeld.clear();
85 kdirwatch->disconnect(
this );
90 bool KDirListerCache::listDir(
KDirLister *lister,
const KURL& _u,
91 bool _keep,
bool _reload )
97 TQString urlStr = _url.url();
98 TQString urlReferenceStr = _url.internalReferenceURL();
107 kdDebug(7004) << k_funcinfo << lister <<
" url=" << _url
108 <<
" keep=" << _keep <<
" reload=" << _reload << endl;
116 forgetDirs( lister );
118 lister->d->rootFileItem = 0;
120 else if ( lister->d->lstDirs.find( _url ) != lister->d->lstDirs.end() )
123 stop( lister, _url );
126 forgetDirs( lister, _url,
true );
128 if ( lister->d->url == _url )
129 lister->d->rootFileItem = 0;
132 lister->d->lstDirs.append( _url );
134 if ( lister->d->url.isEmpty() || !_keep )
135 lister->d->url = _url;
137 DirItem *itemU = itemsInUse[urlStr +
":" + urlReferenceStr];
140 if ( !urlsCurrentlyListed[urlStr +
":" + urlReferenceStr] )
147 kdDebug(7004) <<
"listDir: Entry already in use: " << _url << endl;
149 bool oldState = lister->d->complete;
150 lister->d->complete =
false;
154 if ( !lister->d->rootFileItem && lister->d->url == _url ) {
155 lister->d->rootFileItem = itemU->rootItem;
158 lister->addNewItems( *(itemU->lstItems) );
162 assert( urlsCurrentlyHeld[urlStr +
":" + urlReferenceStr] );
163 urlsCurrentlyHeld[urlStr +
":" + urlReferenceStr]->append( lister );
165 lister->d->complete = oldState;
167 lister->emitCompleted( _url );
168 if ( lister->d->complete ) {
172 if ( _reload || !itemU->complete ) {
173 updateDirectory( _url );
176 else if ( !_reload && (itemC = itemsCached.take( urlStr )) )
178 kdDebug(7004) <<
"listDir: Entry in cache: " << _url << endl;
180 itemC->decAutoUpdate();
181 itemsInUse.insert( urlStr +
":" + urlReferenceStr, itemC );
184 bool oldState = lister->d->complete;
185 lister->d->complete =
false;
189 if ( !lister->d->rootFileItem && lister->d->url == _url ) {
190 lister->d->rootFileItem = itemC->rootItem;
193 lister->addNewItems( *(itemC->lstItems) );
196 Q_ASSERT( !urlsCurrentlyHeld[urlStr +
":" + urlReferenceStr] );
197 TQPtrList<KDirLister> *list =
new TQPtrList<KDirLister>;
198 list->append( lister );
199 urlsCurrentlyHeld.insert( urlStr +
":" + urlReferenceStr, list );
201 lister->d->complete = oldState;
203 lister->emitCompleted( _url );
204 if ( lister->d->complete ) {
208 if ( !itemC->complete ) {
209 updateDirectory( _url );
214 kdDebug(7004) <<
"listDir: Entry not in cache or reloaded: " << _url << endl;
216 TQPtrList<KDirLister> *list =
new TQPtrList<KDirLister>;
217 list->append( lister );
218 urlsCurrentlyListed.insert( urlStr +
":" + urlReferenceStr, list );
220 itemsCached.remove( urlStr );
221 itemU =
new DirItem( _url );
222 itemsInUse.insert( urlStr +
":" + urlReferenceStr, itemU );
232 if ( lister->d->url == _url ) {
233 lister->d->rootFileItem = 0;
237 jobs.insert( job, TQValueList<TDEIO::UDSEntry>() );
239 lister->jobStarted( job );
240 lister->connectJob( job );
242 if ( lister->d->window ) {
246 connect( job, TQT_SIGNAL( entries(
TDEIO::Job *,
const TDEIO::UDSEntryList & ) ),
247 this, TQT_SLOT( slotEntries(
TDEIO::Job *,
const TDEIO::UDSEntryList & ) ) );
248 connect( job, TQT_SIGNAL( result(
TDEIO::Job * ) ),
249 this, TQT_SLOT( slotResult(
TDEIO::Job * ) ) );
250 connect( job, TQT_SIGNAL( redirection(
TDEIO::Job *,
const KURL & ) ),
251 this, TQT_SLOT( slotRedirection(
TDEIO::Job *,
const KURL & ) ) );
260 kdDebug(7004) <<
"listDir: Entry currently being listed: " << _url << endl;
264 urlsCurrentlyListed[urlStr +
":" + urlReferenceStr]->append( lister );
266 TDEIO::ListJob *job = jobForUrl( urlStr +
":" + urlReferenceStr );
269 lister->jobStarted( job );
270 lister->connectJob( job );
274 if ( !lister->d->rootFileItem && lister->d->url == _url ) {
275 lister->d->rootFileItem = itemU->rootItem;
278 lister->addNewItems( *(itemU->lstItems) );
283 if ( lister->d->autoUpdate ) {
284 itemU->incAutoUpdate();
290 bool KDirListerCache::validURL(
const KDirLister *lister,
const KURL& url )
const
292 if ( !url.isValid() )
294 if ( lister->d->autoErrorHandling )
296 TQString tmp = i18n(
"Malformed URL\n%1").arg( url.prettyURL() );
297 KMessageBox::error( lister->d->errorParent, tmp );
304 if ( lister->d->autoErrorHandling )
307 TQString tmp = i18n(
"Malformed URL\n%1").arg( url.prettyURL() );
308 KMessageBox::error( lister->d->errorParent, tmp );
316 void KDirListerCache::stop(
KDirLister *lister )
321 kdDebug(7004) << k_funcinfo <<
"lister: " << lister << endl;
322 bool stopped =
false;
324 TQDictIterator< TQPtrList<KDirLister> > it( urlsCurrentlyListed );
325 TQPtrList<KDirLister> *listers;
327 while ( (listers = it.current()) )
329 curIndex = listers->findRef( lister );
333 TQString url = it.currentKey();
334 KDirLister* curLister = listers->at( curIndex );
337 bool ret = listers->removeRef( lister );
342 lister->jobDone( job );
346 TQPtrList<KDirLister> *holders = urlsCurrentlyHeld[url];
349 holders =
new TQPtrList<KDirLister>;
350 urlsCurrentlyHeld.insert( url, holders );
353 holders->append( lister );
355 emit lister->
canceled( curLister->d->url );
359 if ( listers->isEmpty() )
366 urlsCurrentlyListed.remove( url );
378 lister->d->complete =
true;
385 void KDirListerCache::stop(
KDirLister *lister,
const KURL& _u )
387 TQString urlStr( _u.url(-1) );
388 TQString urlReferenceStr = _u.internalReferenceURL();
392 kdDebug(7004) << k_funcinfo << lister <<
" url=" << _url << endl;
394 TQPtrList<KDirLister> *listers = urlsCurrentlyListed[urlStr +
":" + urlReferenceStr];
395 if ( !listers || !listers->removeRef( lister ) )
399 TQPtrList<KDirLister> *holders = urlsCurrentlyHeld[urlStr +
":" + urlReferenceStr];
402 holders =
new TQPtrList<KDirLister>;
403 urlsCurrentlyHeld.insert( urlStr +
":" + urlReferenceStr, holders );
406 holders->append( lister );
409 TDEIO::ListJob *job = jobForUrl( urlStr +
":" + urlReferenceStr );
411 lister->jobDone( job );
416 if ( listers->isEmpty() )
422 urlsCurrentlyListed.remove( urlStr +
":" + urlReferenceStr );
425 if ( lister->numJobs() == 0 )
427 lister->d->complete =
true;
434 void KDirListerCache::setAutoUpdate(
KDirLister *lister,
bool enable )
438 for ( KURL::List::Iterator it = lister->d->lstDirs.begin();
439 it != lister->d->lstDirs.end(); ++it )
442 itemsInUse[(*it).url() +
":" + (*it).internalReferenceURL()]->incAutoUpdate();
445 itemsInUse[(*it).url() +
":" + (*it).internalReferenceURL()]->decAutoUpdate();
450 void KDirListerCache::forgetDirs(
KDirLister *lister )
452 kdDebug(7004) << k_funcinfo << lister << endl;
454 emit lister->
clear();
457 KURL::List lstDirsCopy = lister->d->lstDirs;
458 for ( KURL::List::Iterator it = lstDirsCopy.begin();
459 it != lstDirsCopy.end(); ++it )
461 forgetDirs( lister, *it,
false );
465 void KDirListerCache::forgetDirs(
KDirLister *lister,
const KURL& _url,
bool notify )
467 kdDebug(7004) << k_funcinfo << lister <<
" _url: " << _url << endl;
470 url.adjustPath( -1 );
471 TQString urlStr = url.url();
472 TQString urlReferenceStr = url.internalReferenceURL();
473 TQPtrList<KDirLister> *holders = urlsCurrentlyHeld[urlStr +
":" + urlReferenceStr];
477 holders->removeRef( lister );
484 lister->d->lstDirs.remove( lister->d->lstDirs.find( url ) );
486 DirItem *item = itemsInUse[urlStr +
":" + urlReferenceStr];
488 if ( holders && holders->isEmpty() )
490 urlsCurrentlyHeld.remove( urlStr +
":" + urlReferenceStr );
491 if ( !urlsCurrentlyListed[urlStr +
":" + urlReferenceStr] )
494 itemsInUse.remove( urlStr +
":" + urlReferenceStr );
497 TDEIO::ListJob *job = jobForUrl( urlStr +
":" + urlReferenceStr );
500 lister->jobDone( job );
502 kdDebug(7004) << k_funcinfo <<
"Killing update job for " << urlStr << endl;
505 if ( lister->numJobs() == 0 )
507 lister->d->complete =
true;
513 emit lister->
clear( url );
515 if ( item && item->complete )
517 kdDebug(7004) << k_funcinfo << lister <<
" item moved into cache: " << url << endl;
518 itemsCached.insert( urlStr, item );
523 const bool isLocal = item->
url.isLocalFile();
525 bool containsManuallyMounted =
false;
526 if ( !isManuallyMounted && item->lstItems && isLocal )
532 KFileItemListIterator kit( *item->lstItems );
533 for ( ; kit.current() && !containsManuallyMounted; ++kit )
535 containsManuallyMounted =
true;
538 if ( isManuallyMounted || containsManuallyMounted )
540 kdDebug(7004) <<
"Not adding a watch on " << item->url <<
" because it " <<
541 ( isManuallyMounted ?
"is manually mounted" :
"contains a manually mounted subdir" ) << endl;
542 item->complete =
false;
545 item->incAutoUpdate();
555 if ( item && lister->d->autoUpdate )
556 item->decAutoUpdate();
559 void KDirListerCache::updateDirectory(
const KURL& _dir )
561 kdDebug(7004) << k_funcinfo << _dir << endl;
563 TQString urlStr = _dir.url(-1);
564 TQString urlReferenceStr = _dir.internalReferenceURL();
565 if ( !checkUpdate( _dir, -1 ) ) {
575 TQPtrList<KDirLister> *listers = urlsCurrentlyListed[urlStr +
":" + urlReferenceStr];
576 TQPtrList<KDirLister> *holders = urlsCurrentlyHeld[urlStr +
":" + urlReferenceStr];
580 TQWidget *window = 0;
581 TDEIO::ListJob *job = jobForUrl( urlStr +
":" + urlReferenceStr );
590 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
596 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() ) {
601 kdDebug(7004) << k_funcinfo <<
"Killed = " << killed << endl;
606 Q_ASSERT( !listers || (listers && killed) );
609 jobs.insert( job, TQValueList<TDEIO::UDSEntry>() );
611 connect( job, TQT_SIGNAL(entries(
TDEIO::Job *,
const TDEIO::UDSEntryList & )),
612 this, TQT_SLOT(slotUpdateEntries(
TDEIO::Job *,
const TDEIO::UDSEntryList & )) );
613 connect( job, TQT_SIGNAL(result(
TDEIO::Job * )),
614 this, TQT_SLOT(slotUpdateResult(
TDEIO::Job * )) );
616 kdDebug(7004) << k_funcinfo <<
"update started in " << _dir << endl;
619 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
620 kdl->jobStarted( job );
629 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() )
631 kdl->jobStarted( job );
632 if ( first && kdl->d->window )
637 emit kdl->started( _dir );
644 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() ) {
645 kdl->jobStarted( job );
651 bool KDirListerCache::checkUpdate(
const KURL& _dir,
int truncationMode )
653 if ( !itemsInUse[_dir.url(truncationMode) +
":" + _dir.internalReferenceURL()] )
655 DirItem *item = itemsCached[_dir.url(truncationMode)];
656 if ( item && item->complete )
658 item->complete =
false;
659 item->decAutoUpdate();
672 KFileItemList *KDirListerCache::itemsForDir(
const KURL &_dir )
const
674 TQString urlStr = _dir.url(-1);
675 TQString urlReferenceStr = _dir.internalReferenceURL();
676 DirItem *item = itemsInUse[ urlStr +
":" + urlReferenceStr ];
678 item = itemsCached[ urlStr ];
680 return item ? item->lstItems : 0;
683 KFileItem *KDirListerCache::findByName(
const KDirLister *lister,
const TQString& _name )
const
687 for ( KURL::List::Iterator it = lister->d->lstDirs.begin();
688 it != lister->d->lstDirs.end(); ++it )
690 KFileItemListIterator kit( *itemsInUse[(*it).url() +
":" + (*it).internalReferenceURL()]->lstItems );
691 for ( ; kit.current(); ++kit )
692 if ( (*kit)->name() == _name )
704 KURL parentDir( _url );
705 parentDir.setPath( parentDir.directory() );
708 if ( lister && !lister->d->lstDirs.contains( parentDir ) )
711 KFileItemList *itemList = itemsForDir( parentDir );
714 KFileItemListIterator kit( *itemList );
715 for ( ; kit.current(); ++kit )
716 if ( (*kit)->url() == _url )
722 void KDirListerCache::FilesAdded(
const KURL &dir )
724 kdDebug(7004) << k_funcinfo << dir << endl;
725 updateDirectory( dir );
728 void KDirListerCache::FilesRemoved(
const KURL::List &fileList )
730 kdDebug(7004) << k_funcinfo << endl;
731 KURL::List::ConstIterator it = fileList.begin();
732 for ( ; it != fileList.end() ; ++it )
736 KURL parentDir( *it );
737 parentDir.setPath( parentDir.directory() );
738 KFileItemList *lstItems = itemsForDir( parentDir );
742 for ( ; fit; fit = lstItems->next() )
743 if ( fit->
url() == *it ) {
754 TQPtrList<KDirLister> *listers = urlsCurrentlyHeld[parentDir.url() +
":" + parentDir.internalReferenceURL()];
756 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
757 kdl->emitDeleteItem( fileitem );
763 if ( !fileitem || fileitem->
isDir() )
775 void KDirListerCache::FilesChanged(
const KURL::List &fileList )
777 KURL::List dirsToUpdate;
778 kdDebug(7004) << k_funcinfo <<
"only half implemented" << endl;
779 KURL::List::ConstIterator it = fileList.begin();
780 for ( ; it != fileList.end() ; ++it )
782 if ( ( *it ).isLocalFile() )
784 kdDebug(7004) <<
"KDirListerCache::FilesChanged " << *it << endl;
785 KFileItem *fileitem = findByURL( 0, *it );
789 aboutToRefreshItem( fileitem );
791 emitRefreshItem( fileitem );
794 kdDebug(7004) <<
"item not found" << endl;
800 dir.setPath( dir.directory(
true ) );
801 if ( dirsToUpdate.find( dir ) == dirsToUpdate.end() ) {
802 dirsToUpdate.prepend( dir );
807 KURL::List::ConstIterator itdir = dirsToUpdate.begin();
808 for ( ; itdir != dirsToUpdate.end() ; ++itdir ) {
809 updateDirectory( *itdir );
815 void KDirListerCache::FileRenamed(
const KURL &src,
const KURL &dst )
817 kdDebug(7004) << k_funcinfo << src.prettyURL() <<
" -> " << dst.prettyURL() << endl;
824 renameDir( src, dst );
828 oldurl.adjustPath( -1 );
829 KFileItem *fileitem = findByURL( 0, oldurl );
836 aboutToRefreshItem( fileitem );
839 emitRefreshItem( fileitem );
847 void KDirListerCache::aboutToRefreshItem(
KFileItem *fileitem )
850 KURL parentDir( fileitem->
url() );
851 parentDir.setPath( parentDir.directory() );
852 TQString parentDirURL = parentDir.url();
853 TQString parentDirReferenceURL = parentDir.internalReferenceURL();
854 TQPtrList<KDirLister> *listers = urlsCurrentlyHeld[parentDirURL +
":" + parentDirReferenceURL];
856 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
857 kdl->aboutToRefreshItem( fileitem );
860 listers = urlsCurrentlyListed[parentDirURL +
":" + parentDirReferenceURL];
862 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
863 kdl->aboutToRefreshItem( fileitem );
866 void KDirListerCache::emitRefreshItem(
KFileItem *fileitem )
869 KURL parentDir( fileitem->
url() );
870 parentDir.setPath( parentDir.directory() );
871 TQString parentDirURL = parentDir.url();
872 TQString parentDirReferenceURL = parentDir.internalReferenceURL();
873 TQPtrList<KDirLister> *listers = urlsCurrentlyHeld[parentDirURL +
":" + parentDirReferenceURL];
875 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
877 kdl->addRefreshItem( fileitem );
882 listers = urlsCurrentlyListed[parentDirURL +
":" + parentDirReferenceURL];
884 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
886 kdl->addRefreshItem( fileitem );
891 KDirListerCache* KDirListerCache::self()
894 s_pSelf = sd_KDirListerCache.setObject( s_pSelf,
new KDirListerCache );
899 bool KDirListerCache::exists()
908 void KDirListerCache::slotFileDirty(
const KURL& _url )
910 kdDebug(7004) << k_funcinfo << _url << endl;
912 if ( !pendingUpdates[_url.path()] )
915 dir.setPath( _url.path() );
916 dir.setInternalReferenceURL(_url.internalReferenceURL());
917 if ( checkUpdate( dir, -1 ) ) {
918 updateDirectory( _url );
922 dir.setPath( dir.directory() );
923 dir.setInternalReferenceURL(_url.internalReferenceURL());
924 if ( checkUpdate( dir ) )
927 TQTimer *timer =
new TQTimer(
this, _url.path().utf8() );
928 connect( timer, TQT_SIGNAL(timeout()),
this, TQT_SLOT(slotFileDirtyDelayed()) );
929 pendingUpdates.insert( _url.path(), timer );
930 timer->start( 500,
true );
936 void KDirListerCache::slotFileDirtyDelayed()
938 TQString file = TQString::fromUtf8( TQT_TQOBJECT_CONST(sender())->name() );
940 kdDebug(7004) << k_funcinfo << file << endl;
944 pendingUpdates.remove( file );
952 aboutToRefreshItem( item );
954 emitRefreshItem( item );
958 void KDirListerCache::slotFileCreated(
const TQString& _file )
960 kdDebug(7004) << k_funcinfo << _file << endl;
964 u.setPath( u.directory() );
968 void KDirListerCache::slotFileDeleted(
const TQString& _file )
970 kdDebug(7004) << k_funcinfo << _file << endl;
976 void KDirListerCache::slotEntries(
TDEIO::Job *job,
const TDEIO::UDSEntryList &entries )
980 TQString urlStr = url.url();
981 TQString urlReferenceStr = url.internalReferenceURL();
983 kdDebug(7004) << k_funcinfo <<
"new entries for " << url << endl;
985 DirItem *dir = itemsInUse[urlStr +
":" + urlReferenceStr];
988 TQPtrList<KDirLister> *listers = urlsCurrentlyListed[urlStr +
":" + urlReferenceStr];
990 Q_ASSERT( !listers->isEmpty() );
993 bool delayedMimeTypes =
true;
994 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
995 delayedMimeTypes = delayedMimeTypes && kdl->d->delayedMimeTypes;
999 static const TQString& dot = TDEGlobal::staticQString(
".");
1000 static const TQString& dotdot = TDEGlobal::staticQString(
"..");
1002 TDEIO::UDSEntryListConstIterator it = entries.begin();
1003 TDEIO::UDSEntryListConstIterator end = entries.end();
1005 for ( ; it != end; ++it )
1010 TDEIO::UDSEntry::ConstIterator entit = (*it).begin();
1011 for( ; entit != (*it).end(); ++entit ) {
1013 name = (*entit).m_str;
1018 Q_ASSERT( !name.isEmpty() );
1019 if ( name.isEmpty() ) {
1025 Q_ASSERT( !dir->rootItem );
1026 dir->rootItem =
new KFileItem( *it, url, delayedMimeTypes,
true );
1028 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
1029 if ( !kdl->d->rootFileItem && kdl->d->url == url ) {
1030 kdl->d->rootFileItem = dir->rootItem;
1034 else if ( name != dotdot )
1040 dir->lstItems->append( item );
1042 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
1043 kdl->addNewItem( item );
1048 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
1053 void KDirListerCache::slotResult(
TDEIO::Job *j )
1059 KURL jobUrl = joburl( job );
1060 jobUrl.adjustPath(-1);
1061 TQString jobUrlStr = jobUrl.url();
1062 TQString jobReferenceUrlStr = jobUrl.internalReferenceURL();
1064 kdDebug(7004) << k_funcinfo <<
"finished listing " << jobUrl << endl;
1069 TQPtrList<KDirLister> *listers = urlsCurrentlyListed.take( jobUrlStr +
":" + jobReferenceUrlStr );
1070 Q_ASSERT( listers );
1075 Q_ASSERT( !urlsCurrentlyHeld[jobUrlStr +
":" + jobReferenceUrlStr] );
1076 urlsCurrentlyHeld.insert( jobUrlStr +
":" + jobReferenceUrlStr, listers );
1082 for ( kdl = listers->first(); kdl; kdl = listers->next() )
1084 kdl->jobDone( job );
1087 if ( kdl->numJobs() == 0 )
1089 kdl->d->complete =
true;
1096 DirItem *dir = itemsInUse[jobUrlStr +
":" + jobReferenceUrlStr];
1098 dir->complete =
true;
1100 for ( kdl = listers->first(); kdl; kdl = listers->next() )
1102 kdl->jobDone( job );
1103 kdl->emitCompleted( jobUrl );
1104 if ( kdl->numJobs() == 0 )
1106 kdl->d->complete =
true;
1114 processPendingUpdates();
1121 void KDirListerCache::slotRedirection(
TDEIO::Job *j,
const KURL& url )
1126 KURL oldUrl = job->
url();
1130 oldUrl.adjustPath(-1);
1131 newUrl.adjustPath(-1);
1133 if ( oldUrl == newUrl )
1135 kdDebug(7004) << k_funcinfo <<
"New redirection url same as old, giving up." << endl;
1139 kdDebug(7004) << k_funcinfo << oldUrl.prettyURL() <<
" -> " << newUrl.prettyURL() << endl;
1150 DirItem *dir = itemsInUse.take( oldUrl.url() +
":" + oldUrl.internalReferenceURL() );
1153 TQPtrList<KDirLister> *listers = urlsCurrentlyListed.take( oldUrl.url() +
":" + oldUrl.internalReferenceURL() );
1154 Q_ASSERT( listers );
1155 Q_ASSERT( !listers->isEmpty() );
1157 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
1160 if ( kdl->d->url.equals( oldUrl,
true ) )
1162 kdl->d->rootFileItem = 0;
1163 kdl->d->url = newUrl;
1166 *kdl->d->lstDirs.find( oldUrl ) = newUrl;
1168 if ( kdl->d->lstDirs.count() == 1 )
1176 emit kdl->
clear( oldUrl );
1183 TQPtrList<KDirLister> *holders = urlsCurrentlyHeld.take( oldUrl.url() +
":" + oldUrl.internalReferenceURL() );
1186 Q_ASSERT( !holders->isEmpty() );
1188 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() )
1190 kdl->jobStarted( job );
1197 if ( kdl->d->url.equals( oldUrl,
true ) )
1199 kdl->d->rootFileItem = 0;
1200 kdl->d->url = newUrl;
1203 *kdl->d->lstDirs.find( oldUrl ) = newUrl;
1205 if ( kdl->d->lstDirs.count() == 1 )
1213 emit kdl->
clear( oldUrl );
1219 DirItem *newDir = itemsInUse[newUrl.url() +
":" + newUrl.internalReferenceURL()];
1222 kdDebug(7004) <<
"slotRedirection: " << newUrl.url() <<
" already in use" << endl;
1229 TDEIO::ListJob *oldJob = jobForUrl( newUrl.url() +
":" + newUrl.internalReferenceURL(), job );
1233 TQPtrList<KDirLister> *curListers = urlsCurrentlyListed[newUrl.url() +
":" + newUrl.internalReferenceURL()];
1236 kdDebug(7004) <<
"slotRedirection: and it is currently listed" << endl;
1240 for (
KDirLister *kdl = curListers->first(); kdl; kdl = curListers->next() )
1242 kdl->jobDone( oldJob );
1244 kdl->jobStarted( job );
1245 kdl->connectJob( job );
1249 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
1250 curListers->append( kdl );
1253 urlsCurrentlyListed.insert( newUrl.url() +
":" + newUrl.internalReferenceURL(), listers );
1260 TQPtrList<KDirLister> *curHolders = urlsCurrentlyHeld[newUrl.url() +
":" + newUrl.internalReferenceURL()];
1263 kdDebug(7004) <<
"slotRedirection: and it is currently held." << endl;
1265 for (
KDirLister *kdl = curHolders->first(); kdl; kdl = curHolders->next() )
1267 kdl->jobStarted( job );
1273 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() )
1274 curHolders->append( kdl );
1277 urlsCurrentlyHeld.insert( newUrl.url() +
":" + newUrl.internalReferenceURL(), holders );
1282 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
1284 if ( !kdl->d->rootFileItem && kdl->d->url == newUrl )
1285 kdl->d->rootFileItem = newDir->rootItem;
1287 kdl->addNewItems( *(newDir->lstItems) );
1293 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() )
1295 if ( !kdl->d->rootFileItem && kdl->d->url == newUrl )
1296 kdl->d->rootFileItem = newDir->rootItem;
1298 kdl->addNewItems( *(newDir->lstItems) );
1303 else if ( (newDir = itemsCached.take( newUrl.url() )) )
1305 kdDebug(7004) <<
"slotRedirection: " << newUrl.url() <<
" is unused, but already in the cache." << endl;
1308 itemsInUse.insert( newUrl.url() +
":" + newUrl.internalReferenceURL(), newDir );
1309 urlsCurrentlyListed.insert( newUrl.url() +
":" + newUrl.internalReferenceURL(), listers );
1311 urlsCurrentlyHeld.insert( newUrl.url() +
":" + newUrl.internalReferenceURL(), holders );
1314 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
1316 if ( !kdl->d->rootFileItem && kdl->d->url == newUrl )
1317 kdl->d->rootFileItem = newDir->rootItem;
1319 kdl->addNewItems( *(newDir->lstItems) );
1325 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() )
1327 if ( !kdl->d->rootFileItem && kdl->d->url == newUrl )
1328 kdl->d->rootFileItem = newDir->rootItem;
1330 kdl->addNewItems( *(newDir->lstItems) );
1337 kdDebug(7004) <<
"slotRedirection: " << newUrl.url() <<
" has not been listed yet." << endl;
1339 delete dir->rootItem;
1341 dir->lstItems->clear();
1342 dir->redirect( newUrl );
1343 itemsInUse.insert( newUrl.url() +
":" + newUrl.internalReferenceURL(), dir );
1344 urlsCurrentlyListed.insert( newUrl.url() +
":" + newUrl.internalReferenceURL(), listers );
1347 urlsCurrentlyHeld.insert( newUrl.url() +
":" + newUrl.internalReferenceURL(), holders );
1358 job->disconnect(
this );
1360 connect( job, TQT_SIGNAL(entries(
TDEIO::Job *,
const TDEIO::UDSEntryList & )),
1361 this, TQT_SLOT(slotUpdateEntries(
TDEIO::Job *,
const TDEIO::UDSEntryList & )) );
1362 connect( job, TQT_SIGNAL(result(
TDEIO::Job * )),
1363 this, TQT_SLOT(slotUpdateResult(
TDEIO::Job * )) );
1372 void KDirListerCache::renameDir(
const KURL &oldUrl,
const KURL &newUrl )
1374 kdDebug(7004) << k_funcinfo << oldUrl.prettyURL() <<
" -> " << newUrl.prettyURL() << endl;
1375 TQString oldUrlStr = oldUrl.url(-1);
1376 TQString newUrlStr = newUrl.url(-1);
1383 TQDictIterator<DirItem> itu( itemsInUse );
1385 while ( itu.current() )
1388 DirItem *dir = itu.current();
1389 TQString oldDirURLIndep = itu.currentKey();
1390 oldDirURLIndep.truncate(oldDirURLIndep.length() - (dir->url.internalReferenceURL().length()+strlen(
":")));
1391 KURL oldDirUrl ( oldDirURLIndep );
1394 if ( oldUrl.isParentOf( oldDirUrl ) )
1397 TQString relPath = oldDirUrl.path().mid( oldUrl.path().length() );
1399 KURL newDirUrl( newUrl );
1400 if ( !relPath.isEmpty() ) {
1401 newDirUrl.addPath( relPath );
1406 dir->redirect( newDirUrl );
1407 itemsInUse.remove( itu.currentKey() );
1408 itemsInUse.insert( newDirUrl.url(-1), dir );
1410 if ( dir->lstItems )
1413 KFileItemListIterator kit( *dir->lstItems );
1414 for ( ; kit.current(); ++kit )
1416 KURL oldItemUrl = (*kit)->url();
1417 TQString oldItemUrlStr( oldItemUrl.url(-1) );
1418 KURL newItemUrl( oldItemUrl );
1419 newItemUrl.setPath( newDirUrl.path() );
1420 newItemUrl.addPath( oldItemUrl.fileName() );
1421 kdDebug(7004) <<
"KDirListerCache::renameDir renaming " << oldItemUrlStr <<
" to " << newItemUrl.url() << endl;
1422 (*kit)->setURL( newItemUrl );
1425 emitRedirections( oldDirUrl, newDirUrl );
1433 removeDirFromCache( oldUrl );
1437 void KDirListerCache::emitRedirections(
const KURL &oldUrl,
const KURL &url )
1439 kdDebug(7004) << k_funcinfo << oldUrl.prettyURL() <<
" -> " << url.prettyURL() << endl;
1440 TQString oldUrlStr = oldUrl.url(-1);
1441 TQString urlStr = url.url(-1);
1442 TQString oldReferenceUrlStr = oldUrl.internalReferenceURL();
1443 TQString urlReferenceStr = url.internalReferenceURL();
1445 TDEIO::ListJob *job = jobForUrl( oldUrlStr +
":" + oldReferenceUrlStr );
1450 TQPtrList<KDirLister> *listers = urlsCurrentlyListed.take( oldUrlStr +
":" + oldReferenceUrlStr );
1454 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
1457 kdl->jobDone( job );
1462 urlsCurrentlyListed.insert( urlStr +
":" + urlReferenceStr, listers );
1467 TQPtrList<KDirLister> *holders = urlsCurrentlyHeld.take( oldUrlStr +
":" + oldReferenceUrlStr );
1471 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() )
1472 kdl->jobDone( job );
1474 urlsCurrentlyHeld.insert( urlStr +
":" + urlReferenceStr, holders );
1479 updateDirectory( url );
1482 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() )
1489 for (
KDirLister *kdl = holders->first(); kdl; kdl = holders->next() )
1491 *kdl->d->lstDirs.find( oldUrl ) = url;
1493 if ( kdl->d->lstDirs.count() == 1 )
1501 void KDirListerCache::removeDirFromCache(
const KURL& dir )
1503 kdDebug(7004) <<
"KDirListerCache::removeDirFromCache " << dir.prettyURL() << endl;
1504 TQCacheIterator<DirItem> itc( itemsCached );
1505 while ( itc.current() )
1507 if ( dir.isParentOf( KURL( itc.currentKey() ) ) )
1508 itemsCached.remove( itc.currentKey() );
1514 void KDirListerCache::slotUpdateEntries(
TDEIO::Job* job,
const TDEIO::UDSEntryList& list )
1519 void KDirListerCache::slotUpdateResult(
TDEIO::Job * j )
1524 KURL jobUrl = joburl( job );
1525 jobUrl.adjustPath(-1);
1526 TQString jobUrlStr = jobUrl.url();
1527 TQString jobReferenceUrlStr = jobUrl.internalReferenceURL();
1529 kdDebug(7004) << k_funcinfo <<
"finished update " << jobUrl << endl;
1533 TQPtrList<KDirLister> *listers = urlsCurrentlyHeld[jobUrlStr +
":" + jobReferenceUrlStr];
1534 TQPtrList<KDirLister> *tmpLst = urlsCurrentlyListed.take( jobUrlStr +
":" + jobReferenceUrlStr );
1539 for ( kdl = tmpLst->first(); kdl; kdl = tmpLst->next() )
1541 Q_ASSERT( listers->containsRef( kdl ) == 0 );
1542 listers->append( kdl );
1547 urlsCurrentlyHeld.insert( jobUrlStr +
":" + jobReferenceUrlStr, listers );
1552 Q_ASSERT( listers );
1556 for ( kdl = listers->first(); kdl; kdl = listers->next() )
1558 kdl->jobDone( job );
1564 if ( kdl->numJobs() == 0 )
1566 kdl->d->complete =
true;
1575 processPendingUpdates();
1579 DirItem *dir = itemsInUse[jobUrlStr +
":" + jobReferenceUrlStr];
1580 dir->complete =
true;
1584 bool delayedMimeTypes =
true;
1585 for ( kdl = listers->first(); kdl; kdl = listers->next() ) {
1586 delayedMimeTypes = delayedMimeTypes && kdl->d->delayedMimeTypes;
1590 TQDict<KFileItem> fileItems( 9973 );
1592 KFileItemListIterator kit ( *(dir->lstItems) );
1595 for ( ; kit.current(); ++kit )
1598 if (!((*kit)->listerURL().isEmpty())) {
1599 fileItems.insert( (*kit)->listerURL().url(), *kit );
1602 fileItems.insert( (*kit)->url().url(), *kit );
1606 static const TQString& dot = TDEGlobal::staticQString(
".");
1607 static const TQString& dotdot = TDEGlobal::staticQString(
"..");
1611 TQValueList<TDEIO::UDSEntry> buf = jobs[job];
1612 TQValueListIterator<TDEIO::UDSEntry> it = buf.begin();
1613 for ( ; it != buf.end(); ++it )
1617 item =
new KFileItem( *it, jobUrl, delayedMimeTypes,
true );
1620 item->
setUDSEntry( *it, jobUrl, delayedMimeTypes,
true );
1624 TQString name = item->
name();
1625 Q_ASSERT( !name.isEmpty() );
1629 if ( name.isEmpty() || name == dotdot ) {
1637 if ( !dir->rootItem )
1639 dir->rootItem = item;
1642 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
1643 if ( !kdl->d->rootFileItem && kdl->d->url == jobUrl ) {
1644 kdl->d->rootFileItem = dir->rootItem;
1653 if ( (tmp = fileItems[item->
url().url()]) )
1658 if ( !tmp->cmp( *item ) )
1660 for ( kdl = listers->first(); kdl; kdl = listers->next() ) {
1661 kdl->aboutToRefreshItem( tmp );
1665 tmp->assign( *item );
1667 for ( kdl = listers->first(); kdl; kdl = listers->next() ) {
1668 kdl->addRefreshItem( tmp );
1677 dir->lstItems->append( item );
1679 for ( kdl = listers->first(); kdl; kdl = listers->next() ) {
1680 kdl->addNewItem( item );
1694 deleteUnmarkedItems( listers, dir->lstItems );
1696 for ( kdl = listers->first(); kdl; kdl = listers->next() )
1700 kdl->jobDone( job );
1702 kdl->emitCompleted( jobUrl );
1703 if ( kdl->numJobs() == 0 )
1705 kdl->d->complete =
true;
1712 processPendingUpdates();
1720 TQMap< TDEIO::ListJob *, TQValueList<TDEIO::UDSEntry> >::Iterator it = jobs.begin();
1721 while ( it != jobs.end() )
1724 KURL itjoburl = joburl( job );
1725 if ( ((itjoburl.url(-1) +
":" + itjoburl.internalReferenceURL()) == url) && (job != not_job) ) {
1746 job->disconnect(
this );
1750 void KDirListerCache::deleteUnmarkedItems( TQPtrList<KDirLister> *listers, KFileItemList *lstItems )
1755 while ( (item = lstItems->current()) )
1759 for (
KDirLister *kdl = listers->first(); kdl; kdl = listers->next() ) {
1760 kdl->emitDeleteItem( item );
1763 if ( item->
isDir() ) {
1764 deleteDir( item->
url() );
1775 void KDirListerCache::deleteDir(
const KURL& dirUrl )
1782 TQDictIterator<DirItem> itu( itemsInUse );
1783 while ( itu.current() )
1785 TQString deletedUrlIndep = itu.currentKey();
1786 deletedUrlIndep.truncate(deletedUrlIndep.length() - ((*itu)->url.internalReferenceURL().length()+strlen(
":")));
1787 KURL deletedUrl( deletedUrlIndep );
1788 if ( dirUrl.isParentOf( deletedUrl ) )
1792 TQPtrList<KDirLister> *kdls = urlsCurrentlyListed[deletedUrl.url() +
":" + deletedUrl.internalReferenceURL()];
1796 kdls =
new TQPtrList<KDirLister>( *kdls );
1797 for (
KDirLister *kdl = kdls->first(); kdl; kdl = kdls->next() )
1798 stop( kdl, deletedUrl );
1806 kdls = urlsCurrentlyHeld[deletedUrl.url() +
":" + deletedUrl.internalReferenceURL()];
1810 kdls =
new TQPtrList<KDirLister>( *kdls );
1812 for (
KDirLister *kdl = kdls->first(); kdl; kdl = kdls->next() )
1815 if ( kdl->d->url == deletedUrl )
1818 if ( kdl->d->rootFileItem )
1819 emit kdl->
deleteItem( kdl->d->rootFileItem );
1821 kdl->d->rootFileItem = 0;
1825 bool treeview = kdl->d->lstDirs.count() > 1;
1829 forgetDirs( kdl, deletedUrl, treeview );
1839 DirItem *dir = itemsInUse.take( deletedUrl.url() +
":" + deletedUrl.internalReferenceURL() );
1849 removeDirFromCache( dirUrl );
1852 void KDirListerCache::processPendingUpdates()
1858 void KDirListerCache::printDebug()
1860 kdDebug(7004) <<
"Items in use: " << endl;
1861 TQDictIterator<DirItem> itu( itemsInUse );
1862 for ( ; itu.current() ; ++itu ) {
1863 kdDebug(7004) <<
" " << itu.currentKey() <<
" URL: " << itu.current()->url
1864 <<
" rootItem: " << ( itu.current()->rootItem ? itu.current()->rootItem->url() : KURL() )
1865 <<
" autoUpdates refcount: " << itu.current()->autoUpdates
1866 <<
" complete: " << itu.current()->complete
1867 << ( itu.current()->lstItems ? TQString(
" with %1 items.").arg(itu.current()->lstItems->count()) : TQString(
" lstItems=NULL") ) << endl;
1870 kdDebug(7004) <<
"urlsCurrentlyHeld: " << endl;
1871 TQDictIterator< TQPtrList<KDirLister> > it( urlsCurrentlyHeld );
1872 for ( ; it.current() ; ++it )
1875 for ( TQPtrListIterator<KDirLister> listit( *it.current() ); listit.current(); ++listit )
1876 list +=
" 0x" + TQString::number( (
long)listit.current(), 16 );
1877 kdDebug(7004) <<
" " << it.currentKey() <<
" " << it.current()->count() <<
" listers: " << list << endl;
1880 kdDebug(7004) <<
"urlsCurrentlyListed: " << endl;
1881 TQDictIterator< TQPtrList<KDirLister> > it2( urlsCurrentlyListed );
1882 for ( ; it2.current() ; ++it2 )
1885 for ( TQPtrListIterator<KDirLister> listit( *it2.current() ); listit.current(); ++listit )
1886 list +=
" 0x" + TQString::number( (
long)listit.current(), 16 );
1887 kdDebug(7004) <<
" " << it2.currentKey() <<
" " << it2.current()->count() <<
" listers: " << list << endl;
1890 TQMap< TDEIO::ListJob *, TQValueList<TDEIO::UDSEntry> >::Iterator jit = jobs.begin();
1891 kdDebug(7004) <<
"Jobs: " << endl;
1892 for ( ; jit != jobs.end() ; ++jit )
1893 kdDebug(7004) <<
" " << jit.key() <<
" listing " << joburl( jit.key() ).prettyURL() <<
": " << (*jit).count() <<
" entries." << endl;
1895 kdDebug(7004) <<
"Items in cache: " << endl;
1896 TQCacheIterator<DirItem> itc( itemsCached );
1897 for ( ; itc.current() ; ++itc )
1898 kdDebug(7004) <<
" " << itc.currentKey() <<
" rootItem: "
1899 << ( itc.current()->rootItem ? itc.current()->rootItem->url().prettyURL() : TQString(
"NULL") )
1900 << ( itc.current()->lstItems ? TQString(
" with %1 items.").arg(itc.current()->lstItems->count()) : TQString(
" lstItems=NULL") ) << endl;
1909 kdDebug(7003) <<
"+KDirLister" << endl;
1911 d =
new KDirListerPrivate;
1914 d->delayedMimeTypes = _delayedMimeTypes;
1925 kdDebug(7003) <<
"-KDirLister" << endl;
1927 if ( KDirListerCache::exists() )
1931 s_pCache->forgetDirs(
this );
1939 kdDebug(7003) << k_funcinfo << _url.prettyURL()
1940 <<
" keep=" << _keep <<
" reload=" << _reload << endl;
1943 if ( d->changes != NONE && _keep ) {
1950 if (!_url.isLocalFile()) {
1953 d->openURL_url[localURLJob] = _url;
1954 d->openURL_keep[localURLJob] = _keep;
1955 d->openURL_reload[localURLJob] = _reload;
1957 connect(localURLJob, TQT_SIGNAL(destroyed()),
this, TQT_SLOT(slotLocalURLKIODestroyed()));
1962 return s_pCache->listDir(
this, _url, _keep, _reload );
1966 void KDirLister::slotOpenURLGotLocalURL(
TDEIO::LocalURLJob *job,
const KURL& url,
bool isLocal) {
1967 KURL realURL = d->openURL_url[job];
1970 realURL.setInternalReferenceURL(d->openURL_url[job].url());
1971 d->m_referenceURLMap[d->openURL_url[job].url()] =
url.path();
1973 s_pCache->listDir(
this, realURL, d->openURL_keep[job], d->openURL_reload[job] );
1974 d->openURL_url.remove(job);
1975 d->openURL_keep.remove(job);
1976 d->openURL_reload.remove(job);
1979 void KDirLister::slotLocalURLKIODestroyed() {
1982 if (d->openURL_url.contains(terminatedJob)) {
1983 s_pCache->listDir(
this, d->openURL_url[terminatedJob], d->openURL_keep[terminatedJob], d->openURL_reload[terminatedJob] );
1984 d->openURL_url.remove(terminatedJob);
1985 d->openURL_keep.remove(terminatedJob);
1986 d->openURL_reload.remove(terminatedJob);
1992 kdDebug(7003) << k_funcinfo << endl;
1993 s_pCache->stop(
this );
1994 d->m_referenceURLMap.clear();
1999 kdDebug(7003) << k_funcinfo << _url.prettyURL() << endl;
2000 s_pCache->stop(
this, _url );
2001 d->m_referenceURLMap.remove(_url.url());
2006 return d->autoUpdate;
2011 if ( d->autoUpdate == _enable )
2014 d->autoUpdate = _enable;
2015 s_pCache->setAutoUpdate(
this, _enable );
2020 return d->isShowingDotFiles;
2025 if ( d->isShowingDotFiles == _showDotFiles )
2028 d->isShowingDotFiles = _showDotFiles;
2029 d->changes ^= DOT_FILES;
2034 return d->dirOnlyMode;
2039 if ( d->dirOnlyMode == _dirsOnly )
2042 d->dirOnlyMode = _dirsOnly;
2043 d->changes ^= DIR_ONLY_MODE;
2048 return d->autoErrorHandling;
2053 d->autoErrorHandling = enable;
2054 d->errorParent = parent;
2069 if ( d->changes == NONE )
2072 static const TQString& dot = TDEGlobal::staticQString(
".");
2073 static const TQString& dotdot = TDEGlobal::staticQString(
"..");
2075 for ( KURL::List::Iterator it = d->lstDirs.begin();
2076 it != d->lstDirs.end(); ++it )
2078 KFileItemListIterator kit( *s_pCache->itemsForDir( *it ) );
2079 for ( ; kit.current(); ++kit )
2081 if ( (*kit)->text() == dot || (*kit)->text() == dotdot )
2084 bool oldMime =
true, newMime =
true;
2086 if ( d->changes & MIME_FILTER )
2088 oldMime =
doMimeFilter( (*kit)->mimetype(), d->oldMimeFilter )
2089 && doMimeExcludeFilter( (*kit)->mimetype(), d->oldMimeExcludeFilter );
2090 newMime =
doMimeFilter( (*kit)->mimetype(), d->mimeFilter )
2091 && doMimeExcludeFilter( (*kit)->mimetype(), d->mimeExcludeFilter );
2093 if ( oldMime && !newMime )
2100 if ( d->changes & DIR_ONLY_MODE )
2103 if ( d->dirOnlyMode )
2105 if ( !(*kit)->isDir() )
2108 else if ( !(*kit)->isDir() ) {
2115 if ( (*kit)->isHidden() )
2117 if ( d->changes & DOT_FILES )
2120 if ( d->isShowingDotFiles ) {
2130 else if ( d->changes & NAME_FILTER )
2132 bool oldName = (*kit)->isDir() ||
2133 d->oldFilters.isEmpty() ||
2136 bool newName = (*kit)->isDir() ||
2137 d->lstFilters.isEmpty() ||
2140 if ( oldName && !newName )
2145 else if ( !oldName && newName ) {
2150 if ( (d->changes & MIME_FILTER) && !oldMime && newMime ) {
2163 s_pCache->updateDirectory( _u );
2173 return d->rootFileItem;
2178 return s_pCache->findByURL(
this, _url );
2183 return s_pCache->findByName(
this, _name );
2186 #ifndef KDE_NO_COMPAT
2187 KFileItem *KDirLister::find(
const KURL& _url )
const
2198 if ( !(d->changes & NAME_FILTER) )
2200 d->oldFilters = d->lstFilters;
2201 d->lstFilters.setAutoDelete(
false );
2204 d->lstFilters.clear();
2205 d->lstFilters.setAutoDelete(
true );
2210 TQStringList list = TQStringList::split(
' ',
nameFilter );
2211 for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it )
2212 d->lstFilters.append(
new TQRegExp(*it,
false,
true ) );
2214 d->changes |= NAME_FILTER;
2219 return d->nameFilter;
2224 if ( !(d->changes & MIME_FILTER) )
2225 d->oldMimeFilter = d->mimeFilter;
2227 if ( mimeFilter.find(
"all/allfiles") != mimeFilter.end() ||
2228 mimeFilter.find(
"all/all") != mimeFilter.end() )
2229 d->mimeFilter.clear();
2231 d->mimeFilter = mimeFilter;
2233 d->changes |= MIME_FILTER;
2238 if ( !(d->changes & MIME_FILTER) )
2239 d->oldMimeExcludeFilter = d->mimeExcludeFilter;
2241 d->mimeExcludeFilter = mimeExcludeFilter;
2242 d->changes |= MIME_FILTER;
2248 if ( !(d->changes & MIME_FILTER) )
2250 d->oldMimeFilter = d->mimeFilter;
2251 d->oldMimeExcludeFilter = d->mimeExcludeFilter;
2253 d->mimeFilter.clear();
2254 d->mimeExcludeFilter.clear();
2255 d->changes |= MIME_FILTER;
2260 return d->mimeFilter;
2270 return doMimeFilter( mime, d->mimeFilter ) && doMimeExcludeFilter(mime,d->mimeExcludeFilter);
2278 static const TQString& dotdot = TDEGlobal::staticQString(
"..");
2280 if ( item->
text() == dotdot )
2283 if ( !d->isShowingDotFiles && item->
isHidden() )
2286 if ( item->
isDir() || d->lstFilters.isEmpty() )
2296 if ( d->mimeFilter.isEmpty() && d->mimeExcludeFilter.isEmpty() )
2303 for ( TQPtrListIterator<TQRegExp> it( filters ); it.current(); ++it )
2304 if ( it.current()->exactMatch( name ) )
2312 if ( filters.isEmpty() )
2317 TQStringList::ConstIterator it = filters.begin();
2318 for ( ; it != filters.end(); ++it )
2319 if ( mimeptr->is(*it) )
2327 bool KDirLister::doMimeExcludeFilter(
const TQString& mime,
const TQStringList& filters )
const
2329 if ( filters.isEmpty() )
2332 TQStringList::ConstIterator it = filters.begin();
2333 for ( ; it != filters.end(); ++it )
2334 if ( (*it) == mime )
2343 return s_pCache->validURL(
this, _url );
2348 if ( d->autoErrorHandling ) {
2356 void KDirLister::addNewItem(
const KFileItem *item )
2358 TQString refURL = item->
url().internalReferenceURL();
2359 if (!refURL.isEmpty() && d->m_referenceURLMap.contains(refURL) &&
2360 item->
url().path().startsWith(d->m_referenceURLMap[refURL]))
2364 if (!refURL.endsWith(
"/"))
2368 KURL newItemURL(refURL);
2369 newItemURL.addPath(item->
url().fileName());
2370 const_cast<KFileItem*
>(item)->setListerURL(newItemURL);
2371 const_cast<KFileItem*
>(item)->setURL(newItemURL);
2380 if ( !d->lstNewItems ) {
2381 d->lstNewItems =
new KFileItemList;
2384 d->lstNewItems->append( item );
2388 if ( !d->lstMimeFilteredItems ) {
2389 d->lstMimeFilteredItems =
new KFileItemList;
2392 d->lstMimeFilteredItems->append( item );
2396 void KDirLister::addNewItems(
const KFileItemList& items )
2402 for ( KFileItemListIterator kit(
items ); kit.current(); ++kit ) {
2407 void KDirLister::aboutToRefreshItem(
const KFileItem *item )
2411 d->refreshItemWasFiltered =
true;
2413 d->refreshItemWasFiltered =
true;
2415 d->refreshItemWasFiltered =
false;
2418 void KDirLister::addRefreshItem(
const KFileItem *item )
2422 TQString refURL = item->
url().internalReferenceURL();
2423 if (!refURL.isEmpty() && d->m_referenceURLMap.contains(refURL) &&
2424 item->
url().path().startsWith(d->m_referenceURLMap[refURL]))
2428 if (!refURL.endsWith(
"/"))
2432 KURL newItemURL(refURL);
2433 newItemURL.addPath(item->
url().fileName());
2434 const_cast<KFileItem*
>(item)->setListerURL(newItemURL);
2435 const_cast<KFileItem*
>(item)->setURL(newItemURL);
2440 if ( d->refreshItemWasFiltered )
2442 if ( !d->lstNewItems ) {
2443 d->lstNewItems =
new KFileItemList;
2446 d->lstNewItems->append( item );
2450 if ( !d->lstRefreshItems ) {
2451 d->lstRefreshItems =
new KFileItemList;
2454 d->lstRefreshItems->append( item );
2457 else if ( !d->refreshItemWasFiltered )
2459 if ( !d->lstRemoveItems ) {
2460 d->lstRemoveItems =
new KFileItemList;
2465 d->lstRemoveItems->append( item );
2469 void KDirLister::emitItems()
2471 KFileItemList *tmpNew = d->lstNewItems;
2474 KFileItemList *tmpMime = d->lstMimeFilteredItems;
2475 d->lstMimeFilteredItems = 0;
2477 KFileItemList *tmpRefresh = d->lstRefreshItems;
2478 d->lstRefreshItems = 0;
2480 KFileItemList *tmpRemove = d->lstRemoveItems;
2481 d->lstRemoveItems = 0;
2488 TQString prevProtocol;
2489 TQString prevPrefix;
2490 KFileItemList emitList;
2491 for ( KFileItemListIterator kit( *tmpNew ); kit.current(); ++kit )
2494 protocol = item->
url().protocol();
2495 prefix = TQStringList::split(
"/", item->
url().path())[0];
2496 if ((protocol != prevProtocol) || (prefix != prevPrefix)) {
2497 if (emitList.count() > 0) {
2502 emitList.append(item);
2503 prevProtocol = protocol;
2504 prevPrefix = prefix;
2507 if (emitList.count() > 0) {
2527 for (
KFileItem *tmp = tmpRemove->first(); tmp; tmp = tmpRemove->next() ) {
2534 void KDirLister::emitDeleteItem(
KFileItem *item )
2548 void KDirLister::slotInfoMessage(
TDEIO::Job *,
const TQString& message )
2553 void KDirLister::slotPercent(
TDEIO::Job *job,
unsigned long pcnt )
2561 TQMap< TDEIO::ListJob *, KDirListerPrivate::JobData >::Iterator dataIt = d->jobData.begin();
2562 while ( dataIt != d->jobData.end() )
2564 result += (*dataIt).percent * (*dataIt).totalSize;
2565 size += (*dataIt).totalSize;
2581 TQMap< TDEIO::ListJob *, KDirListerPrivate::JobData >::Iterator dataIt = d->jobData.begin();
2582 while ( dataIt != d->jobData.end() )
2584 result += (*dataIt).totalSize;
2596 TQMap< TDEIO::ListJob *, KDirListerPrivate::JobData >::Iterator dataIt = d->jobData.begin();
2597 while ( dataIt != d->jobData.end() )
2599 result += (*dataIt).processedSize;
2606 void KDirLister::slotSpeed(
TDEIO::Job *job,
unsigned long spd )
2611 TQMap< TDEIO::ListJob *, KDirListerPrivate::JobData >::Iterator dataIt = d->jobData.begin();
2612 while ( dataIt != d->jobData.end() )
2614 result += (*dataIt).speed;
2618 emit
speed( result );
2621 uint KDirLister::numJobs()
2623 return d->jobData.count();
2628 d->jobData.remove( job );
2633 KDirListerPrivate::JobData jobData;
2635 jobData.percent = 0;
2636 jobData.processedSize = 0;
2637 jobData.totalSize = 0;
2639 d->jobData.insert( job, jobData );
2640 d->complete =
false;
2646 this, TQT_SLOT(slotInfoMessage(
TDEIO::Job *,
const TQString& )) );
2648 this, TQT_SLOT(slotPercent(
TDEIO::Job *,
unsigned long )) );
2654 this, TQT_SLOT(slotSpeed(
TDEIO::Job *,
unsigned long )) );
2657 void KDirLister::emitCompleted(
const KURL& _url )
2659 TQString refURL = _url.internalReferenceURL();
2660 if (!refURL.isEmpty() && d->m_referenceURLMap.contains(refURL) &&
2661 _url.path().startsWith(d->m_referenceURLMap[refURL]))
2665 if (!refURL.endsWith(
"/"))
2669 KURL newItemURL(refURL);
2670 newItemURL.addPath(_url.fileName());
2696 KFileItemList result;
2697 KFileItemList *allItems = s_pCache->itemsForDir( dir );
2702 if ( which == AllItems ) {
2707 for ( KFileItemListIterator kit( *allItems ); kit.current(); ++kit )
2712 result.append( item );
2722 void KDirLister::virtual_hook(
int,
void * )
2725 #include "kdirlister.moc"
2726 #include "kdirlister_p.moc"