diff options
-rw-r--r-- | tdeio/tdeio/kdirlister.cpp | 51 | ||||
-rw-r--r-- | tdeio/tdeio/kdirlister_p.h | 10 |
2 files changed, 34 insertions, 27 deletions
diff --git a/tdeio/tdeio/kdirlister.cpp b/tdeio/tdeio/kdirlister.cpp index 31a705fa2..534ec6352 100644 --- a/tdeio/tdeio/kdirlister.cpp +++ b/tdeio/tdeio/kdirlister.cpp @@ -1946,44 +1946,47 @@ bool KDirLister::openURL( const KURL& _url, bool _keep, bool _reload ) d->changes = NONE; + // Some ioslaves like media:/ or home:/ can provide a local url istead of a remote one // If a local path is available, monitor that instead of the given remote URL... if (!_url.isLocalFile()) { - TDEIO::LocalURLJob* localURLJob = TDEIO::localURL(_url); - if (localURLJob) { - d->openURL_url[localURLJob] = _url; - d->openURL_keep[localURLJob] = _keep; - d->openURL_reload[localURLJob] = _reload; - connect(localURLJob, TQ_SIGNAL(localURL(TDEIO::LocalURLJob*, const KURL&, bool)), this, TQ_SLOT(slotOpenURLGotLocalURL(TDEIO::LocalURLJob*, const KURL&, bool))); - connect(localURLJob, TQ_SIGNAL(destroyed()), this, TQ_SLOT(slotLocalURLKIODestroyed())); - } - return true; + TDEIO::LocalURLJob* localURLJob = TDEIO::localURL(_url); + if (localURLJob) { + d->openURLContext[localURLJob] = KDirListerPrivate::OpenURLContext{_url, _keep, _reload}; + connect(localURLJob, TQ_SIGNAL(localURL(TDEIO::LocalURLJob*, const KURL&, bool)), + this, TQ_SLOT(slotOpenURLGotLocalURL(TDEIO::LocalURLJob*, const KURL&, bool))); + connect(localURLJob, TQ_SIGNAL(destroyed()), this, TQ_SLOT(slotLocalURLKIODestroyed())); + } + return true; } else { - return s_pCache->listDir( this, _url, _keep, _reload ); + return s_pCache->listDir( this, _url, _keep, _reload ); } } void KDirLister::slotOpenURLGotLocalURL(TDEIO::LocalURLJob *job, const KURL& url, bool isLocal) { - KURL realURL = d->openURL_url[job]; + auto jobIt = d->openURLContext.find(job); + + Q_ASSERT( jobIt != d->openURLContext.end() ); + + auto ctx = jobIt.data(); + KURL realURL = ctx.url; if (isLocal) { - realURL = url; - realURL.setInternalReferenceURL(d->openURL_url[job].url()); - d->m_referenceURLMap[d->openURL_url[job].url()] = url.path(); + realURL = url; + realURL.setInternalReferenceURL(ctx.url.url()); + d->m_referenceURLMap[ctx.url.url()] = url.path(); } - s_pCache->listDir( this, realURL, d->openURL_keep[job], d->openURL_reload[job] ); - d->openURL_url.remove(job); - d->openURL_keep.remove(job); - d->openURL_reload.remove(job); + d->openURLContext.remove(jobIt); + s_pCache->listDir( this, realURL, ctx.keep, ctx.reload ); } void KDirLister::slotLocalURLKIODestroyed() { - TDEIO::LocalURLJob* terminatedJob = const_cast<TDEIO::LocalURLJob*>(static_cast<const TDEIO::LocalURLJob*>(sender())); + TDEIO::Job* terminatedJob = const_cast<TDEIO::Job*>(static_cast<const TDEIO::Job*>(sender())); + auto jobIt = d->openURLContext.find(terminatedJob); - if (d->openURL_url.contains(terminatedJob)) { - s_pCache->listDir( this, d->openURL_url[terminatedJob], d->openURL_keep[terminatedJob], d->openURL_reload[terminatedJob] ); - d->openURL_url.remove(terminatedJob); - d->openURL_keep.remove(terminatedJob); - d->openURL_reload.remove(terminatedJob); + if (jobIt != d->openURLContext.end()) { + auto ctx = jobIt.data(); + d->openURLContext.remove(jobIt); + s_pCache->listDir( this, ctx.url, ctx.keep, ctx.reload ); } } diff --git a/tdeio/tdeio/kdirlister_p.h b/tdeio/tdeio/kdirlister_p.h index 3092e8e2e..7c3461c4b 100644 --- a/tdeio/tdeio/kdirlister_p.h +++ b/tdeio/tdeio/kdirlister_p.h @@ -111,9 +111,13 @@ public: TQStringList mimeFilter, oldMimeFilter; TQStringList mimeExcludeFilter, oldMimeExcludeFilter; - TQMap<TDEIO::Job*, KURL> openURL_url; - TQMap<TDEIO::Job*, bool> openURL_keep; - TQMap<TDEIO::Job*, bool> openURL_reload; + struct OpenURLContext { + KURL url; + bool keep; + bool reload; + }; + + TQMap<TDEIO::Job*, OpenURLContext> openURLContext; TQMap<TQString,TQString> m_referenceURLMap; }; |