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
KDE 4.6 API Reference