summaryrefslogtreecommitdiffstats
path: root/src/script/api/qscriptengine.cpp
diff options
context:
space:
mode:
authorKent Hansen <khansen@trolltech.com>2009-07-06 15:04:56 (GMT)
committerKent Hansen <khansen@trolltech.com>2009-07-06 15:04:56 (GMT)
commitbd98c3e2f7117c9538c1c81e95e866358c92f44a (patch)
treed42cfa3c3b3f340674d56fcf0f5900128f471b1d /src/script/api/qscriptengine.cpp
parent292f72349a9ff74320f29b12f725bad6c8c283c4 (diff)
downloadQt-bd98c3e2f7117c9538c1c81e95e866358c92f44a.zip
Qt-bd98c3e2f7117c9538c1c81e95e866358c92f44a.tar.gz
Qt-bd98c3e2f7117c9538c1c81e95e866358c92f44a.tar.bz2
implement QScriptEngine::availableExtensions()
Diffstat (limited to 'src/script/api/qscriptengine.cpp')
-rw-r--r--src/script/api/qscriptengine.cpp74
1 files changed, 71 insertions, 3 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 87f8e1c..48142bb 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -44,6 +44,12 @@
#ifndef QT_NO_QOBJECT
#include <QtCore/qcoreapplication.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qfileinfo.h>
+#include <QtCore/qpluginloader.h>
+#include <QtCore/qset.h>
+#include "qscriptextensioninterface.h"
#endif
Q_DECLARE_METATYPE(QScriptValue)
@@ -2519,8 +2525,68 @@ QScriptValue QScriptEngine::importExtension(const QString &extension)
*/
QStringList QScriptEngine::availableExtensions() const
{
- qWarning("QScriptEngine::availableExtensions() not implemented");
+#if defined(QT_NO_QOBJECT) || defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS)
return QStringList();
+#else
+ QCoreApplication *app = QCoreApplication::instance();
+ if (!app)
+ return QStringList();
+
+ QSet<QString> result;
+
+ QObjectList staticPlugins = QPluginLoader::staticInstances();
+ for (int i = 0; i < staticPlugins.size(); ++i) {
+ QScriptExtensionInterface *iface;
+ iface = qobject_cast<QScriptExtensionInterface*>(staticPlugins.at(i));
+ if (iface) {
+ QStringList keys = iface->keys();
+ for (int j = 0; j < keys.count(); ++j)
+ result << keys.at(j);
+ }
+ }
+
+ QStringList libraryPaths = app->libraryPaths();
+ for (int i = 0; i < libraryPaths.count(); ++i) {
+ QString libPath = libraryPaths.at(i) + QDir::separator() + QLatin1String("script");
+ QDir dir(libPath);
+ if (!dir.exists())
+ continue;
+
+ // look for C++ plugins
+ QFileInfoList files = dir.entryInfoList(QDir::Files);
+ for (int j = 0; j < files.count(); ++j) {
+ QFileInfo entry = files.at(j);
+ QString filePath = entry.canonicalFilePath();
+ QPluginLoader loader(filePath);
+ QScriptExtensionInterface *iface;
+ iface = qobject_cast<QScriptExtensionInterface*>(loader.instance());
+ if (iface) {
+ QStringList keys = iface->keys();
+ for (int k = 0; k < keys.count(); ++k)
+ result << keys.at(k);
+ }
+ }
+
+ // look for scripts
+ QString initDotJs = QLatin1String("__init__.js");
+ QList<QFileInfo> stack;
+ stack << dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
+ while (!stack.isEmpty()) {
+ QFileInfo entry = stack.takeLast();
+ QDir dd(entry.canonicalFilePath());
+ if (dd.exists(initDotJs)) {
+ QString rpath = dir.relativeFilePath(dd.canonicalPath());
+ QStringList components = rpath.split(QLatin1Char('/'));
+ result << components.join(QLatin1String("."));
+ stack << dd.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
+ }
+ }
+ }
+
+ QStringList lst = result.toList();
+ qSort(lst);
+ return lst;
+#endif
}
/*!
@@ -2533,8 +2599,10 @@ QStringList QScriptEngine::availableExtensions() const
*/
QStringList QScriptEngine::importedExtensions() const
{
- qWarning("QScriptEngine::importedExtensions() not implemented");
- return QStringList();
+ Q_D(const QScriptEngine);
+ QStringList lst = d->importedExtensions.toList();
+ qSort(lst);
+ return lst;
}
/*! \fn QScriptValue QScriptEngine::toScriptValue(const T &value)