diff --git a/src/core/engine.cpp b/src/core/engine.cpp --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #if defined(Q_OS_WIN) #include @@ -53,6 +54,9 @@ using namespace KNSCore; +typedef QHash EngineProviderLoaderHash; +Q_GLOBAL_STATIC(QThreadStorage, EngineProviderLoaders) + class EnginePrivate { public: QList categoriesMetadata; @@ -188,11 +192,17 @@ qCDebug(KNEWSTUFFCORE) << "loading providers from " << m_providerFileUrl; emit signalBusy(i18n("Loading provider information")); - XmlLoader *loader = new XmlLoader(this); + XmlLoader *loader = EngineProviderLoaders()->localData().value(m_providerFileUrl); + if (!loader) { + qCDebug(KNEWSTUFFCORE) << "No xml loader for this url yet, so create one and temporarily store that" << m_providerFileUrl; + loader = new XmlLoader(this); + EngineProviderLoaders()->localData().insert(m_providerFileUrl, loader); + connect(loader, &XmlLoader::signalLoaded, this, [this](){ EngineProviderLoaders()->localData().remove(m_providerFileUrl); }); + connect(loader, &XmlLoader::signalFailed, this, [this](){ EngineProviderLoaders()->localData().remove(m_providerFileUrl); }); + loader->load(QUrl(m_providerFileUrl)); + } connect(loader, &XmlLoader::signalLoaded, this, &Engine::slotProviderFileLoaded); connect(loader, &XmlLoader::signalFailed, this, &Engine::slotProvidersFailed); - - loader->load(QUrl(m_providerFileUrl)); } } diff --git a/src/core/jobs/httpjob.cpp b/src/core/jobs/httpjob.cpp --- a/src/core/jobs/httpjob.cpp +++ b/src/core/jobs/httpjob.cpp @@ -20,6 +20,8 @@ #include "knewstuffcore_debug.h" #include "httpworker.h" +#include + using namespace KNSCore; class HTTPJob::Private @@ -86,6 +88,6 @@ { // qCDebug(KNEWSTUFFCORE) << Q_FUNC_INFO; HTTPJob* job = new HTTPJob(source, loadType, flags, parent); - job->start(); + QTimer::singleShot(0, job, &HTTPJob::start); return job; }