• Skip to content
  • Skip to link menu
KDE 4.6 API Reference
  • KDE API Reference
  • kdelibs
  • 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 "scripting/appletscript.h"
00031 #include "scripting/dataenginescript.h"
00032 #include "scripting/runnerscript.h"
00033 #include "scripting/wallpaperscript.h"
00034 
00035 #include "private/packages_p.h"
00036 
00037 namespace Plasma
00038 {
00039 
00040 ScriptEngine::ScriptEngine(QObject *parent)
00041     : QObject(parent),
00042       d(0)
00043 {
00044 }
00045 
00046 ScriptEngine::~ScriptEngine()
00047 {
00048 //    delete d;
00049 }
00050 
00051 bool ScriptEngine::init()
00052 {
00053     return true;
00054 }
00055 
00056 const Package *ScriptEngine::package() const
00057 {
00058     return 0;
00059 }
00060 
00061 QString ScriptEngine::mainScript() const
00062 {
00063     return QString();
00064 }
00065 
00066 QStringList knownLanguages(ComponentTypes types)
00067 {
00068     QString constraintTemplate = "'%1' in [X-Plasma-ComponentTypes]";
00069     QString constraint;
00070 
00071     if (types & AppletComponent) {
00072         // currently this if statement is not needed, but this future proofs
00073         // the code against someone initializing constraint to something
00074         // before we get here.
00075         if (!constraint.isEmpty()) {
00076             constraint.append(" or ");
00077         }
00078 
00079         constraint.append(constraintTemplate.arg("Applet"));
00080     }
00081 
00082     if (types & DataEngineComponent) {
00083         if (!constraint.isEmpty()) {
00084             constraint.append(" or ");
00085         }
00086 
00087         constraint.append(constraintTemplate.arg("DataEngine"));
00088     }
00089 
00090     if (types & RunnerComponent) {
00091         if (!constraint.isEmpty()) {
00092             constraint.append(" or ");
00093         }
00094 
00095         constraint.append(constraintTemplate.arg("Runner"));
00096     }
00097 
00098     if (types & WallpaperComponent) {
00099         if (!constraint.isEmpty()) {
00100             constraint.append(" or ");
00101         }
00102 
00103         constraint.append(constraintTemplate.arg("Wallpaper"));
00104     }
00105 
00106     KService::List offers = KServiceTypeTrader::self()->query("Plasma/ScriptEngine", constraint);
00107     //kDebug() << "Applet::knownApplets constraint was '" << constraint
00108     //         << "' which got us " << offers.count() << " matches";
00109 
00110     QStringList languages;
00111     foreach (const KService::Ptr &service, offers) {
00112         QString language = service->property("X-Plasma-API").toString();
00113         if (!languages.contains(language)) {
00114             languages.append(language);
00115         }
00116     }
00117 
00118     return languages;
00119 }
00120 
00121 KService::List engineOffers(const QString &language, ComponentType type)
00122 {
00123     if (language.isEmpty()) {
00124         return KService::List();
00125     }
00126 
00127     QRegExp re("[^a-zA-Z0-9\\-_]");
00128     if (re.indexIn(language) != -1) {
00129         kDebug() << "invalid language attempted:" << language;
00130         return KService::List();
00131     }
00132 
00133     QString component;
00134     switch (type) {
00135     case AppletComponent:
00136         component = "Applet";
00137         break;
00138     case DataEngineComponent:
00139         component = "DataEngine";
00140         break;
00141     case RunnerComponent:
00142         component = "Runner";
00143         break;
00144     case WallpaperComponent:
00145         component = "Wallpaper";
00146         break;
00147     default:
00148         return KService::List();
00149         break;
00150     }
00151 
00152     QString constraint = QString("[X-Plasma-API] == '%1' and "
00153                                  "'%2' in [X-Plasma-ComponentTypes]").arg(language, component);
00154     KService::List offers = KServiceTypeTrader::self()->query("Plasma/ScriptEngine", constraint);
00155     /* kDebug() << "********************* loadingApplet with Plasma/ScriptEngine" << constraint
00156              << "resulting in" << offers.count() << "results";*/
00157     if (offers.isEmpty()) {
00158         kDebug() << "No offers for \"" << language << "\"";
00159     }
00160 
00161     return offers;
00162 }
00163 
00164 ScriptEngine *loadEngine(const QString &language, ComponentType type, QObject *parent)
00165 {
00166     KService::List offers = engineOffers(language, type);
00167 
00168     QVariantList args;
00169     QString error;
00170 
00171     ScriptEngine *engine = 0;
00172     foreach (const KService::Ptr &service, offers) {
00173         switch (type) {
00174             case AppletComponent:
00175                 engine = service->createInstance<Plasma::AppletScript>(parent, args, &error);
00176                 break;
00177             case DataEngineComponent:
00178                 engine = service->createInstance<Plasma::DataEngineScript>(parent, args, &error);
00179                 break;
00180             case RunnerComponent:
00181                 engine = service->createInstance<Plasma::RunnerScript>(parent, args, &error);
00182                 break;
00183             case WallpaperComponent:
00184                 engine = service->createInstance<Plasma::WallpaperScript>(parent, args, &error);
00185                 break;
00186             default:
00187                 return 0;
00188                 break;
00189         }
00190 
00191         if (engine) {
00192             return engine;
00193         }
00194 
00195         kDebug() << "Couldn't load script engine for language " << language
00196                  << "! error reported: " << error;
00197     }
00198 
00199     return 0;
00200 }
00201 
00202 AppletScript *loadScriptEngine(const QString &language, Applet *applet)
00203 {
00204     AppletScript *engine =
00205         static_cast<AppletScript*>(loadEngine(language, AppletComponent, applet));
00206 
00207     if (engine) {
00208         engine->setApplet(applet);
00209     }
00210 
00211     return engine;
00212 }
00213 
00214 DataEngineScript *loadScriptEngine(const QString &language, DataEngine *dataEngine)
00215 {
00216     DataEngineScript *engine =
00217         static_cast<DataEngineScript*>(loadEngine(language, DataEngineComponent, dataEngine));
00218 
00219     if (engine) {
00220         engine->setDataEngine(dataEngine);
00221     }
00222 
00223     return engine;
00224 }
00225 
00226 RunnerScript *loadScriptEngine(const QString &language, AbstractRunner *runner)
00227 {
00228     RunnerScript *engine =
00229         static_cast<RunnerScript*>(loadEngine(language, RunnerComponent, runner));
00230 
00231     if (engine) {
00232         engine->setRunner(runner);
00233     }
00234 
00235     return engine;
00236 }
00237 
00238 WallpaperScript *loadScriptEngine(const QString &language, Wallpaper *wallpaper)
00239 {
00240     WallpaperScript *engine =
00241         static_cast<WallpaperScript*>(loadEngine(language, WallpaperComponent, wallpaper));
00242 
00243     if (engine) {
00244         engine->setWallpaper(wallpaper);
00245     }
00246 
00247     return engine;
00248 }
00249 
00250 PackageStructure::Ptr defaultPackageStructure(ComponentType type)
00251 {
00252     switch (type) {
00253     case AppletComponent:
00254     case WallpaperComponent:
00255     case RunnerComponent:
00256         return PackageStructure::Ptr(new PlasmoidPackage());
00257         break;
00258     case DataEngineComponent:
00259         return PackageStructure::Ptr(new DataEnginePackage());
00260         break;
00261     default:
00262         // TODO: we don't have any special structures for other components yet
00263         break;
00264     }
00265 
00266     return PackageStructure::Ptr(new PackageStructure());
00267 }
00268 
00269 PackageStructure::Ptr packageStructure(const QString &language, ComponentType type)
00270 {
00271     KService::List offers = engineOffers(language, type);
00272 
00273     if (offers.isEmpty()) {
00274         return defaultPackageStructure(type);
00275     }
00276 
00277     KService::Ptr offer = offers.first();
00278     QString packageFormat = offer->property("X-Plasma-PackageFormat").toString();
00279 
00280     if (packageFormat.isEmpty()) {
00281         return defaultPackageStructure(type);
00282     } else {
00283         PackageStructure::Ptr structure = PackageStructure::load(packageFormat);
00284         return structure;
00285     }
00286 }
00287 
00288 } // namespace Plasma
00289 
00290 #include <scriptengine.moc>
00291 

Plasma

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

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • 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
Generated for kdelibs by doxygen 1.7.3
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal