25 #include "core/installation.h"
44 #include <QtCore/QTimer>
45 #include <QtCore/QDir>
46 #include <QtXml/qdom.h>
47 #include <QtCore/Q_PID>
51 #define _WIN32_IE 0x0500
56 #include <attica/providermanager.h>
67 , m_initialized(false)
70 , m_searchTimer(new QTimer)
76 , m_atticaProviderManager(0)
78 m_searchTimer->setSingleShot(
true);
79 m_searchTimer->setInterval(1000);
80 connect(m_searchTimer, SIGNAL(
timeout()), SLOT(slotSearchTimerExpired()));
81 connect(m_installation, SIGNAL(signalInstallationFinished()),
this, SLOT(slotInstallationFinished()));
82 connect(m_installation, SIGNAL(signalInstallationFailed(
QString)),
this, SLOT(slotInstallationFailed(
QString)));
89 m_cache->writeRegistry();
91 delete m_atticaProviderManager;
93 delete m_installation;
98 kDebug() <<
"Initializing KNS3::Engine from '" << configfile <<
"'";
104 emit
signalError(
i18n(
"Configuration file not found: \"%1\"", configfile));
105 kError() <<
"No knsrc file named '" << configfile <<
"' was found." << endl;
113 emit
signalError(
i18n(
"Configuration file not found: \"%1\"", configfile));
114 kError() <<
"No knsrc file named '" << configfile <<
"' was found." << endl;
120 kDebug() <<
"Loading KNewStuff3 config: " << configfile;
121 group = conf.
group(
"KNewStuff3");
122 }
else if (conf.
hasGroup(
"KNewStuff2")) {
123 kDebug() <<
"Loading KNewStuff2 config: " << configfile;
124 group = conf.
group(
"KNewStuff2");
126 emit
signalError(
i18n(
"Configuration file is invalid: \"%1\"", configfile));
127 kError() <<
"A knsrc file was found but it doesn't contain a KNewStuff3 section." << endl;
133 kDebug() <<
"Categories: " << m_categories;
146 m_cache->readRegistry();
148 m_initialized =
true;
166 void Engine::loadProviders()
168 if (m_providerFileUrl.isEmpty()) {
170 kDebug(550) <<
"Using OCS default providers";
171 Attica::ProviderManager* m_atticaProviderManager =
new Attica::ProviderManager;
172 connect(m_atticaProviderManager, SIGNAL(providerAdded(Attica::Provider)),
this, SLOT(atticaProviderLoaded(Attica::Provider)));
173 m_atticaProviderManager->loadDefaultProviders();
175 kDebug(550) <<
"loading providers from " << m_providerFileUrl;
179 connect(loader, SIGNAL(signalLoaded(QDomDocument)), SLOT(slotProviderFileLoaded(QDomDocument)));
180 connect(loader, SIGNAL(signalFailed()), SLOT(slotProvidersFailed()));
182 loader->
load(
KUrl(m_providerFileUrl));
186 void Engine::slotProviderFileLoaded(
const QDomDocument& doc)
188 kDebug() <<
"slotProvidersLoaded";
190 bool isAtticaProviderFile =
false;
193 QDomElement providers = doc.documentElement();
195 if (providers.tagName() ==
"providers") {
196 isAtticaProviderFile =
true;
197 }
else if (providers.tagName() !=
"ghnsproviders" && providers.tagName() !=
"knewstuffproviders") {
198 kWarning(550) <<
"No document in providers.xml.";
199 emit
signalError(
i18n(
"Could not load get hot new stuff providers from file: %1", m_providerFileUrl));
203 QDomElement n = providers.firstChildElement(
"provider");
204 while (!n.isNull()) {
205 kDebug() <<
"Provider attributes: " << n.attribute(
"type");
207 QSharedPointer<KNS3::Provider> provider;
208 if (isAtticaProviderFile || n.attribute(
"type").toLower() ==
"rest") {
209 provider = QSharedPointer<KNS3::Provider> (
new AtticaProvider(m_categories));
214 if (provider->setProviderXML(n)) {
215 addProvider(provider);
219 n = n.nextSiblingElement();
224 void Engine::atticaProviderLoaded(
const Attica::Provider& atticaProvider)
226 if (!atticaProvider.hasContentService()) {
227 kDebug() <<
"Found provider: " << atticaProvider.baseUrl() <<
" but it does not support content";
230 QSharedPointer<KNS3::Provider> provider =
231 QSharedPointer<KNS3::Provider> (
new AtticaProvider(atticaProvider, m_categories));
232 addProvider(provider);
235 void Engine::addProvider(QSharedPointer<KNS3::Provider> provider)
237 m_providers.insert(provider->id(), provider);
247 void Engine::providerJobStarted (
KJob* job )
252 void Engine::slotProvidersFailed()
254 emit
signalError(
i18n(
"Loading of providers from file: %1 failed", m_providerFileUrl));
257 void Engine::providerInitialized(
Provider* p)
259 kDebug() <<
"providerInitialized" << p->
name();
263 foreach (
const QSharedPointer<KNS3::Provider> &p, m_providers) {
264 if (!p->isInitialized()) {
273 m_currentPage = qMax<int>(request.
page, m_currentPage);
274 kDebug() <<
"loaded page " << request.
page <<
"current page" << m_currentPage;
279 m_cache->insertRequest(request, entries);
291 m_currentRequest.
page = 0;
294 foreach (
const QSharedPointer<KNS3::Provider> &p, m_providers) {
295 if (p->isInitialized()) {
298 p->loadEntries(m_currentRequest);
302 while (!cache.isEmpty()) {
306 m_currentPage = m_currentRequest.
page;
307 ++m_currentRequest.
page;
308 cache = m_cache->requestFromCache(m_currentRequest);
311 if (m_currentPage == -1) {
312 kDebug() <<
"From provider";
313 p->loadEntries(m_currentRequest);
331 if (m_currentRequest.
sortMode != mode) {
332 m_currentRequest.
page = -1;
340 m_searchTimer->stop();
343 if (!cache.isEmpty()) {
346 m_searchTimer->start();
350 void Engine::slotSearchTimerExpired()
357 kDebug() <<
"Get more data! current page: " << m_currentPage <<
" requested: " << m_currentRequest.
page;
359 if (m_currentPage < m_currentRequest.
page) {
363 m_currentRequest.
page++;
369 m_currentRequest.
page = page;
370 m_currentRequest.
pageSize = pageSize;
374 void Engine::doRequest()
376 foreach (
const QSharedPointer<KNS3::Provider> &p, m_providers) {
377 if (p->isInitialized()) {
378 p->loadEntries(m_currentRequest);
396 QSharedPointer<Provider> p = m_providers.value(entry.
providerId());
398 p->loadPayloadLink(entry, linkId);
405 void Engine::slotInstallationFinished()
411 void Engine::slotInstallationFailed(
const QString& message)
424 m_installation->
install(entry);
437 QSharedPointer<Provider> p = m_providers.value(entry.
providerId());
438 p->loadEntryDetails(entry);
443 kDebug() <<
"START preview: " << entry.
name() << type;
453 kDebug() <<
"FINISH preview: " << entry.
name() << type;
476 QSharedPointer<Provider> p = m_providers.value(entry.
providerId());
477 return p->userCanVote();
482 QSharedPointer<Provider> p = m_providers.value(entry.
providerId());
483 p->vote(entry, rating);
488 QSharedPointer<Provider> p = m_providers.value(entry.
providerId());
489 return p->userCanBecomeFan();
494 QSharedPointer<Provider> p = m_providers.value(entry.
providerId());
498 void Engine::updateStatus()
500 if (m_numDataJobs > 0) {
502 }
else if (m_numPictureJobs > 0) {
503 emit
signalBusy(
i18np(
"Loading one preview",
"Loading %1 previews", m_numPictureJobs));
504 }
else if (m_numInstallJobs > 0) {
513 foreach(QSharedPointer<Provider> p, m_providers) {
515 p->loadEntries(request);
519 #include "engine.moc"