26 #include <QtCore/QRegExp>
54 connect( &pendingUpdateTimer, SIGNAL(
timeout()),
this, SLOT(processPendingUpdates()) );
55 pendingUpdateTimer.setSingleShot(
true );
58 this, SLOT(slotFileDirty(
QString)) );
60 this, SLOT(slotFileCreated(
QString)) );
62 this, SLOT(slotFileDeleted(
QString)) );
66 connect(kdirnotify, SIGNAL(FilesAdded(
QString)), SLOT(slotFilesAdded(
QString)));
72 qAddPostRoutine(kDirListerCache.destroy);
79 qDeleteAll(itemsInUse);
83 directoryData.clear();
92 bool _keep,
bool _reload )
115 resolved = QFileInfo(local).canonicalFilePath();
116 if (local != resolved)
117 canonicalUrls[resolved].append(urlStr);
124 if (!validUrl(lister, _url)) {
125 kDebug(7004) << lister <<
"url=" << _url <<
"not a valid url";
142 }
else if (lister->d->
lstDirs.contains(_url)) {
149 lister->d->
lstDirs.removeAll(_url);
154 if (lister->d->
url == _url)
160 lister->d->
lstDirs.append(_url);
162 if (lister->d->
url.isEmpty() || !_keep)
163 lister->d->
url = _url;
165 DirItem *itemU = itemsInUse.value(urlStr);
175 DirItem *itemFromCache;
176 if (itemU || (!_reload && (itemFromCache = itemsCached.take(urlStr)) ) ) {
178 kDebug(7004) <<
"Entry already in use:" << _url;
181 itemU->incAutoUpdate();
183 kDebug(7004) <<
"Entry in cache:" << _url;
185 itemsInUse.insert(urlStr, itemFromCache);
186 itemU = itemFromCache;
198 kDebug(7004) <<
"Reloading directory:" << _url;
199 itemsCached.remove(urlStr);
201 kDebug(7004) <<
"Listing directory:" << _url;
204 itemU =
new DirItem(_url, resolved);
205 itemsInUse.insert(urlStr, itemU);
207 itemU->incAutoUpdate();
227 connect(job, SIGNAL(result(
KJob*)),
228 this, SLOT(slotResult(
KJob*)));
259 if (!itemU->lstItems.isEmpty()) {
260 kDebug() <<
"Listing" << itemU->lstItems.count() <<
"cached items soon";
286 m_lister(lister), m_url(url),
287 m_reload(reload), m_emitCompleted(true)
291 kWarning(7004) <<
"Lister" << lister <<
"has a cached items job already for" <<
url;
303 kDirListerCache->emitItemsFromCache(
this, m_lister, m_url, m_reload, m_emitCompleted);
310 kDirListerCache->forgetCachedItemsJob(
this, m_lister, m_url);
311 if (!property(
"_kdlc_silent").toBool()) {
312 emit m_lister->canceled(m_url);
313 emit m_lister->canceled();
325 DirItem *itemU = kDirListerCache->itemsInUse.value(urlStr);
327 kWarning(7004) <<
"Can't find item for directory" << urlStr <<
"anymore";
331 _reload = _reload || !itemU->complete;
336 if (!items.isEmpty()) {
343 forgetCachedItemsJob(cachedItemsJob, lister, _url);
349 if (_emitCompleted) {
383 bool KDirListerCache::validUrl(
const KDirLister *lister,
const KUrl&
url )
const
385 if ( !url.isValid() )
416 Q_FOREACH(
const KUrl& url, urls) {
417 stopListingUrl(lister, url, silent);
421 QHash<QString,KDirListerCacheDirectoryData>::iterator dirit = directoryData.begin();
422 const QHash<QString,KDirListerCacheDirectoryData>::iterator dirend = directoryData.end();
423 for( ; dirit != dirend ; ++dirit ) {
426 kDebug(7004) <<
"ERROR: found lister" << lister <<
"in list - for" << dirit.key();
440 if (cachedItemsJob) {
442 cachedItemsJob->setProperty(
"_kdlc_silent",
true);
444 cachedItemsJob->
kill();
448 kDebug(7004) << lister <<
" url=" <<
url;
450 QHash<QString,KDirListerCacheDirectoryData>::iterator dirit = directoryData.find(urlStr);
451 if (dirit == directoryData.end())
458 stopListJob(urlStr, silent);
471 void KDirListerCache::stopListJob(
const QString& url,
bool silent)
486 job->setProperty(
"_kdlc_silent",
true);
496 for ( KUrl::List::const_iterator it = lister->d->
lstDirs.constBegin();
497 it != lister->d->
lstDirs.constEnd(); ++it ) {
498 DirItem* dirItem = itemsInUse.value((*it).url());
501 dirItem->incAutoUpdate();
503 dirItem->decAutoUpdate();
511 emit lister->
clear();
520 for ( KUrl::List::const_iterator it = lstDirsCopy.begin();
521 it != lstDirsCopy.end(); ++it ) {
522 forgetDirs( lister, *it,
false );
531 const bool supermount = mp->mountType() ==
"supermount";
536 return mp->mountOptions().contains(
"noauto");
548 DirectoryDataHash::iterator dit = directoryData.find(urlStr);
549 if (dit == directoryData.end())
559 DirItem *item = itemsInUse.value(urlStr);
561 bool insertIntoCache =
false;
565 directoryData.erase(dit);
566 itemsInUse.remove( urlStr );
571 kDebug(7004) <<
"Killing update job for " << urlStr;
577 if ( lister->d->
numJobs() == 0 ) {
584 lister->d->
lstDirs.removeAll( url );
585 emit lister->
clear( url );
588 insertIntoCache = item->complete;
589 if (insertIntoCache) {
599 const bool isLocal = item->url.isLocalFile();
600 bool isManuallyMounted =
false;
601 bool containsManuallyMounted =
false;
603 isManuallyMounted =
manually_mounted( item->url.toLocalFile(), possibleMountPoints );
604 if ( !isManuallyMounted ) {
608 KFileItemList::const_iterator kit = item->lstItems.constBegin();
609 KFileItemList::const_iterator kend = item->lstItems.constEnd();
610 for ( ; kit != kend && !containsManuallyMounted; ++kit )
611 if ( (*kit).isDir() &&
manually_mounted((*kit).url().toLocalFile(), possibleMountPoints) )
612 containsManuallyMounted =
true;
616 if ( isManuallyMounted || containsManuallyMounted )
618 kDebug(7004) <<
"Not adding a watch on " << item->url <<
" because it " <<
619 ( isManuallyMounted ?
"is manually mounted" :
"contains a manually mounted subdir" );
620 item->complete =
false;
623 item->incAutoUpdate();
633 item->decAutoUpdate();
636 if (item && insertIntoCache) {
637 kDebug(7004) << lister <<
"item moved into cache:" <<
url;
638 itemsCached.insert(urlStr, item);
647 if ( !checkUpdate( urlStr ) )
681 if (cachedItemsJob) {
683 cachedItemsJob->
done();
684 delete cachedItemsJob;
694 if (!(listers.isEmpty() || killed)) {
695 kWarning() <<
"The unexpected happened.";
696 kWarning() <<
"listers for" << _dir <<
"=" << listers;
705 Q_ASSERT( listers.isEmpty() || killed );
712 connect( job, SIGNAL(result(
KJob*)),
713 this, SLOT(slotUpdateResult(
KJob*)) );
715 kDebug(7004) <<
"update started in" << _dir;
721 if ( !holders.isEmpty() ) {
726 if ( first && kdl->d->
window ) {
728 job->ui()->setWindow( kdl->d->
window );
733 job->ui()->setWindow( window );
742 bool KDirListerCache::checkUpdate(
const QString& _dir )
744 if ( !itemsInUse.contains(_dir) )
746 DirItem *item = itemsCached[_dir];
747 if ( item && item->complete )
749 item->complete =
false;
750 item->decAutoUpdate();
773 KDirListerCache::DirItem *KDirListerCache::dirItemForUrl(
const KUrl&
dir)
const
776 DirItem *item = itemsInUse.value(urlStr);
778 item = itemsCached[urlStr];
784 DirItem *item = dirItemForUrl(dir);
785 return item ? &item->lstItems : 0;
792 for (KUrl::List::const_iterator it = lister->d->
lstDirs.constBegin();
793 it != lister->d->
lstDirs.constEnd(); ++it) {
794 DirItem* dirItem = itemsInUse.value((*it).url());
796 const KFileItem item = dirItem->lstItems.findByName(_name);
812 DirItem* dirItem = dirItemForUrl(parentDir);
815 if (!lister || lister->d->
lstDirs.contains(parentDir)) {
816 KFileItemList::iterator it = dirItem->lstItems.begin();
817 const KFileItemList::iterator
end = dirItem->lstItems.end();
818 for (; it != end ; ++it) {
819 if ((*it).url() ==
url) {
829 dirItem = dirItemForUrl(url);
830 if (dirItem && !dirItem->rootItem.isNull() && dirItem->rootItem.url() ==
url) {
832 if (!lister || lister->d->
lstDirs.contains(url)) {
833 return &dirItem->rootItem;
867 for (KUrl::List::const_iterator it = fileList.begin(); it != fileList.end() ; ++it) {
869 DirItem* dirItem = dirItemForUrl(url);
871 deletedSubdirs.append(url);
872 if (!dirItem->rootItem.isNull()) {
873 removedItemsByDir[url.url()].append(dirItem->rootItem);
878 parentDir.setPath(parentDir.directory());
879 dirItem = dirItemForUrl(parentDir);
882 for (KFileItemList::iterator fit = dirItem->lstItems.begin(), fend = dirItem->lstItems.end(); fit != fend ; ++fit) {
883 if ((*fit).url() ==
url) {
885 removedItemsByDir[parentDir.url()].append(fileitem);
888 deletedSubdirs.append(url);
890 dirItem->lstItems.erase(fit);
897 for(; rit != removedItemsByDir.constEnd(); ++rit) {
900 DirectoryDataHash::const_iterator dit = directoryData.constFind(rit.key());
901 if (dit != directoryData.constEnd()) {
902 itemsDeleted((*dit).listersCurrentlyHolding, rit.value());
906 Q_FOREACH(
const KUrl& url, deletedSubdirs) {
917 QStringList::const_iterator it = fileList.begin();
918 for (; it != fileList.end() ; ++it) {
922 kDebug(7004) <<
"item not found for" <<
url;
926 pendingUpdates.insert(*it);
928 pendingRemoteUpdates.insert(fileitem);
933 if (!dirsToUpdate.contains(dir))
934 dirsToUpdate.prepend(dir);
938 KUrl::List::const_iterator itdir = dirsToUpdate.constBegin();
939 for (; itdir != dirsToUpdate.constEnd() ; ++itdir)
944 processPendingUpdates();
951 kDebug(7004) << src <<
"->" << dst;
960 kDebug(7004) <<
"Item not found:" << oldurl;
971 if (existingDestItem) {
973 slotFilesRemoved(dst);
984 if (!nameOnly && fileitem->
isDir()) {
985 renameDir( src, dst );
998 fileitem->
setName( dst.fileName() );
1003 QSet<KDirLister*> listers = emitRefreshItem( oldItem, *fileitem );
1014 QSet<KDirLister*> KDirListerCache::emitRefreshItem(
const KFileItem& oldItem,
const KFileItem& fileitem)
1019 KUrl parentDir( oldItem.
url() );
1020 parentDir.
setPath( parentDir.directory() );
1021 const QString parentDirURL = parentDir.url();
1022 DirectoryDataHash::iterator dit = directoryData.find(parentDirURL);
1023 QList<KDirLister *> listers;
1025 if (dit != directoryData.end())
1026 listers += (*dit).listersCurrentlyHolding + (*dit).listersCurrentlyListing;
1027 if (oldItem.
isDir()) {
1029 dit = directoryData.find(oldItem.
url().
url());
1030 if (dit != directoryData.end())
1031 listers += (*dit).listersCurrentlyHolding + (*dit).listersCurrentlyListing;
1033 QSet<KDirLister*> listersToRefresh;
1036 KUrl directoryUrl(oldItem.
url());
1042 directoryUrl.setPath(directoryUrl.directory());
1045 listersToRefresh.insert(kdl);
1047 return listersToRefresh;
1054 dirs << canonicalUrls.value(dir).toSet().toList();
1056 if (dirs.count() > 1)
1057 kDebug() << dir <<
"known as" << dirs;
1066 void KDirListerCache::slotFileDirty(
const QString& path )
1070 KDE_struct_stat buff;
1073 const bool isDir = S_ISDIR(buff.st_mode);
1077 Q_FOREACH(
const QString& dir, directoriesForCanonicalPath(url.toLocalFile())) {
1078 handleDirDirty(dir);
1081 Q_FOREACH(
const QString& dir, directoriesForCanonicalPath(url.directory())) {
1083 aliasUrl.addPath(url.fileName());
1084 handleFileDirty(aliasUrl);
1090 void KDirListerCache::handleDirDirty(
const KUrl& url)
1096 QMutableSetIterator<QString> pendingIt(pendingUpdates);
1097 while (pendingIt.hasNext()) {
1098 const QString updPath = pendingIt.next();
1100 if (updPath.startsWith(dirPath) &&
1101 updPath.indexOf(
'/', dirPath.length()) == -1) {
1102 kDebug(7004) <<
"forgetting about individual update to" << updPath;
1111 void KDirListerCache::handleFileDirty(
const KUrl& url)
1115 if (!existingItem) {
1123 if (!pendingUpdates.contains(filePath)) {
1125 dir.setPath(dir.directory());
1126 if (checkUpdate(dir.url())) {
1127 pendingUpdates.insert(filePath);
1128 if (!pendingUpdateTimer.isActive())
1129 pendingUpdateTimer.start(500);
1135 void KDirListerCache::slotFileCreated(
const QString& path )
1141 slotFilesAdded(fileUrl.directory());
1144 void KDirListerCache::slotFileDeleted(
const QString& path )
1149 Q_FOREACH(
KUrl url, directoriesForCanonicalPath(u.directory())) {
1151 fileUrls << url.
url();
1153 slotFilesRemoved(fileUrls);
1158 KUrl url(joburl( static_cast<KIO::ListJob *>(job) ));
1164 DirItem *dir = itemsInUse.value(urlStr);
1166 kError(7004) <<
"Internal error: job is listing" << url <<
"but itemsInUse only knows about" << itemsInUse.keys();
1171 DirectoryDataHash::iterator dit = directoryData.find(urlStr);
1172 if (dit == directoryData.end()) {
1173 kError(7004) <<
"Internal error: job is listing" << url <<
"but directoryData doesn't know about that url, only about:" << directoryData.keys();
1174 Q_ASSERT(dit != directoryData.end());
1179 kError(7004) <<
"Internal error: job is listing" << url <<
"but directoryData says no listers are currently listing " << urlStr;
1192 KIO::UDSEntryList::const_iterator it = entries.begin();
1193 const KIO::UDSEntryList::const_iterator
end = entries.end();
1194 for ( ; it != end; ++it )
1198 Q_ASSERT( !name.isEmpty() );
1199 if ( name.isEmpty() )
1204 Q_ASSERT( dir->rootItem.isNull() );
1212 dir->rootItem = itemForUrl(url);
1213 if (dir->rootItem.isNull())
1214 dir->rootItem =
KFileItem( *it, url, delayedMimeTypes,
true );
1220 else if ( name !=
".." )
1222 KFileItem item( *it, url, delayedMimeTypes,
true );
1225 dir->lstItems.append( item );
1236 void KDirListerCache::slotResult(
KJob *j )
1244 runningListJobs.remove( job );
1246 KUrl jobUrl(joburl( job ));
1248 QString jobUrlStr = jobUrl.url();
1250 kDebug(7004) <<
"finished listing" << jobUrl;
1252 DirectoryDataHash::iterator dit = directoryData.find(jobUrlStr);
1253 if (dit == directoryData.end()) {
1254 kError() <<
"Nothing found in directoryData for URL" << jobUrlStr;
1258 Q_ASSERT(dit != directoryData.end());
1263 kError() <<
"OOOOPS, nothing in directoryData.listersCurrentlyListing for" << jobUrlStr;
1286 const bool silent = job->property(
"_kdlc_silent").toBool();
1301 DirItem *dir = itemsInUse.value(jobUrlStr);
1303 dir->complete =
true;
1319 processPendingUpdates();
1326 void KDirListerCache::slotRedirection(
KIO::Job *j,
const KUrl& url )
1338 if ( oldUrl == newUrl ) {
1339 kDebug(7004) <<
"New redirection url same as old, giving up.";
1341 }
else if (newUrl.isEmpty()) {
1342 kDebug(7004) <<
"New redirection url is empty, giving up.";
1346 const QString oldUrlStr = oldUrl.url();
1347 const QString newUrlStr = newUrl.url();
1349 kDebug(7004) << oldUrl <<
"->" << newUrl;
1362 DirItem *dir = itemsInUse.take(oldUrlStr);
1365 DirectoryDataHash::iterator dit = directoryData.find(oldUrlStr);
1366 Q_ASSERT(dit != directoryData.end());
1368 directoryData.erase(dit);
1369 Q_ASSERT( !oldDirData.listersCurrentlyListing.isEmpty() );
1371 Q_ASSERT( !listers.isEmpty() );
1374 kdl->d->
redirect(oldUrlStr, newUrl,
false );
1379 const QList<KDirLister *> holders = oldDirData.listersCurrentlyHolding;
1386 kdl->d->
redirect(oldUrl, newUrl,
false );
1389 DirItem *newDir = itemsInUse.value(newUrlStr);
1391 kDebug(7004) << newUrl <<
"already in use";
1405 if ( !curListers.isEmpty() ) {
1406 kDebug(7004) <<
"and it is currently listed";
1419 curListers.append( kdl );
1421 curListers = listers;
1429 if ( !curHolders.isEmpty() ) {
1430 kDebug(7004) <<
"and it is currently held.";
1439 curHolders.append( kdl );
1441 curHolders = holders;
1447 foreach (
KDirLister *kdl, listers + holders ) {
1454 }
else if ( (newDir = itemsCached.take( newUrlStr )) ) {
1455 kDebug(7004) << newUrl <<
"is unused, but already in the cache.";
1458 itemsInUse.insert( newUrlStr, newDir );
1464 foreach (
KDirLister *kdl, listers + holders ) {
1472 kDebug(7004) << newUrl <<
"has not been listed yet.";
1475 dir->lstItems.clear();
1476 dir->redirect( newUrl );
1477 itemsInUse.insert( newUrlStr, dir );
1482 if ( holders.isEmpty() ) {
1491 job->disconnect(
this );
1495 connect( job, SIGNAL(result(
KJob*)),
1496 this, SLOT(slotUpdateResult(
KJob*)) );
1505 struct KDirListerCache::ItemInUseChange
1507 ItemInUseChange(
const QString& old,
const QString& newU, DirItem* di)
1508 : oldUrl(old), newUrl(newU), dirItem(di) {}
1514 void KDirListerCache::renameDir(
const KUrl &oldUrl,
const KUrl &newUrl )
1516 kDebug(7004) << oldUrl <<
"->" << newUrl;
1524 QLinkedList<ItemInUseChange> itemsToChange;
1525 QSet<KDirLister *> listers;
1528 QHash<QString, DirItem *>::iterator itu = itemsInUse.begin();
1529 const QHash<QString, DirItem *>::iterator ituend = itemsInUse.end();
1530 for (; itu != ituend ; ++itu) {
1531 DirItem *dir = itu.value();
1532 KUrl oldDirUrl ( itu.key() );
1537 QString relPath = oldDirUrl.path().mid( oldUrl.
path().length() );
1539 KUrl newDirUrl( newUrl );
1540 if ( !relPath.isEmpty() )
1541 newDirUrl.addPath( relPath );
1545 dir->redirect( newDirUrl );
1552 for ( KFileItemList::iterator kit = dir->lstItems.begin(), kend = dir->lstItems.end();
1553 kit != kend ; ++kit )
1557 const KUrl oldItemUrl ((*kit).url());
1559 KUrl newItemUrl( oldItemUrl );
1560 newItemUrl.setPath( newDirUrl.path() );
1561 newItemUrl.addPath( oldItemUrl.fileName() );
1562 kDebug(7004) <<
"renaming" << oldItemUrl <<
"to" << newItemUrl;
1563 (*kit).setUrl(newItemUrl);
1565 listers |= emitRefreshItem(oldItem, *kit);
1567 emitRedirections( oldDirUrl, newDirUrl );
1577 foreach(
const ItemInUseChange& i, itemsToChange) {
1578 itemsInUse.remove(i.oldUrl);
1579 itemsInUse.insert(i.newUrl, i.dirItem);
1584 removeDirFromCache( oldUrl );
1589 void KDirListerCache::emitRedirections(
const KUrl &oldUrl,
const KUrl &newUrl )
1591 kDebug(7004) << oldUrl <<
"->" << newUrl;
1600 DirectoryDataHash::iterator dit = directoryData.find(oldUrlStr);
1601 if ( dit == directoryData.end() )
1603 const QList<KDirLister *> listers = (*dit).listersCurrentlyListing;
1604 const QList<KDirLister *> holders = (*dit).listersCurrentlyHolding;
1623 directoryData.erase(dit);
1625 if ( !listers.isEmpty() ) {
1635 kdl->d->
redirect(oldUrl, newUrl,
true );
1639 void KDirListerCache::removeDirFromCache(
const KUrl& dir )
1642 const QList<QString> cachedDirs = itemsCached.keys();
1643 foreach(
const QString& cachedDir, cachedDirs) {
1645 itemsCached.remove( cachedDir );
1651 runningListJobs[
static_cast<KIO::ListJob*
>(job)] += list;
1654 void KDirListerCache::slotUpdateResult(
KJob * j )
1659 KUrl jobUrl (joburl( job ));
1661 QString jobUrlStr (jobUrl.url());
1663 kDebug(7004) <<
"finished update" << jobUrl;
1673 Q_ASSERT( !listers.isEmpty() );
1675 if ( job->
error() ) {
1682 const bool silent = job->property(
"_kdlc_silent").toBool();
1686 if ( kdl->d->
numJobs() == 0 ) {
1694 runningListJobs.remove( job );
1698 processPendingUpdates();
1702 DirItem *dir = itemsInUse.value(jobUrlStr, 0);
1704 kError(7004) <<
"Internal error: itemsInUse did not contain" << jobUrlStr;
1710 dir->complete =
true;
1714 bool delayedMimeTypes =
true;
1718 QHash<QString, KFileItem*> fileItems;
1721 for ( KFileItemList::iterator kit = dir->lstItems.begin(), kend = dir->lstItems.end() ; kit != kend ; ++kit )
1724 fileItems.insert( (*kit).name(), &*kit );
1728 KIO::UDSEntryList::const_iterator it = buf.constBegin();
1729 const KIO::UDSEntryList::const_iterator end = buf.constEnd();
1730 for ( ; it != end; ++it )
1733 KFileItem item( *it, jobUrl, delayedMimeTypes,
true );
1735 const QString name = item.name();
1736 Q_ASSERT( !name.isEmpty() );
1740 if ( name.isEmpty() || name ==
".." )
1747 if ( dir->rootItem.isNull() )
1749 dir->rootItem = item;
1759 if (
KFileItem* tmp = fileItems.value(item.name()))
1761 QSet<KFileItem*>::iterator pru_it = pendingRemoteUpdates.find(tmp);
1762 const bool inPendingRemoteUpdates = (pru_it != pendingRemoteUpdates.end());
1765 if (!tmp->cmp( item ) || inPendingRemoteUpdates) {
1767 if (inPendingRemoteUpdates) {
1768 pendingRemoteUpdates.erase(pru_it);
1787 dir->lstItems.append( pitem );
1794 runningListJobs.remove( job );
1796 deleteUnmarkedItems( listers, dir->lstItems );
1813 processPendingUpdates();
1821 while ( it != runningListJobs.constEnd() )
1841 runningListJobs.remove( job );
1842 job->disconnect(
this );
1846 void KDirListerCache::deleteUnmarkedItems(
const QList<KDirLister *>& listers,
KFileItemList &lstItems )
1850 QMutableListIterator<KFileItem> kit(lstItems);
1851 while (kit.hasNext()) {
1855 deletedItems.append(item);
1859 if (!deletedItems.isEmpty())
1869 Q_FOREACH(
const KFileItem& item, deletedItems) {
1871 deleteDir(item.
url());
1875 void KDirListerCache::deleteDir(
const KUrl& dirUrl )
1885 QHash<QString, DirItem *>::iterator itu = itemsInUse.begin();
1886 const QHash<QString, DirItem *>::iterator ituend = itemsInUse.end();
1887 for ( ; itu != ituend; ++itu ) {
1888 const KUrl deletedUrl( itu.key() );
1890 affectedItems.append(deletedUrl);
1894 foreach(
const KUrl& deletedUrl, affectedItems) {
1895 const QString deletedUrlStr = deletedUrl.
url();
1897 DirectoryDataHash::iterator dit = directoryData.find(deletedUrlStr);
1898 if (dit != directoryData.end()) {
1900 QList<KDirLister *> listers = (*dit).listersCurrentlyListing;
1902 stopListingUrl( kdl, deletedUrl );
1907 QList<KDirLister *> holders = (*dit).listersCurrentlyHolding;
1910 if ( kdl->d->
url == deletedUrl )
1922 const bool treeview = kdl->d->
lstDirs.count() > 1;
1929 kdl->d->
lstDirs.removeAll( deletedUrl );
1931 forgetDirs( kdl, deletedUrl, treeview );
1938 int count = itemsInUse.remove( deletedUrlStr );
1939 Q_ASSERT( count == 0 );
1944 removeDirFromCache( dirUrl );
1948 void KDirListerCache::processPendingUpdates()
1950 QSet<KDirLister *> listers;
1951 foreach(
const QString& file, pendingUpdates) {
1959 listers |= emitRefreshItem( oldItem, *item );
1962 pendingUpdates.clear();
1969 void KDirListerCache::printDebug()
1971 kDebug(7004) <<
"Items in use:";
1972 QHash<QString, DirItem *>::const_iterator itu = itemsInUse.constBegin();
1973 const QHash<QString, DirItem *>::const_iterator ituend = itemsInUse.constEnd();
1974 for ( ; itu != ituend ; ++itu ) {
1975 kDebug(7004) <<
" " << itu.key() <<
"URL:" << itu.value()->url
1976 <<
"rootItem:" << ( !itu.value()->rootItem.isNull() ? itu.value()->rootItem.url() :
KUrl() )
1977 <<
"autoUpdates refcount:" << itu.value()->autoUpdates
1978 <<
"complete:" << itu.value()->complete
1979 <<
QString(
"with %1 items.").arg(itu.value()->lstItems.count());
1982 QList<KDirLister*> listersWithoutJob;
1983 kDebug(7004) <<
"Directory data:";
1984 DirectoryDataHash::const_iterator dit = directoryData.constBegin();
1985 for ( ; dit != directoryData.constEnd(); ++dit )
1988 foreach (
KDirLister* listit, (*dit).listersCurrentlyListing )
1990 kDebug(7004) <<
" " << dit.key() << (*dit).listersCurrentlyListing.count() <<
"listers:" <<
list;
1991 foreach (
KDirLister* listit, (*dit).listersCurrentlyListing ) {
1994 }
else if (
KIO::ListJob* listJob = jobForUrl(dit.key())) {
1995 kDebug(7004) <<
" Lister" << listit <<
"has ListJob" << listJob;
1997 listersWithoutJob.append(listit);
2002 foreach (
KDirLister* listit, (*dit).listersCurrentlyHolding )
2004 kDebug(7004) <<
" " << dit.key() << (*dit).listersCurrentlyHolding.count() <<
"holders:" <<
list;
2009 for ( ; jit != runningListJobs.end() ; ++jit )
2010 kDebug(7004) <<
" " << jit.key() <<
"listing" << joburl( jit.key() ) <<
":" << (*jit).count() <<
"entries.";
2012 kDebug(7004) <<
"Items in cache:";
2013 const QList<QString> cachedDirs = itemsCached.keys();
2014 foreach(
const QString& cachedDir, cachedDirs) {
2015 DirItem* dirItem = itemsCached.object(cachedDir);
2016 kDebug(7004) <<
" " << cachedDir <<
"rootItem:"
2017 << (!dirItem->rootItem.isNull() ? dirItem->rootItem.url().prettyUrl() :
QString(
"NULL") )
2018 <<
"with" << dirItem->lstItems.count() <<
"items.";
2022 Q_FOREACH(
KDirLister* listit, listersWithoutJob) {
2023 kFatal() <<
"HUH? Lister" << listit <<
"is supposed to be listing, but has no job!";
2048 if (!kDirListerCache.isDestroyed()) {
2050 kDirListerCache->forgetDirs(
this );
2064 return kDirListerCache->listDir(
this, _url, _flags & Keep, _flags &
Reload );
2069 kDirListerCache->stop(
this );
2074 kDirListerCache->stopListingUrl(
this, _url );
2088 kDirListerCache->setAutoUpdate(
this, _enable );
2159 KFileItemList* itemList = kDirListerCache->itemsForDir(dir);
2164 KFileItemList::iterator kit = itemList->begin();
2165 const KFileItemList::iterator kend = itemList->end();
2166 for (; kit != kend; ++kit) {
2179 KFileItemList* itemList = kDirListerCache->itemsForDir(dir);
2184 KFileItemList::iterator kit = itemList->begin();
2185 const KFileItemList::iterator kend = itemList->end();
2186 for (; kit != kend; ++kit) {
2189 if (text ==
"." || text ==
"..")
2192 if (nowVisible && !item.
isMarked())
2194 else if (!nowVisible && item.
isMarked())
2195 deletedItems.append(*kit);
2197 if (!deletedItems.isEmpty()) {
2200 Q_FOREACH(
const KFileItem& item, deletedItems)
2210 kDirListerCache->updateDirectory( _u );
2225 KFileItem *item = kDirListerCache->findByUrl(
this, _url );
2235 return kDirListerCache->findByName(
this, _name );
2251 const QStringList list = nameFilter.split(
' ', QString::SkipEmptyParts );
2252 for (QStringList::const_iterator it = list.begin(); it != list.end(); ++it)
2267 if (mimeFilter.contains(QLatin1String(
"application/octet-stream")) || mimeFilter.contains(QLatin1String(
"all/allfiles")))
2310 Q_ASSERT( !item.
isNull() );
2312 if ( item.
text() ==
".." )
2326 Q_ASSERT(!item.
isNull());
2335 for ( QList<QRegExp>::const_iterator it = filters.begin(); it != filters.end(); ++it )
2336 if ( (*it).exactMatch( name ) )
2344 if ( filters.isEmpty() )
2352 QStringList::const_iterator it = filters.begin();
2353 for ( ; it != filters.end(); ++it )
2354 if ( mimeptr->
is(*it) )
2363 if ( filters.isEmpty() )
2366 QStringList::const_iterator it = filters.begin();
2367 for ( ; it != filters.end(); ++it )
2368 if ( (*it) == mime )
2385 if (!isItemVisible(item))
2390 if ( m_parent->matchesMimeFilter( item ) )
2397 Q_ASSERT( !item.
isNull() );
2398 (*lstNewItems)[directoryUrl].append( item );
2402 if ( !lstMimeFilteredItems ) {
2406 Q_ASSERT( !item.
isNull() );
2407 lstMimeFilteredItems->append( item );
2416 KFileItemList::const_iterator kit = items.begin();
2417 const KFileItemList::const_iterator kend = items.end();
2418 for ( ; kit != kend; ++kit )
2419 addNewItem(directoryUrl, *kit);
2424 const bool refreshItemWasFiltered = !isItemVisible(oldItem) ||
2425 !m_parent->matchesMimeFilter(oldItem);
2426 if (isItemVisible(item) && m_parent->matchesMimeFilter(item)) {
2427 if ( refreshItemWasFiltered )
2429 if ( !lstNewItems ) {
2433 Q_ASSERT( !item.
isNull() );
2434 (*lstNewItems)[directoryUrl].append( item );
2438 if ( !lstRefreshItems ) {
2439 lstRefreshItems =
new QList<QPair<KFileItem,KFileItem> >;
2442 Q_ASSERT( !item.
isNull() );
2443 lstRefreshItems->append( qMakePair(oldItem, item) );
2446 else if ( !refreshItemWasFiltered )
2448 if ( !lstRemoveItems ) {
2455 Q_ASSERT(!oldItem.
isNull());
2456 lstRemoveItems->append(oldItem);
2466 lstMimeFilteredItems = 0;
2468 QList<QPair<KFileItem, KFileItem> > *tmpRefresh = lstRefreshItems;
2469 lstRefreshItems = 0;
2475 QHashIterator<KUrl, KFileItemList> it(*tmpNew);
2476 while (it.hasNext()) {
2478 emit m_parent->itemsAdded(it.key(), it.value());
2479 emit m_parent->newItems(it.value());
2486 emit m_parent->itemsFilteredByMime( *tmpMime );
2492 emit m_parent->refreshItems( *tmpRefresh );
2498 emit m_parent->itemsDeleted( *tmpRemove );
2508 return (!settings.dirOnlyMode || item.
isDir())
2509 && m_parent->matchesFilter(item);
2515 QMutableListIterator<KFileItem> it(items);
2516 while (it.hasNext()) {
2518 if (isItemVisible(item) && m_parent->matchesMimeFilter(item)) {
2520 emit m_parent->deleteItem(item);
2525 if (!items.isEmpty())
2526 emit m_parent->itemsDeleted(items);
2533 emit m_parent->infoMessage( message );
2545 while ( dataIt != jobData.end() )
2547 result += (*dataIt).percent * (*dataIt).totalSize;
2548 size += (*dataIt).totalSize;
2556 emit m_parent->percent( result );
2565 while ( dataIt != jobData.end() )
2567 result += (*dataIt).totalSize;
2571 emit m_parent->totalSize( result );
2580 while ( dataIt != jobData.end() )
2582 result += (*dataIt).processedSize;
2586 emit m_parent->processedSize( result );
2595 while ( dataIt != jobData.end() )
2597 result += (*dataIt).speed;
2601 emit m_parent->speed( result );
2608 qDebug() << m_parent <<
"numJobs:" << jobData.count();
2609 QMapIterator<KIO::ListJob *, JobData> it(jobData);
2610 while (it.hasNext()) {
2612 qDebug() << (
void*)it.key();
2613 qDebug() << it.key();
2617 return jobData.count();
2622 jobData.remove( job );
2633 jobData.insert( job, data );
2640 m_parent, SLOT(_k_slotInfoMessage(
KJob*,
QString)) );
2641 m_parent->connect( job, SIGNAL(
percent(
KJob*,ulong)),
2642 m_parent, SLOT(_k_slotPercent(
KJob*,ulong)) );
2643 m_parent->connect( job, SIGNAL(
totalSize(
KJob*,qulonglong)),
2644 m_parent, SLOT(_k_slotTotalSize(
KJob*,qulonglong)) );
2646 m_parent, SLOT(_k_slotProcessedSize(
KJob*,qulonglong)) );
2647 m_parent->connect( job, SIGNAL(
speed(
KJob*,ulong)),
2648 m_parent, SLOT(_k_slotSpeed(
KJob*,ulong)) );
2668 KFileItemList *allItems = kDirListerCache->itemsForDir( dir );
2677 KFileItemList::const_iterator kit = allItems->constBegin();
2678 const KFileItemList::const_iterator kend = allItems->constEnd();
2679 for ( ; kit != kend; ++kit )
2683 result.append(item);
2709 const int idx = lstDirs.indexOf( oldUrl );
2711 kWarning(7004) <<
"Unexpected redirection from" << oldUrl <<
"to" << newUrl
2712 <<
"but this dirlister is currently listing/holding" << lstDirs;
2714 lstDirs[ idx ] = newUrl;
2717 if ( lstDirs.count() == 1 ) {
2719 emit m_parent->clear();
2720 emit m_parent->redirection( newUrl );
2723 emit m_parent->clear( oldUrl );
2725 emit m_parent->redirection( oldUrl, newUrl );
2735 QMutableListIterator<KDirLister *> lister_it(listersCurrentlyListing);
2736 while (lister_it.hasNext()) {
2742 Q_ASSERT(!listersCurrentlyHolding.contains(kdl));
2743 if (!listersCurrentlyHolding.contains(kdl)) {
2744 listersCurrentlyHolding.append(kdl);
2755 return kDirListerCache->itemForUrl(url);
2758 #include "kdirlister.moc"
2759 #include "kdirlister_p.moc"