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