2
* Copyright (C) 2011 Ivan Cukic <ivan.cukic(at)kde.org>
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2,
6
* or (at your option) any later version, as published by the Free
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details
14
* You should have received a copy of the GNU General Public
15
* License along with this program; if not, write to the
16
* Free Software Foundation, Inc.,
17
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
#include "RecommendationScriptEngine.h"
21
#include "RecommendationScriptEngine_p.h"
23
#include <QScriptEngine>
24
#include <QScriptValue>
25
#include <QTextStream>
28
#include <QDesktopServices>
31
// #include <QtSensors/QSensor>
34
#include <KStandardDirs>
36
#include "sensors/dbus/DBusSensor.h"
40
RecommendationScriptEngineConfig::RecommendationScriptEngineConfig(QObject * parent, KConfigGroup * config)
41
: QObject(parent), m_config(config)
45
RecommendationScriptEngineConfig::~RecommendationScriptEngineConfig()
50
#define CREATE_CONFIG_METHODS(TYPE, TYPECASE) \
51
TYPE RecommendationScriptEngineConfig::TYPECASE##Value(const QString & field, TYPE defaultValue) const \
52
{ return m_config->readEntry(field, defaultValue); } \
53
void RecommendationScriptEngineConfig::Set##TYPECASE##Value(const QString & field, TYPE newValue) const \
54
{ kDebug() << field << newValue; m_config->writeEntry(field, newValue); m_config->sync(); }
56
CREATE_CONFIG_METHODS(bool, Bool)
57
CREATE_CONFIG_METHODS(int, Int)
58
CREATE_CONFIG_METHODS(QString, String)
59
CREATE_CONFIG_METHODS(QStringList, StringList)
60
#undef CREATE_CONFIG_METHODS
66
RecommendationScriptEngine::RecommendationScriptEngine(QObject * parent, const QString & script)
67
: RecommendationEngine(parent), d(new Private())
71
kDebug() << "RecommendationScriptEngine()" << script << name();
73
d->delay.setInterval(300);
74
d->delay.setSingleShot(true);
76
d->autoremove = config()->readEntry("autoRemoveChosenRecommendation", true);
78
connect(&(d->delay), SIGNAL(timeout()),
79
this, SLOT(sendUpdateNotification()));
83
RecommendationScriptEngine::~RecommendationScriptEngine()
88
void RecommendationScriptEngine::init()
90
Contour::RecommendationEngine::init();
92
QFile file(KStandardDirs::locate("data", "contour/scripts/" + d->script + "/main.js"));
93
if (!file.open(QIODevice::ReadOnly)) {
94
kDebug() << "Failed to open main.js for" << d->script;
98
d->engine = new QScriptEngine(this);
99
connect(d->engine, SIGNAL(signalHandlerException(QScriptValue)),
100
this, SLOT(signalHandlerException(QScriptValue)));
102
d->engine->globalObject().setProperty("self",
103
d->engine->newQObject(this));
105
const QScriptValue & result = d->engine->evaluate(QTextStream(&file).readAll());
106
if (d->engine->hasUncaughtException()) {
107
int line = d->engine->uncaughtExceptionLineNumber();
108
kDebug() << "uncaught exception at line" << line << ":" << result.toString();
113
void RecommendationScriptEngine::activate(const QString & id, const QString & action)
116
removeRecommendation(id);
118
emit activationRequested(id, action);
121
void RecommendationScriptEngine::setAutoRemoveChosenRecommendation(bool remove)
123
d->autoremove = remove;
124
KConfigGroup * cg = config();
125
cg->writeEntry("autoRemoveChosenRecommendation", d->autoremove);
129
QString RecommendationScriptEngine::name() const
131
kDebug() << d->script;
135
QScriptValue RecommendationScriptEngine::getSensor(const QString & sensor)
137
kDebug() << "sensor" << sensor;
139
QObject * result = NULL;
141
if (sensor == "DBus") {
142
kDebug() << "Returning the D-Bus sensor. This is not in QtMobility";
143
result = new DBusSensor();
145
// result = new QtMobility::QSensor(sensor.toAscii());
148
return d->engine->newQObject(result, QScriptEngine::AutoOwnership);
151
QScriptValue RecommendationScriptEngine::getConfig()
153
return d->engine->newQObject(new RecommendationScriptEngineConfig(this, config()));
156
QScriptValue RecommendationScriptEngine::getTimer(int msec)
158
kDebug() << "timer" << msec;
160
QTimer * timer = new QTimer();
161
timer->setSingleShot(false);
162
timer->setInterval(msec);
165
return d->engine->newQObject(timer, QScriptEngine::AutoOwnership);
168
void RecommendationScriptEngine::openUrl(const QString & url)
170
QDesktopServices::openUrl(QUrl(url));
173
void RecommendationScriptEngine::signalHandlerException(const QScriptValue & exception)
175
kDebug() << "exception" << exception.toVariant();
178
void RecommendationScriptEngine::addRecommendation(
181
const QString & title,
182
const QString & description,
186
// kDebug() << d->script << score << id << title;
190
while (d->recommendations.size() > i &&
191
d->recommendations[i].score > score) {
195
RecommendationItem ri;
200
ri.description = description;
203
d->recommendations.insert(i, ri);
205
delayedUpdateNotification();
208
void RecommendationScriptEngine::removeRecommendation(const QString & id)
210
QMutableListIterator < RecommendationItem > i(d->recommendations);
211
while (i.hasNext()) {
212
RecommendationItem ri = i.next();
219
delayedUpdateNotification();
222
void RecommendationScriptEngine::removeRecommendations()
224
d->recommendations.clear();
226
delayedUpdateNotification();
229
void RecommendationScriptEngine::delayedUpdateNotification()
234
void RecommendationScriptEngine::sendUpdateNotification()
236
// just in case, although it is a single-shot
239
emit recommendationsUpdated(d->recommendations);
243
} // namespace Contour
245
// class RecommendationScriptEngine