Mercurial > projects > qtd
comparison generator/cppimplgenerator.cpp @ 105:3aa118a9ae71
each QObject now has associated child QObject for handling signals. fixes #15
author | eldar |
---|---|
date | Sun, 31 May 2009 01:38:39 +0000 |
parents | 64b874c86f9b |
children | 23e208cef962 |
comparison
equal
deleted
inserted
replaced
104:64b874c86f9b | 105:3aa118a9ae71 |
---|---|
606 writeShellSignatures(s, java_class); | 606 writeShellSignatures(s, java_class); |
607 | 607 |
608 writeDefaultConstructedValues(s, java_class); | 608 writeDefaultConstructedValues(s, java_class); |
609 | 609 |
610 if (hasCustomDestructor(java_class)) */ | 610 if (hasCustomDestructor(java_class)) */ |
611 writeFinalDestructor(s, java_class); | 611 writeFinalDestructor(s, java_class); |
612 | 612 |
613 if (shellClass) { | 613 if (shellClass) { |
614 foreach (AbstractMetaFunction *function, java_class->functions()) { | 614 foreach (AbstractMetaFunction *function, java_class->functions()) { |
615 if (function->isConstructor() && !function->isPrivate()) | 615 if (function->isConstructor() && !function->isPrivate()) |
616 writeShellConstructor(s, function); | 616 writeShellConstructor(s, function); |
617 } | 617 } |
618 writeShellDestructor(s, java_class); | 618 writeShellDestructor(s, java_class); |
625 // Virtual overrides | 625 // Virtual overrides |
626 s << "// Virtual overrides" << endl; | 626 s << "// Virtual overrides" << endl; |
627 AbstractMetaFunctionList virtualFunctions = java_class->virtualFunctions(); | 627 AbstractMetaFunctionList virtualFunctions = java_class->virtualFunctions(); |
628 for (int pos = 0; pos<virtualFunctions.size(); ++pos) { | 628 for (int pos = 0; pos<virtualFunctions.size(); ++pos) { |
629 const AbstractMetaFunction *function = virtualFunctions.at(pos); | 629 const AbstractMetaFunction *function = virtualFunctions.at(pos); |
630 // qtd writeShellFunction(s, function, java_class, pos); | 630 // qtd writeShellFunction(s, function, java_class, pos); |
631 writeShellVirtualFunction(s, function, java_class, pos); | 631 writeShellVirtualFunction(s, function, java_class, pos); |
632 } | 632 } |
633 | 633 |
634 if (cpp_shared) | 634 if (cpp_shared) |
635 writeInitCallbacks(s, java_class); | 635 writeInitCallbacks(s, java_class); |
637 // Functions in shell class | 637 // Functions in shell class |
638 s << "// Functions in shell class" << endl; | 638 s << "// Functions in shell class" << endl; |
639 AbstractMetaFunctionList shellFunctions = java_class->nonVirtualShellFunctions(); | 639 AbstractMetaFunctionList shellFunctions = java_class->nonVirtualShellFunctions(); |
640 for (int i=0; i<shellFunctions.size(); ++i) { | 640 for (int i=0; i<shellFunctions.size(); ++i) { |
641 const AbstractMetaFunction *function = shellFunctions.at(i); | 641 const AbstractMetaFunction *function = shellFunctions.at(i); |
642 writeShellFunction(s, function, java_class, -1); | 642 writeShellFunction(s, function, java_class, -1); |
643 } | 643 } |
644 | 644 |
645 // Write public overrides for functions that are protected in the base class | 645 // Write public overrides for functions that are protected in the base class |
646 // so they can be accessed from the native callback | 646 // so they can be accessed from the native callback |
647 s << "// public overrides for functions that are protected in the base class" << endl; | 647 s << "// public overrides for functions that are protected in the base class" << endl; |
658 foreach (const AbstractMetaFunction *function, virtual_functions) { | 658 foreach (const AbstractMetaFunction *function, virtual_functions) { |
659 if(notWrappedYet(function)) | 659 if(notWrappedYet(function)) |
660 continue; | 660 continue; |
661 writeVirtualFunctionOverride(s, function, java_class); | 661 writeVirtualFunctionOverride(s, function, java_class); |
662 } | 662 } |
663 | 663 } |
664 } | 664 |
665 if (java_class->isQObject()) | |
666 writeSignalsHandling(s, java_class); | |
665 | 667 |
666 writeExtraFunctions(s, java_class); | 668 writeExtraFunctions(s, java_class); |
667 /* qtd2 | 669 /* qtd2 |
668 writeToStringFunction(s, java_class); | 670 writeToStringFunction(s, java_class); |
669 | 671 |
1256 << " return static_cast<void*>(const_cast<" << shellClassName(java_class) << "*>(this));" << endl | 1258 << " return static_cast<void*>(const_cast<" << shellClassName(java_class) << "*>(this));" << endl |
1257 << " return " << java_class->qualifiedCppName() << "::qt_metacast(_clname);" << endl | 1259 << " return " << java_class->qualifiedCppName() << "::qt_metacast(_clname);" << endl |
1258 << "}" << endl << endl; | 1260 << "}" << endl << endl; |
1259 */ | 1261 */ |
1260 | 1262 |
1261 writeSignalsHandling(s, java_class); | 1263 // writeSignalsHandling(s, java_class); |
1262 | 1264 /* |
1263 // QObject::qt_metacall() | 1265 // QObject_Link::qt_metacall() |
1264 s << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl | 1266 s << "int " << shellClassName(java_class) << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl |
1265 << "{" << endl; | 1267 << "{" << endl; |
1266 | 1268 |
1267 s << " _id = " << java_class->qualifiedCppName() << "::qt_metacall(_c, _id, _a);" << endl | 1269 s << " _id = " << java_class->qualifiedCppName() << "::qt_metacall(_c, _id, _a);" << endl |
1268 << " if (_id < 0 || _c != QMetaObject::InvokeMetaMethod)" << endl | 1270 << " if (_id < 0 || _c != QMetaObject::InvokeMetaMethod)" << endl |
1269 << " return _id;" << endl | 1271 << " return _id;" << endl |
1270 // << " Q_ASSERT(_id < 2);" << endl | 1272 // << " Q_ASSERT(_id < 2);" << endl |
1271 << " emit_callbacks_" << java_class->name() << "[_id](this->d_entity(), _a);" << endl | 1273 << " emit_callbacks_" << java_class->name() << "[_id](this->d_entity(), _a);" << endl |
1272 << " return -1;" << endl | 1274 << " return -1;" << endl |
1273 << "}" << endl << endl; | 1275 << "}" << endl << endl; |
1276 */ | |
1274 } | 1277 } |
1275 | 1278 |
1276 void CppImplGenerator::writeSignalHandler(QTextStream &s, const AbstractMetaClass *d_class, AbstractMetaFunction *function) | 1279 void CppImplGenerator::writeSignalHandler(QTextStream &s, const AbstractMetaClass *d_class, AbstractMetaFunction *function) |
1277 { | 1280 { |
1278 QString extra_args, extra_call_args, conversion_code; | 1281 QString extra_args, extra_call_args, conversion_code; |
1313 << INDENT << sig_name << "_handle_in_d(d_entity, args" << extra_call_args << ");" << endl | 1316 << INDENT << sig_name << "_handle_in_d(d_entity, args" << extra_call_args << ");" << endl |
1314 << "}" << endl; | 1317 << "}" << endl; |
1315 | 1318 |
1316 } | 1319 } |
1317 | 1320 |
1321 void CppImplGenerator::writeQObjectLink(QTextStream &s, const AbstractMetaClass *java_class) | |
1322 { | |
1323 QString linkName = java_class->name() + "_Link"; | |
1324 QString className = java_class->name(); | |
1325 s << "class " << linkName << " : public QObject, public QObjectUserData" << endl | |
1326 << "{" << endl | |
1327 << "public:" << endl | |
1328 << " Q_OBJECT_CHECK" << endl | |
1329 << " virtual int qt_metacall(QMetaObject::Call, int, void **);" << endl << endl | |
1330 | |
1331 << " " << linkName << "(QObject *parent, void *d_ptr) : QObject() { _d_ptr = d_ptr; }" << endl | |
1332 << " void *d_entity() const { return _d_ptr; }" << endl << endl | |
1333 | |
1334 << "private:" << endl | |
1335 << " void *_d_ptr;" << endl | |
1336 << "};" << endl << endl; | |
1337 | |
1338 // QObject_Link::qt_metacall() | |
1339 s << "int " << linkName << "::qt_metacall(QMetaObject::Call _c, int _id, void **_a)" << endl | |
1340 << "{" << endl | |
1341 << " _id = QObject::qt_metacall(_c, _id, _a);" << endl | |
1342 << " if (_id < 0 || _c != QMetaObject::InvokeMetaMethod)" << endl | |
1343 << " return _id;" << endl | |
1344 // << " Q_ASSERT(_id < 2);" << endl | |
1345 << " emit_callbacks_" << java_class->name() << "[_id](this->d_entity(), _a);" << endl | |
1346 << " return -1;" << endl | |
1347 << "}" << endl << endl; | |
1348 | |
1349 s << QString("inline %1_Link *get_%1_link(%1 *obj)").arg(className) << endl | |
1350 << "{" << endl | |
1351 << " return static_cast<" << linkName << "*>(obj->userData(USER_DATA_ID));" << endl | |
1352 << "}" << endl << endl; | |
1353 | |
1354 s << QString("extern \"C\" DLL_PUBLIC void* qtd_%1_d_pointer(%1 *obj)").arg(className) << endl | |
1355 << "{" << endl | |
1356 << " if (obj->userData(USER_DATA_ID)) {" << endl | |
1357 << " " << QString("%1_Link *qobj_helper = get_%1_link(obj);").arg(className) << endl | |
1358 << " return qobj_helper->d_entity();" << endl | |
1359 << " } else" << endl | |
1360 << " return NULL;" << endl | |
1361 << "}" << endl << endl; | |
1362 | |
1363 s << QString("extern \"C\" DLL_PUBLIC void qtd_%1_create_link(%1 *obj, void* d_obj)").arg(className) << endl | |
1364 << "{" << endl | |
1365 << " if(obj->userData(USER_DATA_ID))" << endl | |
1366 << " return;" << endl | |
1367 << " " << QString("%1 *qobj_link = new %1(obj, d_obj);").arg(linkName) << endl | |
1368 << " obj->setUserData(USER_DATA_ID, qobj_link);" << endl | |
1369 << "}" << endl << endl; | |
1370 } | |
1371 | |
1318 void CppImplGenerator::writeSignalsHandling(QTextStream &s, const AbstractMetaClass *java_class) | 1372 void CppImplGenerator::writeSignalsHandling(QTextStream &s, const AbstractMetaClass *java_class) |
1319 { | 1373 { |
1320 s << "extern \"C\" typedef void (*EmitCallback)(void*, void**);" << endl; | 1374 s << "extern \"C\" typedef void (*EmitCallback)(void*, void**);" << endl; |
1321 AbstractMetaFunctionList signal_funcs = signalFunctions(java_class); | 1375 AbstractMetaFunctionList signal_funcs = signalFunctions(java_class); |
1322 | 1376 |
1338 s << "&" << signalExternName(java_class, signal) << "_handle"; | 1392 s << "&" << signalExternName(java_class, signal) << "_handle"; |
1339 } | 1393 } |
1340 s << endl << "};" << endl << endl; | 1394 s << endl << "};" << endl << endl; |
1341 } | 1395 } |
1342 | 1396 |
1397 writeQObjectLink(s, java_class); | |
1398 | |
1343 // Functions connecting/disconnecting shell's slots | 1399 // Functions connecting/disconnecting shell's slots |
1344 for(int i = 0; i < signal_funcs.size(); i++) { | 1400 for(int i = 0; i < signal_funcs.size(); i++) { |
1345 AbstractMetaFunction *signal = signal_funcs.at(i); | 1401 AbstractMetaFunction *signal = signal_funcs.at(i); |
1346 QString sigExternName = signalExternName(java_class, signal); | 1402 QString sigExternName = signalExternName(java_class, signal); |
1347 | 1403 |
1348 s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_connect" | 1404 s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_connect" |
1349 << "(void* native_id)" << endl << "{" << endl | 1405 << "(void* native_id)" << endl << "{" << endl |
1350 << " " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl | 1406 << " " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl |
1351 << " const QMetaObject &mo = " << shellClassName(java_class) << "::staticMetaObject;" << endl | 1407 << " const QMetaObject &mo = " << java_class->name() << "::staticMetaObject;" << endl |
1408 << " const QMetaObject &mo2 = " << java_class->name() << "_Link::staticMetaObject;" << endl | |
1352 << " int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl | 1409 << " int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl |
1353 << " mo.connect(qobj, signalId, qobj, mo.methodCount() + " << i << ");" << endl | 1410 << " mo.connect(qobj, signalId, get_" << java_class->name() << "_link(qobj), mo2.methodCount() + " << i << ");" << endl |
1354 << "}" << endl; | 1411 << "}" << endl; |
1355 | 1412 |
1356 s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_disconnect" | 1413 s << "extern \"C\" DLL_PUBLIC void " << sigExternName << "_disconnect" |
1357 << "(void* native_id)" << endl << "{" << endl | 1414 << "(void* native_id)" << endl << "{" << endl |
1358 << " " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl | 1415 << " " << shellClassName(java_class) << " *qobj = (" << shellClassName(java_class) << "*) native_id;" << endl |
1359 << " const QMetaObject &mo = " << shellClassName(java_class) << "::staticMetaObject;" << endl | 1416 << " const QMetaObject &mo = " << shellClassName(java_class) << "::staticMetaObject;" << endl |
1417 << " const QMetaObject &mo2 = " << java_class->name() << "_Link::staticMetaObject;" << endl | |
1360 << " int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl | 1418 << " int signalId = mo.indexOfSignal(\"" << signal->minimalSignature() << "\");" << endl |
1361 << " mo.disconnect(qobj, signalId, qobj, mo.methodCount() + " << i << ");" << endl | 1419 << " mo.disconnect(qobj, signalId, get_" << java_class->name() << "_link(qobj), mo2.methodCount() + " << i << ");" << endl |
1362 << "}" << endl << endl; | 1420 << "}" << endl << endl; |
1363 } | 1421 } |
1364 } | 1422 } |
1365 | 1423 |
1366 | 1424 |