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 Wed May 2 2012 17:36:16 by doxygen 1.8.0 written by Dimitri van Heesch, © 1997-2006
Documentation copyright © 1996-2012 The KDE developers.
Generated on Wed May 2 2012 17:36:16 by doxygen 1.8.0 written by Dimitri van Heesch, © 1997-2006
KDE's Doxygen guidelines are available online.