You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kexi/plugins/macros/lib/metaobject.cpp

152 lines
4.0 KiB

/***************************************************************************
* This file is part of the KDE project
* copyright (C) 2005 by Sebastian Sauer (mail@dipe.org)
* copyright (C) 2005 by Tobi Krebs (tobi.krebs@gmail.com)
*
* 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 "metaobject.h"
#include "metamethod.h"
#include "variable.h"
#include "exception.h"
#include <tqguardedptr.h>
#include <tqmetaobject.h>
#include <kdebug.h>
using namespace KoMacro;
namespace KoMacro {
/**
* @internal d-pointer class to be more flexible on future extension of the
* functionality without to much risk to break the binary compatibility.
*/
class MetaObject::Private
{
public:
/**
* The TQObject instance this @a MetaObject belongs to.
*/
TQGuardedPtr<TQObject> const object;
/**
* Constructor.
*/
Private(TQObject* const object)
: object(object)
{
}
};
}
MetaObject::MetaObject(TQObject* const object)
: KShared()
, d( new Private(object) ) // create the private d-pointer instance.
{
}
MetaObject::~MetaObject()
{
delete d;
}
TQObject* const MetaObject::object() const
{
if(! d->object) {
throw Exception(TQString("Object is undefined."));
}
return d->object;
}
/*
TQStrList MetaObject::signalNames() const
{
return object()->tqmetaObject()->signalNames();
}
TQStrList MetaObject::slotNames() const
{
return object()->tqmetaObject()->slotNames();
}
*/
int MetaObject::indexOfSignal(const char* signal) const
{
TQMetaObject* metaobject = object()->tqmetaObject();
int signalid = metaobject->findSignal(signal, false);
if(signalid < 0) {
throw Exception(TQString("Invalid signal \"%1\"").tqarg(signal));
}
return signalid;
}
int MetaObject::indexOfSlot(const char* slot) const
{
TQMetaObject* metaobject = object()->tqmetaObject();
int slotid = metaobject->findSlot(slot, false);
if(slotid < 0) {
throw Exception(TQString("Invalid slot \"%1\"").tqarg(slot));
}
return slotid;
}
KSharedPtr<MetaMethod> MetaObject::method(int index)
{
TQObject* obj = object();
MetaMethod::Type type = MetaMethod::Slot;
TQMetaObject* metaobject = obj->tqmetaObject();
const TQMetaData* metadata = metaobject->slot(index, true);
if(! metadata) {
// Try to get a signal with that index iff we failed to determinate
// a matching slot.
metadata = metaobject->signal(index, true);
if(! metadata) {
throw Exception(TQString("Invalid method index \"%1\" in object \"%2\"").tqarg(index).tqarg(obj->name()));
}
type = MetaMethod::Signal;
}
if(metadata->access != TQMetaData::Public) {
throw Exception(TQString("Not allowed to access method \"%1\" in object \"%2\"").tqarg(metadata->name).tqarg(obj->name()));
}
return new MetaMethod(metadata->name, type, this);
}
KSharedPtr<MetaMethod> MetaObject::signal(const char* signal)
{
return method( indexOfSignal(signal) );
}
KSharedPtr<MetaMethod> MetaObject::slot(const char* slot)
{
return method( indexOfSlot(slot) );
}
KSharedPtr<Variable> MetaObject::invokeMethod(int index, Variable::List arguments)
{
// kdDebug() << "MetaObject::invokeMethod(int index, Variable::List arguments)" << endl;
KSharedPtr<MetaMethod> m = method(index);
// kdDebug() << "MetaObject::invokeMethod(int index, Variable::List arguments) return" << endl;
return m->invoke(arguments);
}