25 #include <QtCore/QObject>
26 #include <QtCore/QArgument>
27 #include <QtCore/QFile>
28 #include <QtCore/QRegExp>
29 #include <QtCore/QFileInfo>
30 #include <QtCore/QPointer>
31 #include <QtCore/QLibrary>
32 #include <QtCore/QCoreApplication>
42 using namespace Kross;
47 class Manager::Private
66 bool strictTypesEnabled;
78 void*
loadLibrary(
const char* libname,
const char* functionname)
81 lib.setLoadHints( QLibrary::ExportExternalSymbolsHint );
87 lib.setFileName( QFileInfo(dir, libname).filePath() );
88 lib.setLoadHints( QLibrary::ExportExternalSymbolsHint );
104 if( ! lib.isLoaded() ) {
105 #ifdef KROSS_INTERPRETER_DEBUG
106 if( strcmp(functionname,
"krossinterpreter") == 0 )
107 krossdebug(
QString(
"Kross Interpreter '%1' not available: %2").arg(libname).arg(err) );
108 else if( strcmp(functionname,
"krossmodule") == 0 )
109 krossdebug(
QString(
"Kross Module '%1' not available: %2").arg(libname).arg(err) );
111 krosswarning(
QString(
"Failed to load unknown type of '%1' library: %2").arg(libname).arg(err) );
116 void* funcPtr = lib.resolve(functionname);
127 d->strictTypesEnabled =
true;
128 setObjectName(
"Kross");
131 #ifdef KROSS_PYTHON_LIBRARY
133 d->interpreterinfos.insert(
"python",
143 #ifdef KROSS_RUBY_LIBRARY
147 i18n(
"Level of safety of the Ruby interpreter"),
149 d->interpreterinfos.insert(
"ruby",
160 #ifdef KROSS_JAVA_LIBRARY
162 d->interpreterinfos.insert(
"java",
165 "*.java *.class *.jar",
172 #ifdef KROSS_KJS_LIBRARY
174 d->interpreterinfos.insert(
"javascript",
184 #ifdef KROSS_FALCON_LIBRARY
186 d->interpreterinfos.insert(
"falcon",
196 #ifdef KROSS_QTSCRIPT_LIBRARY
198 d->interpreterinfos.insert(
"qtscript",
208 #ifdef KROSS_LUA_LIBRARY
210 d->interpreterinfos.insert(
"lua",
222 for(; it != d->interpreterinfos.end(); ++it)
224 d->interpreters << it.key();
225 d->interpreters.sort();
233 qDeleteAll(d->wrappers);
234 qDeleteAll(d->interpreterinfos);
235 qDeleteAll(d->modules);
236 delete d->collection;
242 return d->interpreterinfos;
247 return d->interpreterinfos.contains(interpretername) && d->interpreterinfos[interpretername];
252 return hasInterpreterInfo(interpretername) ? d->interpreterinfos[interpretername] : 0;
258 rx.setPatternSyntax(QRegExp::Wildcard);
262 foreach(
const QString &wildcard, it.value()->wildcard().split(
' ', QString::SkipEmptyParts)) {
263 rx.setPattern( wildcard );
264 if( rx.exactMatch(file) )
265 return it.value()->interpreterName();
277 return d->interpreterinfos[interpretername]->interpreter();
282 return d->interpreters;
287 return d->collection;
292 return findChild< Action* >(name) != 0L;
299 action =
new Action(
this, name);
301 d->actioncollection->insert(action);
309 if( d->modules.contains(modulename) ) {
310 QObject* obj = d->modules[modulename];
315 if( modulename.isEmpty() || modulename.contains( QRegExp(
"[^a-zA-Z0-9]") ) ) {
320 QByteArray libraryname =
QString(
"krossmodule%1").arg(modulename).toLower().toLatin1();
324 KLibrary* lib = loader->
library( libraryname, QLibrary::ExportExternalSymbolsHint );
326 lib = loader->
library(
QString(
"lib%1").arg(libraryname), QLibrary::ExportExternalSymbolsHint );
336 krosswarning(
QString(
"Failed to determinate init function in module '%1'").arg(modulename) );
348 if(
void* funcPtr =
loadLibrary(libraryname,
"krossmodule") ) {
354 d->modules.insert(modulename, module);
366 qDeleteAll(d->modules);
372 krossdebug(
QString(
"Manager::executeScriptFile() file='%1'").arg(file.toString()) );
387 return this->
object(name);
397 return d->wrappers.contains(typeName) ? d->wrappers[typeName] : 0;
412 d->wrappers.insert(typeName, handler);
417 return d->strictTypesEnabled;
422 d->strictTypesEnabled = enabled;
427 return d->wrappers.contains(typeName);
430 #include "manager.moc"