• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.8.5 API Reference
  • KDE Home
  • Contact Us
 

Plasma

  • plasma
  • scripting
scriptengine.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2007 by Aaron Seigo <aseigo@kde.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Library General Public License as
6  * published by the Free Software Foundation; either version 2, or
7  * (at your option) any later version.
8  *
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
13  *
14  * You should have received a copy of the GNU Library 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.
18  */
19 
20 #include "scripting/scriptengine.h"
21 
22 #include <kdebug.h>
23 #include <kservice.h>
24 #include <kservicetypetrader.h>
25 
26 #include "abstractrunner.h"
27 #include "applet.h"
28 #include "dataengine.h"
29 #include "package.h"
30 #include "scripting/appletscript.h"
31 #include "scripting/dataenginescript.h"
32 #include "scripting/runnerscript.h"
33 #include "scripting/wallpaperscript.h"
34 
35 #include "private/packages_p.h"
36 
37 namespace Plasma
38 {
39 
40 ScriptEngine::ScriptEngine(QObject *parent)
41  : QObject(parent),
42  d(0)
43 {
44 }
45 
46 ScriptEngine::~ScriptEngine()
47 {
48 // delete d;
49 }
50 
51 bool ScriptEngine::init()
52 {
53  return true;
54 }
55 
56 const Package *ScriptEngine::package() const
57 {
58  return 0;
59 }
60 
61 QString ScriptEngine::mainScript() const
62 {
63  return QString();
64 }
65 
66 QStringList knownLanguages(ComponentTypes types)
67 {
68  QString constraintTemplate = "'%1' in [X-Plasma-ComponentTypes]";
69  QString constraint;
70 
71  if (types & AppletComponent) {
72  // currently this if statement is not needed, but this future proofs
73  // the code against someone initializing constraint to something
74  // before we get here.
75  if (!constraint.isEmpty()) {
76  constraint.append(" or ");
77  }
78 
79  constraint.append(constraintTemplate.arg("Applet"));
80  }
81 
82  if (types & DataEngineComponent) {
83  if (!constraint.isEmpty()) {
84  constraint.append(" or ");
85  }
86 
87  constraint.append(constraintTemplate.arg("DataEngine"));
88  }
89 
90  if (types & RunnerComponent) {
91  if (!constraint.isEmpty()) {
92  constraint.append(" or ");
93  }
94 
95  constraint.append(constraintTemplate.arg("Runner"));
96  }
97 
98  if (types & WallpaperComponent) {
99  if (!constraint.isEmpty()) {
100  constraint.append(" or ");
101  }
102 
103  constraint.append(constraintTemplate.arg("Wallpaper"));
104  }
105 
106  KService::List offers = KServiceTypeTrader::self()->query("Plasma/ScriptEngine", constraint);
107  //kDebug() << "Applet::knownApplets constraint was '" << constraint
108  // << "' which got us " << offers.count() << " matches";
109 
110  QStringList languages;
111  foreach (const KService::Ptr &service, offers) {
112  QString language = service->property("X-Plasma-API").toString();
113  if (!languages.contains(language)) {
114  languages.append(language);
115  }
116  }
117 
118  return languages;
119 }
120 
121 KService::List engineOffers(const QString &language, ComponentType type)
122 {
123  if (language.isEmpty()) {
124  return KService::List();
125  }
126 
127  QRegExp re("[^a-zA-Z0-9\\-_]");
128  if (re.indexIn(language) != -1) {
129  kDebug() << "invalid language attempted:" << language;
130  return KService::List();
131  }
132 
133  QString component;
134  switch (type) {
135  case AppletComponent:
136  component = "Applet";
137  break;
138  case DataEngineComponent:
139  component = "DataEngine";
140  break;
141  case RunnerComponent:
142  component = "Runner";
143  break;
144  case WallpaperComponent:
145  component = "Wallpaper";
146  break;
147  default:
148  return KService::List();
149  break;
150  }
151 
152  QString constraint = QString("[X-Plasma-API] == '%1' and "
153  "'%2' in [X-Plasma-ComponentTypes]").arg(language, component);
154  KService::List offers = KServiceTypeTrader::self()->query("Plasma/ScriptEngine", constraint);
155  /* kDebug() << "********************* loadingApplet with Plasma/ScriptEngine" << constraint
156  << "resulting in" << offers.count() << "results";*/
157  if (offers.isEmpty()) {
158  kDebug() << "No offers for \"" << language << "\"";
159  }
160 
161  return offers;
162 }
163 
164 ScriptEngine *loadEngine(const QString &language, ComponentType type, QObject *parent)
165 {
166  KService::List offers = engineOffers(language, type);
167 
168  QVariantList args;
169  QString error;
170 
171  ScriptEngine *engine = 0;
172  foreach (const KService::Ptr &service, offers) {
173  switch (type) {
174  case AppletComponent:
175  engine = service->createInstance<Plasma::AppletScript>(parent, args, &error);
176  break;
177  case DataEngineComponent:
178  engine = service->createInstance<Plasma::DataEngineScript>(parent, args, &error);
179  break;
180  case RunnerComponent:
181  engine = service->createInstance<Plasma::RunnerScript>(parent, args, &error);
182  break;
183  case WallpaperComponent:
184  engine = service->createInstance<Plasma::WallpaperScript>(parent, args, &error);
185  break;
186  default:
187  return 0;
188  break;
189  }
190 
191  if (engine) {
192  return engine;
193  }
194 
195  kDebug() << "Couldn't load script engine for language " << language
196  << "! error reported: " << error;
197  }
198 
199  return 0;
200 }
201 
202 AppletScript *loadScriptEngine(const QString &language, Applet *applet)
203 {
204  AppletScript *engine =
205  static_cast<AppletScript*>(loadEngine(language, AppletComponent, applet));
206 
207  if (engine) {
208  engine->setApplet(applet);
209  }
210 
211  return engine;
212 }
213 
214 DataEngineScript *loadScriptEngine(const QString &language, DataEngine *dataEngine)
215 {
216  DataEngineScript *engine =
217  static_cast<DataEngineScript*>(loadEngine(language, DataEngineComponent, dataEngine));
218 
219  if (engine) {
220  engine->setDataEngine(dataEngine);
221  }
222 
223  return engine;
224 }
225 
226 RunnerScript *loadScriptEngine(const QString &language, AbstractRunner *runner)
227 {
228  RunnerScript *engine =
229  static_cast<RunnerScript*>(loadEngine(language, RunnerComponent, runner));
230 
231  if (engine) {
232  engine->setRunner(runner);
233  }
234 
235  return engine;
236 }
237 
238 WallpaperScript *loadScriptEngine(const QString &language, Wallpaper *wallpaper)
239 {
240  WallpaperScript *engine =
241  static_cast<WallpaperScript*>(loadEngine(language, WallpaperComponent, wallpaper));
242 
243  if (engine) {
244  engine->setWallpaper(wallpaper);
245  }
246 
247  return engine;
248 }
249 
250 PackageStructure::Ptr defaultPackageStructure(ComponentType type)
251 {
252  switch (type) {
253  case AppletComponent:
254  case WallpaperComponent:
255  case RunnerComponent:
256  case GenericComponent:
257  return PackageStructure::Ptr(new PlasmoidPackage());
258  break;
259  case DataEngineComponent:
260  return PackageStructure::Ptr(new DataEnginePackage());
261  break;
262  default:
263  // TODO: we don't have any special structures for other components yet
264  break;
265  }
266 
267  return PackageStructure::Ptr(new PackageStructure());
268 }
269 
270 PackageStructure::Ptr packageStructure(const QString &language, ComponentType type)
271 {
272  KService::List offers = engineOffers(language, type);
273 
274  if (offers.isEmpty()) {
275  return defaultPackageStructure(type);
276  }
277 
278  KService::Ptr offer = offers.first();
279  QString packageFormat = offer->property("X-Plasma-PackageFormat").toString();
280 
281  if (packageFormat.isEmpty()) {
282  return defaultPackageStructure(type);
283  } else {
284  PackageStructure::Ptr structure = PackageStructure::load(packageFormat);
285  return structure;
286  }
287 }
288 
289 } // namespace Plasma
290 
291 #include <scriptengine.moc>
292 
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Fri Nov 16 2012 14:55:57 by doxygen 1.8.1 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Plasma

Skip menu "Plasma"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.8.5 API Reference

Skip menu "kdelibs-4.8.5 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal