dolphin/konq-plugins/searchbar/OpenSearchManager.cpp
2011-07-31 13:33:56 +02:00

174 lines
5.1 KiB
C++

/* This file is part of the KDE project
* Copyright (C) 2009 Fredy Yanardi <fyanardi@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "OpenSearchManager.h"
#include <QtCore/QFile>
#include <KDebug>
#include <KGlobal>
#include <KStandardDirs>
#include <KUrl>
#include <kio/scheduler.h>
#include "opensearch/OpenSearchEngine.h"
#include "opensearch/OpenSearchReader.h"
#include "opensearch/OpenSearchWriter.h"
OpenSearchManager::OpenSearchManager(QObject *parent)
: QObject(parent)
, m_activeEngine(0)
{
m_state = IDLE;
}
OpenSearchManager::~OpenSearchManager() {
qDeleteAll(m_enginesMap);
m_enginesMap.clear();
}
void OpenSearchManager::setSearchProvider(const QString &searchProvider)
{
m_activeEngine = 0;
if (!m_enginesMap.contains(searchProvider)) {
const QString fileName = KGlobal::dirs()->findResource("data", "konqueror/opensearch/" + searchProvider + ".xml");
if (fileName.isEmpty()) {
return;
}
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
kWarning(1202) << "Cannot open opensearch description file: " + fileName;
return;
}
OpenSearchReader reader;
OpenSearchEngine *engine = reader.read(&file);
if (engine) {
m_enginesMap.insert(searchProvider, engine);
}
else {
return;
}
}
m_activeEngine = m_enginesMap.value(searchProvider);
}
bool OpenSearchManager::isSuggestionAvailable()
{
return m_activeEngine != 0;
}
void OpenSearchManager::addOpenSearchEngine(const KUrl &url, const QString &title)
{
Q_UNUSED(title);
m_jobData.clear();
if (m_state != IDLE) {
// TODO: cancel job
}
m_state = REQ_DESCRIPTION;
KIO::TransferJob *job = KIO::get(url, KIO::NoReload, KIO::HideProgressInfo);
connect(job, SIGNAL(data(KIO::Job*,QByteArray)),
this, SLOT(dataReceived(KIO::Job*,QByteArray)));
connect(job, SIGNAL(result(KJob*)), SLOT(jobFinished(KJob*)));
}
void OpenSearchManager::requestSuggestion(const QString &searchText)
{
if (!m_activeEngine) {
return;
}
if (m_state != IDLE) {
// TODO: cancel job
}
m_state = REQ_SUGGESTION;
KUrl url = m_activeEngine->suggestionsUrl(searchText);
kDebug(1202) << "Requesting for suggestions: " << url.url();
m_jobData.clear();
KIO::TransferJob *job = KIO::get(url, KIO::NoReload, KIO::HideProgressInfo);
connect(job, SIGNAL(data(KIO::Job*,QByteArray)),
this, SLOT(dataReceived(KIO::Job*,QByteArray)));
connect(job, SIGNAL(result(KJob*)), SLOT(jobFinished(KJob*)));
}
void OpenSearchManager::dataReceived(KIO::Job *job, const QByteArray &data)
{
Q_UNUSED(job);
m_jobData.append(data);
}
void OpenSearchManager::jobFinished(KJob *job)
{
if (job->error()) {
return; // just silently return
}
if (m_state == REQ_SUGGESTION) {
const QStringList suggestionsList = m_activeEngine->parseSuggestion(m_jobData);
kDebug(1202) << "Received suggestion from " << m_activeEngine->name() << ": " << suggestionsList;
emit suggestionReceived(suggestionsList);
}
else if (m_state == REQ_DESCRIPTION) {
OpenSearchReader reader;
OpenSearchEngine *engine = reader.read(m_jobData);
if (engine) {
m_enginesMap.insert(engine->name(), engine);
QString path = KGlobal::dirs()->findResource("data", "konqueror/opensearch/");
QString fileName = trimmedEngineName(engine->name());
QFile file(path + fileName + ".xml");
OpenSearchWriter writer;
writer.write(&file, engine);
QString searchUrl = OpenSearchEngine::parseTemplate("\\{@}", engine->searchUrlTemplate());
emit openSearchEngineAdded(engine->name(), searchUrl, fileName);
}
else {
kFatal() << "Error while adding new open search engine";
}
}
}
QString OpenSearchManager::trimmedEngineName(const QString &engineName) const
{
QString trimmed;
QString::ConstIterator constIter = engineName.constBegin();
while (constIter != engineName.constEnd()) {
if (constIter->isSpace()) {
trimmed.append('-');
}
else if (*constIter != '.') {
trimmed.append(constIter->toLower());
}
constIter++;
}
return trimmed;
}
#include "OpenSearchManager.moc"