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

Plasma

scriptengine.cpp
Go to the documentation of this file.
00001 /*
00002  *   Copyright 2007 by Aaron Seigo <aseigo@kde.org>
00003  *
00004  *   This program is free software; you can redistribute it and/or modify
00005  *   it under the terms of the GNU Library General Public License as
00006  *   published by the Free Software Foundation; either version 2, or
00007  *   (at your option) any later version.
00008  *
00009  *   This program is distributed in the hope that it will be useful,
00010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *   GNU General Public License for more details
00013  *
00014  *   You should have received a copy of the GNU Library General Public
00015  *   License along with this program; if not, write to the
00016  *   Free Software Foundation, Inc.,
00017  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00018  */
00019 
00020 #include "scripting/scriptengine.h"
00021 
00022 #include <kdebug.h>
00023 #include <kservice.h>
00024 #include <kservicetypetrader.h>
00025 
00026 #include "abstractrunner.h"
00027 #include "applet.h"
00028 #include "dataengine.h"
00029 #include "package.h"
00030 #include "private/componentinstaller_p.h"
00031 #include "scripting/appletscript.h"
00032 #include "scripting/dataenginescript.h"
00033 #include "scripting/runnerscript.h"
00034 #include "scripting/wallpaperscript.h"
00035 
00036 #include "private/packages_p.h"
00037 
00038 namespace Plasma
00039 {
00040 
00041 ScriptEngine::ScriptEngine(QObject *parent)
00042     : QObject(parent),
00043       d(0)
00044 {
00045 }
00046 
00047 ScriptEngine::~ScriptEngine()
00048 {
00049 //    delete d;
00050 }
00051 
00052 bool ScriptEngine::init()
00053 {
00054     return true;
00055 }
00056 
00057 const Package *ScriptEngine::package() const
00058 {
00059     return 0;
00060 }
00061 
00062 QString ScriptEngine::mainScript() const
00063 {
00064     return QString();
00065 }
00066 
00067 QStringList knownLanguages(ComponentTypes types)
00068 {
00069     QString constraintTemplate = "'%1' in [X-Plasma-ComponentTypes]";
00070     QString constraint;
00071 
00072     if (types & AppletComponent) {
00073         // currently this if statement is not needed, but this future proofs
00074         // the code against someone initializing constraint to something
00075         // before we get here.
00076         if (!constraint.isEmpty()) {
00077             constraint.append(" or ");
00078         }
00079 
00080         constraint.append(constraintTemplate.arg("Applet"));
00081     }
00082 
00083     if (types & DataEngineComponent) {
00084         if (!constraint.isEmpty()) {
00085             constraint.append(" or ");
00086         }
00087 
00088         constraint.append(constraintTemplate.arg("DataEngine"));
00089     }
00090 
00091     if (types & RunnerComponent) {
00092         if (!constraint.isEmpty()) {
00093             constraint.append(" or ");
00094         }
00095 
00096         constraint.append(constraintTemplate.arg("Runner"));
00097     }
00098 
00099     if (types & WallpaperComponent) {
00100         if (!constraint.isEmpty()) {
00101             constraint.append(" or ");
00102         }
00103 
00104         constraint.append(constraintTemplate.arg("Wallpaper"));
00105     }
00106 
00107     KService::List offers = KServiceTypeTrader::self()->query("Plasma/ScriptEngine", constraint);
00108     //kDebug() << "Applet::knownApplets constraint was '" << constraint
00109     //         << "' which got us " << offers.count() << " matches";
00110 
00111     QStringList languages;
00112     foreach (const KService::Ptr &service, offers) {
00113         QString language = service->property("X-Plasma-API").toString();
00114         if (!languages.contains(language)) {
00115             languages.append(language);
00116         }
00117     }
00118 
00119     return languages;
00120 }
00121 
00122 KService::List engineOffers(const QString &language, ComponentType type)
00123 {
00124     if (language.isEmpty()) {
00125         return KService::List();
00126     }
00127 
00128     QRegExp re("[^a-zA-Z0-9\\-_]");
00129     if (re.indexIn(language) != -1) {
00130         kDebug() << "invalid language attempted:" << language;
00131         return KService::List();
00132     }
00133 
00134     QString component;
00135     switch (type) {
00136     case AppletComponent:
00137         component = "Applet";
00138         break;
00139     case DataEngineComponent:
00140         component = "DataEngine";
00141         break;
00142     case RunnerComponent:
00143         component = "Runner";
00144         break;
00145     case WallpaperComponent:
00146         component = "Wallpaper";
00147         break;
00148     default:
00149         return KService::List();
00150         break;
00151     }
00152 
00153     QString constraint = QString("[X-Plasma-API] == '%1' and "
00154                                  "'%2' in [X-Plasma-ComponentTypes]").arg(language, component);
00155     KService::List offers = KServiceTypeTrader::self()->query("Plasma/ScriptEngine", constraint);
00156     /* kDebug() << "********************* loadingApplet with Plasma/ScriptEngine" << constraint
00157              << "resulting in" << offers.count() << "results";*/
00158     if (offers.isEmpty()) {
00159         kDebug() << "No offers for \"" << language << "\"";
00160     }
00161 
00162     return offers;
00163 }
00164 
00165 ScriptEngine *loadEngine(const QString &language, ComponentType type, QObject *parent)
00166 {
00167     KService::List offers = engineOffers(language, type);
00168 
00169     QVariantList args;
00170     QString error;
00171 
00172     ScriptEngine *engine = 0;
00173     foreach (const KService::Ptr &service, offers) {
00174         switch (type) {
00175             case AppletComponent:
00176                 engine = service->createInstance<Plasma::AppletScript>(parent, args, &error);
00177                 break;
00178             case DataEngineComponent:
00179                 engine = service->createInstance<Plasma::DataEngineScript>(parent, args, &error);
00180                 break;
00181             case RunnerComponent:
00182                 engine = service->createInstance<Plasma::RunnerScript>(parent, args, &error);
00183                 break;
00184             case WallpaperComponent:
00185                 engine = service->createInstance<Plasma::WallpaperScript>(parent, args, &error);
00186                 break;
00187             default:
00188                 return 0;
00189                 break;
00190         }
00191 
00192         if (engine) {
00193             return engine;
00194         }
00195 
00196         kDebug() << "Couldn't load script engine for language " << language
00197                  << "! error reported: " << error;
00198     }
00199 
00200     // Try installing the engine. However, it's too late for this request.
00201     ComponentInstaller::self()->installMissingComponent("scriptengine", language);
00202 
00203     return 0;
00204 }
00205 
00206 AppletScript *loadScriptEngine(const QString &language, Applet *applet)
00207 {
00208     AppletScript *engine =
00209         static_cast<AppletScript*>(loadEngine(language, AppletComponent, applet));
00210 
00211     if (engine) {
00212         engine->setApplet(applet);
00213     }
00214 
00215     return engine;
00216 }
00217 
00218 DataEngineScript *loadScriptEngine(const QString &language, DataEngine *dataEngine)
00219 {
00220     DataEngineScript *engine =
00221         static_cast<DataEngineScript*>(loadEngine(language, DataEngineComponent, dataEngine));
00222 
00223     if (engine) {
00224         engine->setDataEngine(dataEngine);
00225     }
00226 
00227     return engine;
00228 }
00229 
00230 RunnerScript *loadScriptEngine(const QString &language, AbstractRunner *runner)
00231 {
00232     RunnerScript *engine =
00233         static_cast<RunnerScript*>(loadEngine(language, RunnerComponent, runner));
00234 
00235     if (engine) {
00236         engine->setRunner(runner);
00237     }
00238 
00239     return engine;
00240 }
00241 
00242 WallpaperScript *loadScriptEngine(const QString &language, Wallpaper *wallpaper)
00243 {
00244     WallpaperScript *engine =
00245         static_cast<WallpaperScript*>(loadEngine(language, WallpaperComponent, wallpaper));
00246 
00247     if (engine) {
00248         engine->setWallpaper(wallpaper);
00249     }
00250 
00251     return engine;
00252 }
00253 
00254 PackageStructure::Ptr defaultPackageStructure(ComponentType type)
00255 {
00256     switch (type) {
00257     case AppletComponent:
00258     case WallpaperComponent:
00259     case RunnerComponent:
00260     case GenericComponent:
00261         return PackageStructure::Ptr(new PlasmoidPackage());
00262         break;
00263     case DataEngineComponent:
00264         return PackageStructure::Ptr(new DataEnginePackage());
00265         break;
00266     default:
00267         // TODO: we don't have any special structures for other components yet
00268         break;
00269     }
00270 
00271     return PackageStructure::Ptr(new PackageStructure());
00272 }
00273 
00274 PackageStructure::Ptr packageStructure(const QString &language, ComponentType type)
00275 {
00276     KService::List offers = engineOffers(language, type);
00277 
00278     if (offers.isEmpty()) {
00279         return defaultPackageStructure(type);
00280     }
00281 
00282     KService::Ptr offer = offers.first();
00283     QString packageFormat = offer->property("X-Plasma-PackageFormat").toString();
00284 
00285     if (packageFormat.isEmpty()) {
00286         return defaultPackageStructure(type);
00287     } else {
00288         PackageStructure::Ptr structure = PackageStructure::load(packageFormat);
00289         return structure;
00290     }
00291 }
00292 
00293 } // namespace Plasma
00294 
00295 #include <scriptengine.moc>
00296 
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Thu May 10 2012 20:51:37 by doxygen 1.8.0 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.3 API Reference

Skip menu "kdelibs-4.8.3 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