20#include "metamethod.h"
21#include "metaobject.h"
22#include "metaparameter.h"
27#include <tqmetaobject.h>
30#include <private/tqucom_p.h>
31#include <private/tqucomextra_p.h>
35using namespace KoMacro;
43 class MetaMethod::Private
55 TQString signaturetag;
60 TQString signaturearguments;
73 TDESharedPtr<MetaObject> object;
92 int startpos = d->signature.find(
"(");
93 int endpos = d->signature.findRev(
")");
94 if(startpos < 0 || startpos > endpos) {
95 throw Exception(TQString(
"Invalid signature \"%1\"").arg(d->signature));
98 d->signaturetag = d->signature.left(startpos).stripWhiteSpace();
99 if(d->signaturetag.isEmpty()) {
100 throw Exception(TQString(
"Invalid tagname in signature \"%1\"").arg(d->signature));
103 d->signaturearguments = d->signature.mid(startpos + 1, endpos - startpos - 1).stripWhiteSpace();
106 int commapos = d->signaturearguments.find(
",");
107 int starttemplatepos = d->signaturearguments.find(
"<");
108 if(starttemplatepos >= 0 && (commapos < 0 || starttemplatepos < commapos)) {
109 int endtemplatepos = d->signaturearguments.find(
">", starttemplatepos);
110 if(endtemplatepos <= 0) {
111 throw Exception(TQString(
"No closing template-definiton in signature \"%1\"").arg(d->signature));
113 commapos = d->signaturearguments.find(
",", endtemplatepos);
117 TQString s = d->signaturearguments.left(commapos).stripWhiteSpace();
121 d->signaturearguments = d->signaturearguments.right(d->signaturearguments.length() - commapos - 1);
124 TQString s = d->signaturearguments.stripWhiteSpace();
150 return d->signaturetag;
155 return d->signaturearguments;
170 uint argsize = d->arguments.size();
173 throw Exception(TQString(
"To less arguments for slot with siganture \"%1\"").arg(d->signature));
178 TQUObject* uo =
new TQUObject[ argsize + 1 ];
182 for(uint i = 0; i < argsize; i++) {
183 TDESharedPtr<MetaParameter> metaargument = d->arguments[i];
184 TDESharedPtr<Variable> variable =
arguments[i + 1];
187 throw Exception(TQString(
"Variable is undefined !"));
190 if(metaargument->type() != variable->type()) {
191 throw Exception(TQString(
"Wrong variable type in method \"%1\". Expected \"%2\" but got \"%3\"").arg(d->signature).arg(metaargument->type()).arg(variable->type()));
194 switch(metaargument->type()) {
196 case Variable::TypeNone: {
197 kdDebug() <<
"Variable::TypeNone" << endl;
198 uo[i + 1] = TQUObject();
202 kdDebug() <<
"Variable::TypeVariant" << endl;
204 const TQVariant variant = variable->variant();
205 switch(metaargument->variantType()) {
206 case TQVariant::String: {
207 const TQString s = variant.toString();
208 static_QUType_TQString.set( &(uo[i + 1]), s );
210 case TQVariant::Int: {
211 const int j = variant.toInt();
212 static_QUType_int.set( &(uo[i + 1]), j );
214 case TQVariant::Bool: {
215 const bool b = variant.toBool();
216 static_QUType_bool.set( &(uo[i + 1]), b );
218 case TQVariant::Double: {
219 const double d = variant.toDouble();
220 static_TQUType_double.set( &(uo[i + 1]), d );
222 case TQVariant::Invalid: {
223 static_TQUType_TQVariant.set( &(uo[i + 1]), variant );
232 throw Exception(TQString(
"Invalid parameter !!!!!!!!!!!!!!!!!!!!!!!"));
238 kdDebug() <<
"Variable::TypeObject" << endl;
240 const TQObject* obj =
arguments[i + 1]->object();
242 throw Exception(TQString(
"No TQObject !"));
244 static_QUType_ptr.set( &(uo[i + 1]), obj );
248 throw Exception(TQString(
"Invalid variable type"));
259 const TQString desc( uo->type->desc() );
265 if(desc ==
"TQString") {
266 const TQString s = static_QUType_TQString.get(uo);
271 const int j = static_QUType_int.get(uo);
276 const bool b = static_QUType_bool.get(uo);
280 if(desc ==
"double") {
281 const double d = static_TQUType_double.get(uo);
285 if(desc ==
"TQVariant") {
286 TQVariant v = static_TQUType_TQVariant.get(uo);
290 throw Exception(TQString(
"Invalid parameter '%1'").arg(desc));
297 MetaParameter::List::ConstIterator it, end( d->arguments.constEnd() );
298 for( it = d->arguments.constBegin(); it != end; ++it) {
308 kdDebug() <<
"TDESharedPtr<Variable> MetaMethod::invoke(Variable::List arguments)" << endl;
311 throw Exception(
"MetaObject is undefined.");
314 TQObject* obj = d->object->object();
315 TDESharedPtr<Variable> returnvalue;
323 int index = d->object->indexOfSignal( d->signature.latin1() );
324 obj->tqt_emit(index, qu);
327 int index = d->object->indexOfSlot( d->signature.latin1() );
328 obj->tqt_invoke(index, qu);
338 kdDebug() <<
"EXCEPTION in KoMacro::MetaMethod::invoke(Variable::List)" << endl;
A variable value used to provide abstract access to variables.
TQValueList< TDESharedPtr< Variable > > List
Property to get and set a TQVariant as variable.