kdelibs/kross/core/interpreter.cpp

178 lines
4.8 KiB
C++
Raw Normal View History

2014-11-13 01:04:59 +02:00
/***************************************************************************
* interpreter.cpp
* This file is part of the KDE project
* copyright (C)2004-2006 by Sebastian Sauer (mail@dipe.org)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
* You should have received a copy of the GNU Library General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
***************************************************************************/
#include "interpreter.h"
#include "script.h"
#include "action.h"
#include "manager.h"
extern "C"
{
typedef void* (*def_interpreter_func)(int version, Kross::InterpreterInfo*);
}
using namespace Kross;
/*************************************************************************
* InterpreterInfo
*/
namespace Kross {
/// \internal d-pointer class.
class InterpreterInfo::Private
{
public:
/// The name the interpreter has. Could be something like "python" or "kjs".
QString interpretername;
/// The function-pointer to the module factory function.
void* funcPtr;
/// The file wildcard used to determinate extensions.
QString wildcard;
/// List of mimetypes this interpreter supports.
QStringList mimetypes;
/// A map with options.
Option::Map options;
/// The \a Interpreter instance.
Interpreter* interpreter;
};
}
InterpreterInfo::InterpreterInfo(const QString& interpretername, void* funcPtr, const QString& wildcard, const QStringList& mimetypes, const Option::Map& options)
: d( new Private() )
{
d->interpretername = interpretername;
d->funcPtr = funcPtr;
d->wildcard = wildcard;
d->mimetypes = mimetypes;
d->options = options;
d->interpreter = 0;
}
InterpreterInfo::~InterpreterInfo()
{
delete d->interpreter;
d->interpreter = 0;
delete d;
}
const QString InterpreterInfo::interpreterName() const
{
return d->interpretername;
}
const QString InterpreterInfo::wildcard() const
{
return d->wildcard;
}
const QStringList InterpreterInfo::mimeTypes() const
{
return d->mimetypes;
}
bool InterpreterInfo::hasOption(const QString& name) const
{
return d->options.contains(name);
}
InterpreterInfo::Option* InterpreterInfo::option(const QString& name) const
{
return d->options.contains(name) ? d->options[name] : 0;
}
InterpreterInfo::Option::Map& InterpreterInfo::options()
{
return d->options;
}
const QVariant InterpreterInfo::optionValue(const QString& name, const QVariant& defaultvalue) const
{
return d->options.contains(name) ? d->options[name]->value : defaultvalue;
}
Interpreter* InterpreterInfo::interpreter()
{
if(d->interpreter) // buffered
return d->interpreter;
//#ifdef KROSS_INTERPRETER_DEBUG
krossdebug( QString("Loading the interpreter library for %1").arg(d->interpretername) );
//#endif
// Get the extern "C" krosspython_instance function.
def_interpreter_func interpreter_func = (def_interpreter_func) d->funcPtr;
// and execute the extern krosspython_instance function.
d->interpreter = interpreter_func
? (Interpreter*) (interpreter_func)(KROSS_VERSION, this)
: 0;
if(! d->interpreter) {
//#ifdef KROSS_INTERPRETER_DEBUG
krosswarning("Incompatible interpreter library.");
//#endif
}
else {
// Job done. The library is loaded and our Interpreter* points
// to the external Kross::Python::Interpreter* instance.
//#ifdef KROSS_INTERPRETER_DEBUG
krossdebug("Successfully loaded Interpreter instance from library.");
//#endif
}
return d->interpreter;
}
/*************************************************************************
* Interpreter
*/
namespace Kross {
/// \internal d-pointer class.
class Interpreter::Private
{
public:
InterpreterInfo* interpreterinfo;
Private(InterpreterInfo* info) : interpreterinfo(info) {}
};
}
Interpreter::Interpreter(InterpreterInfo* info)
: QObject()
, ErrorInterface()
, d( new Private(info) )
{
}
Interpreter::~Interpreter()
{
delete d;
}
InterpreterInfo* Interpreter::interpreterInfo() const
{
return d->interpreterinfo;
}
#include "moc_interpreter.cpp"