summaryrefslogtreecommitdiffstats
path: root/kalyptus/kalyptusCxxToJNI.pm
diff options
context:
space:
mode:
Diffstat (limited to 'kalyptus/kalyptusCxxToJNI.pm')
-rw-r--r--kalyptus/kalyptusCxxToJNI.pm5595
1 files changed, 5595 insertions, 0 deletions
diff --git a/kalyptus/kalyptusCxxToJNI.pm b/kalyptus/kalyptusCxxToJNI.pm
new file mode 100644
index 00000000..df45eb94
--- /dev/null
+++ b/kalyptus/kalyptusCxxToJNI.pm
@@ -0,0 +1,5595 @@
+#***************************************************************************
+# kalyptusCxxToJNI.pm - Generates *.java and *.cpp files for a JNI based
+# version of Qt/KDE java bindings
+# -------------------
+# begin : Sun Nov 16 12:00:00 2003
+# copyright : (C) 2003, Richard Dale. All Rights Reserved.
+# email : Richard_Dale@tipitina.demon.co.uk
+# author : Richard Dale, based on the SMOKE generation code
+# by David Faure.
+#***************************************************************************/
+
+#/***************************************************************************
+# * *
+# * This program is free software; you can redistribute it and/or modify *
+# * it under the terms of the GNU General Public License as published by *
+# * the Free Software Foundation; either version 2 of the License, or *
+# * (at your option) any later version. *
+# * *
+#***************************************************************************/
+
+package kalyptusCxxToJNI;
+
+use File::Path;
+use File::Basename;
+
+use Carp;
+use Ast;
+use kdocAstUtil;
+use kdocUtil;
+use Iter;
+use kalyptusDataDict;
+
+use strict;
+no strict "subs";
+
+use vars qw/
+ $libname $rootnode $outputdir $opt $debug
+ $qapplicationExtras $qapplicationjniExtras $qbitmapExtras $qbitmapjniExtras
+ $qlistviewExtras $qlistviewjniExtras $qlistviewitemExtras $qlistviewitemjniExtras
+ $qpopupmenujniExtras $qmenudatajniExtras $qmenubarjniExtras
+ $qdragobjectExtras $qdragobjectjniExtras $qdropeventExtras $qdropeventjniExtras $qmimesourceExtras $qmimesourcejniExtras
+ $qtExtras $qtjniExtras $qobjectExtras $qobjectjniExtras $qimagejniExtras $qwidgetExtras $qwidgetjniExtras
+ $qpixmapExtras $qpixmapjniExtras $qpaintdeviceExtras $qpaintdevicejniExtras
+ $qdragobjectExtras $qdragobjectjniExtras $qiodeviceExtras $qpointarrayExtras $qpointarrayjniExtras
+ $qtextcodecExtras $qtextcodecjniExtras $quridragExtras $quridragjniExtras
+ $kapplicationExtras $kapplicationjniExtras $kmainwindowExtras $kmainwindowjniExtras
+ $kcmdlineargsjniExtras $schedulerjniExtras
+ $methodNumber
+ %builtins %typeunion %allMethods %allTypes %enumValueToType %typedeflist %mungedTypeMap %javaImports
+ %skippedClasses %skippedJniMethods %operatorNames /;
+
+BEGIN
+{
+
+# Types supported by the StackItem union
+# Key: C++ type Value: Union field of that type
+%typeunion = (
+ 'void*' => 's_voidp',
+ 'bool' => 's_bool',
+ 'char' => 's_char',
+ 'uchar' => 's_uchar',
+ 'short' => 's_short',
+ 'ushort' => 's_ushort',
+ 'int' => 's_int',
+ 'uint' => 's_uint',
+ 'long' => 's_long',
+ 'ulong' => 's_ulong',
+ 'float' => 's_float',
+ 'double' => 's_double',
+ 'enum' => 's_enum',
+ 'class' => 's_class'
+);
+
+# Mapping for iterproto, when making up the munged method names
+%mungedTypeMap = (
+ 'QString' => '$',
+ 'QString*' => '$',
+ 'QString&' => '$',
+ 'QCString' => '$',
+ 'QCString*' => '$',
+ 'QCString&' => '$',
+ 'QByteArray' => '$',
+ 'QByteArray&' => '$',
+ 'QByteArray*' => '$',
+ 'char*' => '$',
+ 'QCOORD*' => '?',
+ 'QRgb*' => '?',
+);
+
+# Yes some of this is in kalyptusDataDict's ctypemap
+# but that one would need to be separated (builtins vs normal classes)
+%typedeflist =
+(
+ 'signed char' => 'char',
+ 'unsigned char' => 'uchar',
+ 'signed short' => 'short',
+ 'unsigned short' => 'ushort',
+ 'signed' => 'int',
+ 'signed int' => 'int',
+ 'unsigned' => 'uint',
+ 'unsigned int' => 'uint',
+ 'KIO::filesize_t' => 'long',
+ 'signed long' => 'long',
+ 'unsigned long' => 'ulong',
+
+# Anything that is not known is mapped to void*, so no need for those here anymore
+# 'QWSEvent*' => 'void*',
+# 'QDiskFont*' => 'void*',
+# 'XEvent*' => 'void*',
+# 'FILE*' => 'void*',
+# 'QUnknownInterface*' => 'void*',
+# 'GDHandle' => 'void*',
+# '_NPStream*' => 'void*',
+# 'QTextFormat*' => 'void*',
+# 'QTextDocument*' => 'void*',
+# 'QTextCursor*' => 'void*',
+# 'QTextParag**' => 'void*',
+# 'QTextParag*' => 'void*',
+# 'QRemoteInterface*' => 'void*',
+# 'QSqlRecordPrivate*' => 'void*',
+# 'QTSMFI' => 'void*', # QTextStream's QTSManip
+# 'const GUID&' => 'void*',
+# 'QWidgetMapper*' => 'void*',
+# 'MSG*' => 'void*',
+# 'const QSqlFieldInfoList&' => 'void*', # QSqlRecordInfo - TODO (templates)
+
+ 'QStyleHintReturn*' => 'void*',
+ 'QPtrCollection::Item' => 'void*', # to avoid a warning
+
+ 'mode_t' => 'long',
+ 'QProcess::PID' => 'long',
+ 'size_type' => 'int', # QSqlRecordInfo
+ 'Qt::ComparisonFlags' => 'uint',
+ 'Qt::ToolBarDock' => 'int', # compat thing, Qt shouldn't use it
+ 'QIODevice::Offset' => 'ulong',
+ 'WState' => 'int',
+ 'WId' => 'ulong',
+ 'QRgb' => 'uint',
+ 'ksocklen_t' => 'uint',
+ 'QCOORD' => 'int',
+ 'QTSMFI' => 'int',
+ 'Qt::WState' => 'int',
+ 'Qt::WFlags' => 'int',
+ 'Qt::HANDLE' => 'uint',
+ 'QEventLoop::ProcessEventsFlags' => 'uint',
+ 'QStyle::SCFlags' => 'int',
+ 'QStyle::SFlags' => 'int',
+ 'Q_INT16' => 'short',
+ 'Q_INT32' => 'int',
+ 'Q_INT64' => 'long',
+ 'Q_INT8' => 'char',
+ 'Q_LONG' => 'long',
+ 'Q_LLONG' => 'long',
+ 'Q_ULLONG' => 'long',
+ 'Q_UINT16' => 'ushort',
+ 'Q_UINT32' => 'uint',
+ 'Q_UINT64' => 'long',
+ 'Q_UINT8' => 'uchar',
+ 'Q_ULONG' => 'long',
+ 'pid_t' => 'int',
+ 'size_t' => 'int',
+ 'pid_t' => 'int',
+ 'time_t' => 'int',
+ 'short int' => 'short',
+ 'unsigned long long int' => 'ulong',
+ 'long long int' => 'long',
+ 'signed long int' => 'long',
+ 'unsigned long int' => 'ulong',
+ 'int long' => 'long',
+ 'unsigned short int' => 'ushort',
+);
+
+%operatorNames =
+(
+ 'operator^' => 'op_xor',
+ 'operator^=' => 'op_xor_assign',
+ 'operator<' => 'op_lt',
+ 'operator<<' => 'op_write',
+ 'operator<=' => 'op_lte',
+# 'operator=' => 'op_assign',
+ 'operator==' => 'op_equals',
+ 'operator>' => 'op_gt',
+ 'operator>=' => 'op_gte',
+ 'operator>>' => 'op_read',
+ 'operator|' => 'op_or',
+ 'operator|=' => 'op_or_assign',
+ 'operator-' => 'op_minus',
+ 'operator-=' => 'op_minus_assign',
+ 'operator--' => 'op_decr',
+ 'operator!' => 'op_not',
+ 'operator!=' => 'op_not_equals',
+ 'operator/' => 'op_div',
+ 'operator/=' => 'op_div_assign',
+ 'operator()' => 'op_expr',
+ 'operator[]' => 'op_at',
+ 'operator*' => 'op_mult',
+ 'operator*=' => 'op_mult_assign',
+ 'operator&' => 'op_and',
+ 'operator&=' => 'op_and_assign',
+ 'operator+' => 'op_plus',
+ 'operator+=' => 'op_plus_assign',
+ 'operator++' => 'op_incr',
+);
+
+%skippedJniMethods =
+(
+ 'Java_org_kde_qt_QApplication_newQApplication___3Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QApplication_newQApplication___3Ljava_lang_String_2Z' => 1,
+ 'Java_org_kde_qt_QApplication_newQApplication___3Ljava_lang_String_2I' => 1,
+ 'Java_org_kde_qt_QApplication_newQApplication___3I_3Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QApplication_newQApplication___3I_3Ljava_lang_String_2Z' => 1,
+ 'Java_org_kde_qt_QApplication_newQApplication___3I_3Ljava_lang_String_2I' => 1,
+ 'Java_org_kde_qt_QApplication_newQApplication__I_3Ljava_lang_String_2I' => 1,
+ 'Java_org_kde_qt_QApplication_newQApplication__I_3Ljava_lang_String_2Z' => 1,
+ 'Java_org_kde_qt_QApplication_newQApplication__I_3Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QApplication_args__' => 1,
+ 'Java_org_kde_qt_QBitmap_newQBitmap__Lorg_kde_qt_QPixmap_2' => 1,
+ 'Java_org_kde_qt_QBitmap_newQBitmap__Lorg_kde_qt_QImage_2' => 1,
+ 'Java_org_kde_qt_QListView_itemList' => 1,
+ 'Java_org_kde_qt_QListViewItem_itemList' => 1,
+ 'Java_org_kde_qt_Qt_color0' => 1,
+ 'Java_org_kde_qt_Qt_color1' => 1,
+ 'Java_org_kde_qt_Qt_black' => 1,
+ 'Java_org_kde_qt_Qt_white' => 1,
+ 'Java_org_kde_qt_Qt_darkGray' => 1,
+ 'Java_org_kde_qt_Qt_lightGray' => 1,
+ 'Java_org_kde_qt_Qt_gray' => 1,
+ 'Java_org_kde_qt_Qt_red' => 1,
+ 'Java_org_kde_qt_Qt_green' => 1,
+ 'Java_org_kde_qt_Qt_blue' => 1,
+ 'Java_org_kde_qt_Qt_cyan' => 1,
+ 'Java_org_kde_qt_Qt_magenta' => 1,
+ 'Java_org_kde_qt_Qt_yellow' => 1,
+ 'Java_org_kde_qt_Qt_darkRed' => 1,
+ 'Java_org_kde_qt_Qt_darkGreen' => 1,
+ 'Java_org_kde_qt_Qt_darkBlue' => 1,
+ 'Java_org_kde_qt_Qt_darkCyan' => 1,
+ 'Java_org_kde_qt_Qt_darkMagenta' => 1,
+ 'Java_org_kde_qt_Qt_darkYellow' => 1,
+ 'Java_org_kde_qt_Qt_arrowCursor' => 1,
+ 'Java_org_kde_qt_Qt_upArrowCursor' => 1,
+ 'Java_org_kde_qt_Qt_crossCursor' => 1,
+ 'Java_org_kde_qt_Qt_waitCursor' => 1,
+ 'Java_org_kde_qt_Qt_ibeamCursor' => 1,
+ 'Java_org_kde_qt_Qt_sizeVerCursor' => 1,
+ 'Java_org_kde_qt_Qt_sizeHorCursor' => 1,
+ 'Java_org_kde_qt_Qt_sizeBDiagCursor' => 1,
+ 'Java_org_kde_qt_Qt_sizeFDiagCursor' => 1,
+ 'Java_org_kde_qt_Qt_sizeAllCursor' => 1,
+ 'Java_org_kde_qt_Qt_blankCursor' => 1,
+ 'Java_org_kde_qt_Qt_splitVCursor' => 1,
+ 'Java_org_kde_qt_Qt_splitHCursor' => 1,
+ 'Java_org_kde_qt_Qt_pointingHandCursor' => 1,
+ 'Java_org_kde_qt_Qt_forbiddenCursor' => 1,
+ 'Java_org_kde_qt_Qt_qApp' => 1,
+ 'Java_org_kde_qt_Qt_qDebug' => 1,
+ 'Java_org_kde_qt_Qt_qWarning' => 1,
+ 'Java_org_kde_qt_Qt_qFatal' => 1,
+ 'Java_org_kde_qt_QObject_connect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QObject_connect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QObject_disconnect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QObject_disconnect__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QObject_emit' => 1,
+ 'Java_org_kde_qt_QWidget_paintDevice' => 1,
+ 'Java_org_kde_qt_QImage_bits__' => 1,
+ 'Java_org_kde_qt_QImage_colorTable__' => 1,
+ 'Java_org_kde_qt_QImage_scanLine__I' => 1,
+ 'Java_org_kde_qt_QPixmap_paintDevice' => 1,
+ 'Java_org_kde_qt_QPixmap_loadFromData___3C' => 1,
+ 'Java_org_kde_qt_QPaintDevice_paintDevice' => 1,
+ 'Java_org_kde_qt_QDragObject_mimeSource' => 1,
+ 'Java_org_kde_qt_QPointArray_point__I_3I_3I' => 1,
+ 'Java_org_kde_qt_QPointArray_setPoints__I_3S' => 1,
+ 'Java_org_kde_qt_QPointArray_putPoints__II_3S' => 1,
+ 'Java_org_kde_qt_QPointArray_count__' => 1,
+ 'Java_org_kde_qt_QPointArray_isEmpty__' => 1,
+ 'Java_org_kde_qt_QPointArray_isNull__' => 1,
+ 'Java_org_kde_qt_QPointArray_resize__' => 1,
+ 'Java_org_kde_qt_QPopupMenu_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QKeySequence_2II' => 1,
+ 'Java_org_kde_qt_QPopupMenu_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QPopupMenu_connectItem__ILorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QPopupMenu_disconnectItem__ILorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuData_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QKeySequence_2II' => 1,
+ 'Java_org_kde_qt_QMenuData_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuData_connectItem__ILorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuData_disconnectItem__ILorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuBar_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QKeySequence_2II' => 1,
+ 'Java_org_kde_qt_QMenuBar_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuBar_connectItem__ILorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QMenuBar_disconnectItem__ILorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QUriDrag_decode__Lorg_kde_qt_QMimeSourceInterface_2_3Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QUriDrag_decodeToUnicodeUris__Lorg_kde_qt_QMimeSourceInterface_2_3Ljava_lang_String_2' => 1,
+ 'Java_org_kde_qt_QUriDrag_decodeLocalFiles__Lorg_kde_qt_QMimeSourceInterface_2_3Ljava_lang_String_2' => 1,
+ 'Java_org_kde_koala_KApplication_setJavaSlotFactory' => 1,
+ 'Java_org_kde_koala_KMainWindow_memberList' => 1,
+ 'Java_org_kde_koala_KCmdLineArgs_init__I_3Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_koala_KCmdLineArgs_init__I_3Ljava_lang_String_2Lorg_kde_koala_KAboutData_2' => 1,
+ 'Java_org_kde_koala_KCmdLineArgs_init__I_3Ljava_lang_String_2Lorg_kde_koala_KAboutData_2Z' => 1,
+ 'Java_org_kde_koala_KCmdLineArgs_init__I_3Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Z' => 1,
+ 'Java_org_kde_koala_Scheduler_connect__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_koala_Scheduler_connect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_koala_Scheduler_disconnect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2' => 1,
+ 'Java_org_kde_koala_Scheduler_disconnect' => 1,
+);
+
+ $qapplicationExtras = <<EOF;
+ public native String[] args();
+
+EOF
+
+ $qapplicationjniExtras = <<EOF;
+static jobjectArray _args = 0;
+
+JNIEXPORT void JNICALL
+Java_org_kde_qt_QApplication_newQApplication___3Ljava_lang_String_2(JNIEnv *env, jobject obj, jobjectArray args)
+{
+ int argc = (int) env->GetArrayLength(args) + 1;
+ _args = (jobjectArray) env->NewGlobalRef(args);
+ if (QtSupport::getQt(env, obj) == 0) {
+ QtSupport::setQt(env, obj, new QApplicationJBridge(argc, QtSupport::toArgv(env, args)));
+ QtSupport::setObjectForQtKey(env, obj, QtSupport::getQt(env, obj));
+ }
+ return;
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_qt_QApplication_newQApplication___3Ljava_lang_String_2Z(JNIEnv *env, jobject obj, jobjectArray args, jboolean GUIenabled)
+{
+ int argc = (int) env->GetArrayLength(args) + 1;
+ _args = (jobjectArray) env->NewGlobalRef(args);
+ if (QtSupport::getQt(env, obj) == 0) {
+ QtSupport::setQt(env, obj, new QApplicationJBridge(argc, QtSupport::toArgv(env, args), (bool) GUIenabled));
+ QtSupport::setObjectForQtKey(env, obj, QtSupport::getQt(env, obj));
+ }
+ return;
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_qt_QApplication_newQApplication___3Ljava_lang_String_2I(JNIEnv *env, jobject obj, jobjectArray args, jint arg1)
+{
+ int argc = (int) env->GetArrayLength(args) + 1;
+ _args = (jobjectArray) env->NewGlobalRef(args);
+ if (QtSupport::getQt(env, obj) == 0) {
+ QtSupport::setQt(env, obj, new QApplicationJBridge(argc, QtSupport::toArgv(env, args), (QApplication::Type) arg1));
+ QtSupport::setObjectForQtKey(env, obj, QtSupport::getQt(env, obj));
+ }
+ return;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_org_kde_qt_QApplication_args(JNIEnv *env, jobject obj)
+{
+ (void) env;
+ (void) obj;
+ return _args;
+}
+
+EOF
+
+ $qbitmapExtras = <<EOF;
+ public QBitmap(QPixmap arg1) {
+ super((Class) null);
+ newQBitmap(arg1);
+ }
+ private native void newQBitmap(QPixmap arg1);
+ public QBitmap(QImage arg1) {
+ super((Class) null);
+ newQBitmap(arg1);
+ }
+ private native void newQBitmap(QImage arg1);
+
+EOF
+
+ $qbitmapjniExtras = <<EOF;
+JNIEXPORT void JNICALL
+Java_org_kde_qt_QBitmap_newQBitmap__Lorg_kde_qt_QPixmap_2(JNIEnv *env, jobject obj, jobject arg1)
+{
+ if (QtSupport::getQt(env, obj) == 0) {
+ QBitmap temp;
+ temp = (QPixmap&) *(QPixmap *) QtSupport::getQt(env, arg1);
+ QtSupport::setQt(env, obj, new QBitmapJBridge(temp));
+ QtSupport::setObjectForQtKey(env, obj, QtSupport::getQt(env, obj));
+ }
+ return;
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_qt_QBitmap_newQBitmap__Lorg_kde_qt_QImage_2(JNIEnv *env, jobject obj, jobject arg1)
+{
+ if (QtSupport::getQt(env, obj) == 0) {
+ QBitmap temp;
+ temp = (QImage&) *(QImage *) QtSupport::getQt(env, arg1);
+ QtSupport::setQt(env, obj, new QBitmapJBridge(temp));
+ QtSupport::setObjectForQtKey(env, obj, QtSupport::getQt(env, obj));
+ }
+ return;
+}
+
+EOF
+
+ $qlistviewExtras = <<EOF;
+ public native ArrayList itemList();
+
+EOF
+
+ $qlistviewjniExtras = <<EOF;
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_QListView_itemList(JNIEnv *env, jobject obj)
+{
+ QListViewItemIterator iterator((QListView*) QtSupport::getQt(env, obj));
+ return QtSupport::arrayWithQListViewItemList(env, &iterator);
+}
+
+EOF
+ $qlistviewitemExtras = <<EOF;
+ public native ArrayList itemList();
+
+EOF
+
+ $qlistviewitemjniExtras = <<EOF;
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_QListViewItem_itemList(JNIEnv *env, jobject obj)
+{
+ QListViewItemIterator iterator((QListViewItem*) QtSupport::getQt(env, obj));
+ return QtSupport::arrayWithQListViewItemList(env, &iterator);
+}
+
+EOF
+
+ $qtExtras = <<EOF;
+ /** This member allows a typecast of an instance which wraps a Qt instance,
+ to a more specialized type. Invokes the private qtjava.dynamicCast()
+ via reflection, as that method isn't part of the public Qt api */
+ public static QtSupport dynamicCast(String type, QtSupport source) {
+ Method method = null;
+
+ try {
+ method = qtjava.class.getDeclaredMethod( "dynamicCast",
+ new Class[] { String.class, QtSupport.class } );
+ } catch (NoSuchMethodException e1) {
+ Qt.qWarning("No such method : qtjava.dynamicCast()");
+ }
+
+ try {
+ method.setAccessible(true);
+ Object result = method.invoke(qtjava.class, new Object[] { type, source } );
+ return (QtSupport) result;
+ } catch (InvocationTargetException e) {
+ Qt.qWarning("Invocation failed : qtjava.dynamicCast()");
+ return null;
+ } catch (IllegalAccessException e) {
+ Qt.qWarning("Invocation failed : qtjava.dynamicCast()");
+ return null;
+ }
+ }
+
+ public static native QColor color0();
+ public static native QColor color1();
+ public static native QColor black();
+ public static native QColor white();
+ public static native QColor darkGray();
+ public static native QColor gray();
+ public static native QColor lightGray();
+ public static native QColor red();
+ public static native QColor green();
+ public static native QColor blue();
+ public static native QColor cyan();
+ public static native QColor magenta();
+ public static native QColor yellow();
+ public static native QColor darkRed();
+ public static native QColor darkGreen();
+ public static native QColor darkBlue();
+ public static native QColor darkCyan();
+ public static native QColor darkMagenta();
+ public static native QColor darkYellow();
+
+ // Global cursors
+
+ public static native QCursor arrowCursor(); // standard arrow cursor
+ public static native QCursor upArrowCursor(); // upwards arrow
+ public static native QCursor crossCursor(); // crosshair
+ public static native QCursor waitCursor(); // hourglass/watch
+ public static native QCursor ibeamCursor(); // ibeam/text entry
+ public static native QCursor sizeVerCursor(); // vertical resize
+ public static native QCursor sizeHorCursor(); // horizontal resize
+ public static native QCursor sizeBDiagCursor(); // diagonal resize (/)
+ public static native QCursor sizeFDiagCursor(); // diagonal resize (\)
+ public static native QCursor sizeAllCursor(); // all directions resize
+ public static native QCursor blankCursor(); // blank/invisible cursor
+ public static native QCursor splitVCursor(); // vertical bar with left-right
+ // arrows
+ public static native QCursor splitHCursor(); // horizontal bar with up-down
+ // arrows
+ public static native QCursor pointingHandCursor(); // pointing hand
+ public static native QCursor forbiddenCursor(); // forbidden cursor (slashed circle)
+ public static native QCursor whatsThisCursor(); // arrow with a question mark
+
+ public static native QApplication qApp();
+
+ public static native void qDebug(String message);
+ public static void qDebug(String pattern, Object[] arguments) {
+ qDebug(MessageFormat.format(pattern, arguments));
+ }
+
+ public static native void qWarning(String message);
+ public static void qWarning(String pattern, Object[] arguments) {
+ qWarning(MessageFormat.format(pattern, arguments));
+ }
+
+ public static native void qFatal(String message);
+ public static void qFatal(String pattern, Object[] arguments) {
+ qFatal(MessageFormat.format(pattern, arguments));
+ }
+
+ private static String sqeezeOut(String from, char toss) {
+ char[] chars = from.toCharArray();
+ int len = chars.length;
+ int put = 0;
+
+ for (int i = 0; i < len; i++) {
+ if (chars[i] != toss) {
+ chars[put++] = chars[i];
+ }
+ }
+
+ return new String(chars, 0, put);
+ }
+
+ /** Prepend a '2' to a signal string and remove any spaces */
+ public static String SIGNAL(String signal) {
+ return "2" + sqeezeOut(signal, ' ');
+ }
+
+ /** Prepend a '1' to a slot string and remove any spaces */
+ public static String SLOT(String slot) {
+ return "1" + sqeezeOut(slot, ' ');
+ }
+
+ /** Convert from a UTF-8 string to Unicode - the java equivalent to QString::fromUtf8() */
+ public String fromUtf8(byte[] bytes) {
+ String result = null;
+
+ try {
+ result = new String(bytes, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ qWarning("UTF-8 encoding not supported");
+ } finally {
+ return result;
+ }
+ }
+
+EOF
+
+ $qtjniExtras = <<EOF;
+#include <qapplication.h>
+#include <qstring.h>
+#include <qcstring.h>
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_color0(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::color0, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_color1(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::color1, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_black(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::black, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_white(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::white, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_darkGray(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::darkGray, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_lightGray(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::lightGray, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_gray(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::gray, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_red(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::red, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_green(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::green, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_blue(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::blue, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_cyan(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::cyan, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_magenta(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::magenta, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_yellow(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::yellow, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_darkRed(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::darkRed, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_darkGreen(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::darkGreen, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_darkBlue(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::darkBlue, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_darkCyan(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::darkCyan, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_darkMagenta(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::darkMagenta, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_darkYellow(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::darkYellow, "org.kde.qt.QColor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_arrowCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::arrowCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_upArrowCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::upArrowCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_crossCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::crossCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_waitCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::waitCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_ibeamCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::ibeamCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_sizeVerCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::sizeVerCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_sizeHorCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::sizeHorCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_sizeBDiagCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::sizeBDiagCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_sizeFDiagCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::sizeFDiagCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_sizeAllCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::sizeAllCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_blankCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::blankCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_splitVCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::splitVCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_splitHCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::splitHCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_pointingHandCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::pointingHandCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_forbiddenCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::forbiddenCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_whatsThisCursor(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, (void*)&Qt::whatsThisCursor, "org.kde.qt.QCursor");
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_Qt_qApp(JNIEnv* env, jclass cls)
+{
+ (void) cls;
+ return (jobject) QtSupport::objectForQtKey(env, qApp, "org.kde.qt.QApplication");
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_qt_Qt_qDebug(JNIEnv* env, jclass cls, jstring message)
+{
+static QCString * _qstring_message = 0;
+ (void) cls;
+ qDebug("%s", (const char *) QtSupport::toCharString(env, message, &_qstring_message));
+ return;
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_qt_Qt_qWarning(JNIEnv* env, jclass cls, jstring message)
+{
+static QCString * _qstring_message = 0;
+ (void) cls;
+ qWarning("%s", (const char *) QtSupport::toCharString(env, message, &_qstring_message));
+ return;
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_qt_Qt_qFatal(JNIEnv* env, jclass cls, jstring message)
+{
+static QCString * _qstring_message = 0;
+ (void) cls;
+ qFatal("%s", (const char *) QtSupport::toCharString(env, message, &_qstring_message));
+ return;
+}
+
+EOF
+
+ $qobjectExtras = <<EOF;
+ /** i18n() is just a synonym of tr() for now */
+ public static String i18n(String s) {
+ return tr(s);
+ }
+
+ public native void emit(String signal, Object[] args);
+
+ protected void emit(String signal) {
+ Object[] args = new Object[0];
+ emit("2" + signal.trim() + "()", args);
+ }
+
+ protected void emit(String signal, Object value) {
+ Object[] args = new Object[1];
+ args[0] = value;
+ emit("2" + signal.trim() + "(" + value.getClass().getName() + ")", args);
+ }
+
+ protected void emit(String signal, Object value1, Object value2) {
+ Object[] args = new Object[2];
+ args[0] = value1;
+ args[1] = value2;
+ emit("2" + signal.trim() + "(" + value1.getClass().getName() + ","
+ + value2.getClass().getName()
+ + ")", args);
+ }
+
+ protected void emit(String signal, Object value1, Object value2, Object value3) {
+ Object[] args = new Object[3];
+ args[0] = value1;
+ args[1] = value2;
+ args[2] = value3;
+ emit("2" + signal.trim() + "(" + value1.getClass().getName() + ","
+ + value2.getClass().getName() + ","
+ + value3.getClass().getName()
+ + ")", args);
+ }
+
+ protected void emit(String signal, Object value1, Object value2, Object value3, Object value4) {
+ Object[] args = new Object[4];
+ args[0] = value1;
+ args[1] = value2;
+ args[2] = value3;
+ args[3] = value4;
+ emit("2" + signal.trim() + "(" + value1.getClass().getName() + ","
+ + value2.getClass().getName() + ","
+ + value3.getClass().getName() + ","
+ + value4.getClass().getName()
+ + ")", args);
+ }
+
+ protected void emit(String signal, boolean value) {
+ Object[] args = new Object[1];
+ args[0] = new Boolean(value);
+ emit("2" + signal.trim() + "(boolean)", args);
+ }
+
+ protected void emit(String signal, char value) {
+ Object[] args = new Object[1];
+ args[0] = new Character(value);
+ emit("2" + signal.trim() + "(char)", args);
+ }
+
+ protected void emit(String signal, byte value) {
+ Object[] args = new Object[1];
+ args[0] = new Byte(value);
+ emit("2" + signal.trim() + "(byte)", args);
+ }
+
+ protected void emit(String signal, short value) {
+ Object[] args = new Object[1];
+ args[0] = new Short(value);
+ emit("2" + signal.trim() + "(short)", args);
+ }
+
+ protected void emit(String signal, int value) {
+ Object[] args = new Object[1];
+ args[0] = new Integer(value);
+ emit("2" + signal.trim() + "(int)", args);
+ }
+
+ protected void emit(String signal, int value1, int value2) {
+ Object[] args = new Object[2];
+ args[0] = new Integer(value1);
+ args[1] = new Integer(value2);
+ emit("2" + signal.trim() + "(int,int)", args);
+ }
+
+ protected void emit(String signal, Object value1, int value2) {
+ Object[] args = new Object[2];
+ args[0] = value1;
+ args[1] = new Integer(value2);
+ emit("2" + signal.trim() + "(" + value1.getClass().getName() + ","
+ + "int"
+ + ")", args);
+ }
+
+ protected void emit(String signal, int value1, int value2, int value3) {
+ Object[] args = new Object[3];
+ args[0] = new Integer(value1);
+ args[1] = new Integer(value2);
+ args[2] = new Integer(value3);
+ emit("2" + signal.trim() + "(int,int,int)", args);
+ }
+
+ protected void emit(String signal, int value1, int value2, int value3, Object value4) {
+ Object[] args = new Object[4];
+ args[0] = new Integer(value1);
+ args[1] = new Integer(value2);
+ args[2] = new Integer(value3);
+ args[3] = value4;
+ emit("2" + signal.trim() + "(int,int,int," + value4.getClass().getName() + ")", args);
+ }
+
+ protected void emit(String signal, int value1, Object value2, Object value3) {
+ Object[] args = new Object[3];
+ args[0] = new Integer(value1);
+ args[1] = value2;
+ args[2] = value3;
+ emit("2" + signal.trim() + "(int,"
+ + value2.getClass().getName() + ","
+ + value3.getClass().getName()
+ + ")", args);
+ }
+
+ protected void emit(String signal, int value1, Object value2, Object value3, int value4) {
+ Object[] args = new Object[4];
+ args[0] = new Integer(value1);
+ args[1] = value2;
+ args[2] = value3;
+ args[3] = new Integer(value4);
+ emit("2" + signal.trim() + "(int,"
+ + value2.getClass().getName() + ","
+ + value3.getClass().getName()
+ + ",int)", args);
+ }
+
+ protected void emit(String signal, int value1, boolean value2) {
+ Object[] args = new Object[2];
+ args[0] = new Integer(value1);
+ args[1] = new Boolean(value2);
+ emit("2" + signal.trim() + "(int,boolean)", args);
+ }
+
+ protected void emit(String signal, long value) {
+ Object[] args = new Object[1];
+ args[0] = new Long(value);
+ emit("2" + signal.trim() + "(long)", args);
+ }
+
+ protected void emit(String signal, float value) {
+ Object[] args = new Object[1];
+ args[0] = new Float(value);
+ emit("2" + signal.trim() + "(float)", args);
+ }
+
+ protected void emit(String signal, double value) {
+ Object[] args = new Object[1];
+ args[0] = new Double(value);
+ emit("2" + signal.trim() + "(double)", args);
+ }
+
+ protected void emit(String signal, Object value1, int value2, int value3) {
+ Object[] args = new Object[3];
+ args[0] = value1;
+ args[1] = new Integer(value2);
+ args[2] = new Integer(value3);
+ emit("2" + signal.trim() + "(" + value1.getClass().getName() + ",int,int)", args);
+ }
+
+EOF
+
+ $qobjectjniExtras = <<EOF;
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QObject_connect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv* env, jclass cls, jobject sender, jstring signal, jobject receiver, jstring member)
+{
+ (void) cls;
+ return (jboolean) QtSupport::connect(env, sender, signal, receiver, member);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QObject_connect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Ljava_lang_String_2(JNIEnv* env, jobject obj, jobject sender, jstring signal, jstring member)
+{
+ return (jboolean) QtSupport::connect(env, sender, signal, obj, member);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QObject_disconnect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jclass cls, jobject sender, jstring signal, jobject receiver, jstring member)
+{
+ (void) cls;
+ return (jboolean) QtSupport::disconnect(env, sender, signal, receiver, member);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QObject_disconnect__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv* env, jobject obj, jstring signal, jobject receiver, jstring member)
+{
+ return (jboolean) QtSupport::disconnect(env, obj, signal, receiver, member);
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_qt_QObject_emit(JNIEnv* env, jobject obj, jstring signal, jobjectArray args)
+{
+ QtSupport::emitJavaSignal(env, obj, signal, args);
+ return;
+}
+
+EOF
+
+ $qwidgetExtras = <<EOF;
+ /** Internal method */
+ protected native long paintDevice();
+
+EOF
+
+ $qwidgetjniExtras = <<EOF;
+JNIEXPORT jlong JNICALL
+Java_org_kde_qt_QWidget_paintDevice(JNIEnv* env, jobject obj)
+{
+ return (jlong) (QPaintDevice*)(QWidget*) QtSupport::getQt(env, obj);
+}
+
+EOF
+
+ $qimagejniExtras = <<EOF;
+JNIEXPORT jbyteArray JNICALL
+Java_org_kde_qt_QImage_bits(JNIEnv *env, jobject obj)
+{
+static uchar * ptr = 0;
+ ptr = ((QImageJBridge*) QtSupport::getQt(env, obj))->bits();
+ int len = ((QImageJBridge*) QtSupport::getQt(env, obj))->numBytes();
+ jbyteArray result = env->NewByteArray(len);
+ env->SetByteArrayRegion(result, 0, len, (jbyte *) ptr);
+ return result;
+}
+
+JNIEXPORT jbyteArray JNICALL
+Java_org_kde_qt_QImage_scanLine(JNIEnv *env, jobject obj, jint arg1)
+{
+static uchar * ptr = 0;
+ ptr = ((QImageJBridge*) QtSupport::getQt(env, obj))->scanLine(arg1);
+ int len = ((QImageJBridge*) QtSupport::getQt(env, obj))->numBytes() / ((QImageJBridge*) QtSupport::getQt(env, obj))->height();
+ jbyteArray result = env->NewByteArray(len);
+ env->SetByteArrayRegion(result, 0, len, (jbyte *) ptr);
+ return result;
+}
+
+JNIEXPORT jintArray JNICALL
+Java_org_kde_qt_QImage_colorTable(JNIEnv *env, jobject obj)
+{
+static QRgb * ptr = 0;
+ ptr = ((QImageJBridge*) QtSupport::getQt(env, obj))->colorTable();
+ int len = ((QImageJBridge*) QtSupport::getQt(env, obj))->numColors();
+ jintArray result = env->NewIntArray(len);
+ env->SetIntArrayRegion(result, 0, len, (jint *) ptr);
+ return result;
+}
+
+EOF
+
+ $qpixmapExtras = <<EOF;
+ public native boolean loadFromData(char[] data);
+
+ /** Internal method */
+ protected native long paintDevice();
+
+EOF
+
+ $qpixmapjniExtras = <<EOF;
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPixmap_loadFromData___3C(JNIEnv *env, jobject obj, jcharArray data)
+{
+static QByteArray * _qbyteArray_data = 0;
+ return (jboolean) ((QPixmapJBridge*) QtSupport::getQt(env, obj))->loadFromData((uchar *) QtSupport::toUcharArray(env, data, &_qbyteArray_data), env->GetArrayLength(data), 0, 0);
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_kde_qt_QPixmap_paintDevice(JNIEnv* env, jobject obj)
+{
+ return (jlong) (QPaintDevice*)(QPixmap*) QtSupport::getQt(env, obj);
+}
+
+EOF
+
+ $qpaintdeviceExtras = <<EOF;
+ /** Internal method */
+ protected native long paintDevice();
+
+EOF
+
+ $qpaintdevicejniExtras = <<EOF;
+JNIEXPORT jlong JNICALL
+Java_org_kde_qt_QPaintDevice_paintDevice(JNIEnv* env, jobject obj)
+{
+ return (jlong) (QPaintDevice *) QtSupport::getQt(env, obj);
+}
+
+EOF
+
+ $qdragobjectExtras = <<EOF;
+ /** Internal method */
+ protected native long mimeSource();
+
+EOF
+
+ $qdragobjectjniExtras = <<EOF;
+JNIEXPORT jlong JNICALL
+Java_org_kde_qt_QDragObject_mimeSource(JNIEnv* env, jobject obj)
+{
+ return (jlong) (QMimeSource*) (QDragObject*) QtSupport::getQt(env, obj);
+}
+
+EOF
+
+ $qdropeventExtras = <<EOF;
+ /** Internal method */
+ protected native long mimeSource();
+
+EOF
+
+ $qdropeventjniExtras = <<EOF;
+JNIEXPORT jlong JNICALL
+Java_org_kde_qt_QDropEvent_mimeSource(JNIEnv* env, jobject obj)
+{
+ return (jlong) (QMimeSource*) (QDropEvent*) QtSupport::getQt(env, obj);
+}
+
+EOF
+
+ $qmimesourceExtras = <<EOF;
+ /** Internal method */
+ protected native long mimeSource();
+
+EOF
+
+ $qmimesourcejniExtras = <<EOF;
+JNIEXPORT jlong JNICALL
+Java_org_kde_qt_QMimeSource_mimeSource(JNIEnv* env, jobject obj)
+{
+ return (jlong) (QMimeSource *) QtSupport::getQt(env, obj);
+}
+
+EOF
+
+ $qiodeviceExtras = <<EOF;
+ public static final int IO_Direct = 0x0100; // direct access device
+ public static final int IO_Sequential = 0x0200; // sequential access device
+ public static final int IO_Combined = 0x0300; // combined direct/sequential
+ public static final int IO_TypeMask = 0x0f00;
+
+// IO handling modes
+
+ public static final int IO_Raw = 0x0040; // raw access (not buffered)
+ public static final int IO_Async = 0x0080; // asynchronous mode
+
+// IO device open modes
+
+ public static final int IO_ReadOnly = 0x0001; // readable device
+ public static final int IO_WriteOnly = 0x0002; // writable device
+ public static final int IO_ReadWrite = 0x0003; // read+write device
+ public static final int IO_Append = 0x0004; // append
+ public static final int IO_Truncate = 0x0008; // truncate device
+ public static final int IO_Translate = 0x0010; // translate CR+LF
+ public static final int IO_ModeMask = 0x00ff;
+
+// IO device state
+
+ public static final int IO_Open = 0x1000; // device is open
+ public static final int IO_StateMask = 0xf000;
+
+
+// IO device status
+
+ public static final int IO_Ok = 0;
+ public static final int IO_ReadError = 1; // read error
+ public static final int IO_WriteError = 2; // write error
+ public static final int IO_FatalError = 3; // fatal unrecoverable error
+ public static final int IO_ResourceError = 4; // resource limitation
+ public static final int IO_OpenError = 5; // cannot open device
+ public static final int IO_ConnectError = 5; // cannot connect to device
+ public static final int IO_AbortError = 6; // abort error
+ public static final int IO_TimeOutError = 7; // time out
+ public static final int IO_UnspecifiedError = 8; // unspecified error
+
+EOF
+
+ $qpointarrayExtras = <<EOF;
+ public native int size();
+ public native int count();
+ public native boolean isEmpty();
+ public native boolean isNull();
+ public native boolean resize( int size);
+ public native boolean truncate( int pos);
+ public native int begin();
+ public native int end();
+ public native QPoint at(int index);
+
+EOF
+
+ $qpointarrayjniExtras = <<EOF;
+JNIEXPORT void JNICALL
+Java_org_kde_qt_QPointArray_point__I_3I_3I(JNIEnv *env, jobject obj, jint i, jintArray x, jintArray y)
+{
+ int argx;
+ int argy;
+ ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->point((uint) i, &argx, &argy);
+ env->SetIntArrayRegion(x, 0, 1, (jint *) &argx);
+ env->SetIntArrayRegion(y, 0, 1, (jint *) &argy);
+ return;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPointArray_setPoints(JNIEnv *env, jobject obj, jint nPoints, jshortArray points)
+{
+ if (!((QPointArrayJBridge*) QtSupport::getQt(env, obj))->resize((uint)nPoints)) {
+ return JNI_FALSE;
+ }
+
+ short * shortArray = QtSupport::toShortPtr(env, points);
+ for (int index = 0; index < nPoints; index++) {
+ ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->setPoint(index, shortArray[index * 2], shortArray[(index * 2) + 1]);
+ }
+ return JNI_TRUE;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPointArray_putPoints__II_3S(JNIEnv *env, jobject obj, jint index, jint nPoints, jshortArray points)
+{
+ if ( ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->size() < (uint) nPoints
+ && !((QPointArrayJBridge*) QtSupport::getQt(env, obj))->resize((uint) nPoints) )
+ {
+ return JNI_FALSE;
+ }
+
+ short * shortArray = QtSupport::toShortPtr(env, points);
+ for (int i = (int) index; nPoints > 0; i++, nPoints--) {
+ ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->setPoint(i, shortArray[i * 2], shortArray[(i * 2) + 1]);
+ }
+ return JNI_TRUE;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QPointArray_size(JNIEnv* env, jobject obj)
+{
+ return (jint) ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->size();
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QPointArray_count(JNIEnv* env, jobject obj)
+{
+ return (jint) ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->count();
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPointArray_isEmpty(JNIEnv* env, jobject obj)
+{
+ return (jboolean) ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->isEmpty();
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPointArray_isNull(JNIEnv* env, jobject obj)
+{
+ return (jboolean) ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->isNull();
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPointArray_resize(JNIEnv* env, jobject obj, jint size)
+{
+ return (jboolean) ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->resize((uint) size);
+}
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPointArray_truncate(JNIEnv *env, jobject obj, jint pos)
+{
+ return (jboolean) ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->truncate((uint) pos);
+}
+
+JNIEXPORT jobject JNICALL
+Java_org_kde_qt_QPointArray_at(JNIEnv * env, jobject obj, jint index)
+{
+ QPoint _p= ((QPointArrayJBridge*) QtSupport::getQt(env, obj))->at((uint) index);
+ return (jobject) QtSupport::objectForQtKey(env, (void *)new QPoint(_p.x(),_p.y()), "org.kde.qt.QPoint", TRUE);
+}
+
+EOF
+
+ $qpopupmenujniExtras = <<EOF;
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QPopupMenu_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QKeySequence_2II(JNIEnv *env, jobject obj, jstring text, jobject receiver, jstring member, jobject accel, jint identifier, jint index)
+{
+ identifier = Java_org_kde_qt_QPopupMenu_insertItem__Ljava_lang_String_2II(env, obj, text, identifier, index);
+
+ if ((bool) Java_org_kde_qt_QPopupMenu_connectItem(env, obj, identifier, receiver, member)) {
+ Java_org_kde_qt_QPopupMenu_setAccel(env, obj, accel, identifier);
+ }
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QPopupMenu_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jstring text, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QPopupMenu_insertItem__Ljava_lang_String_2II(env, obj, text, -1, -1);
+ Java_org_kde_qt_QPopupMenu_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject icon, jstring text, jobject receiver, jstring member)
+{
+static QString * _qstring_text = 0;
+ jint identifier = Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2II(env, obj, icon, text, -1, -1);
+ Java_org_kde_qt_QPopupMenu_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject pixmap, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QPixmap_2II(env, obj, pixmap, -1, -1);
+ Java_org_kde_qt_QPopupMenu_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject icon, jobject pixmap, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QPopupMenu_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2II(env, obj, icon, pixmap, -1, -1);
+ Java_org_kde_qt_QPopupMenu_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPopupMenu_connectItem(JNIEnv *env, jobject obj, jint identifier, jobject receiver, jstring member)
+{
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, member);
+
+ if ( ((QPopupMenuJBridge*) QtSupport::getQt(env, obj))->connectItem( identifier,
+ javaSlot,
+ javaSlot->javaToQtSlotName(env, member) ) )
+ {
+ return(jboolean) JNI_TRUE;
+ } else {
+ return (jboolean) JNI_FALSE;
+ }
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QPopupMenu_disconnectItem(JNIEnv *env, jobject obj, jint identifier, jobject receiver, jstring member)
+{
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, member);
+
+ if ( ((QPopupMenuJBridge*) QtSupport::getQt(env, obj))->disconnectItem( identifier,
+ javaSlot,
+ javaSlot->javaToQtSlotName(env, member) ) )
+ {
+ return(jboolean) JNI_TRUE;
+ } else {
+ return (jboolean) JNI_FALSE;
+ }
+}
+
+EOF
+
+ $qmenudatajniExtras = <<EOF;
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuData_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QKeySequence_2II(JNIEnv *env, jobject obj, jstring text, jobject receiver, jstring member, jobject accel, jint identifier, jint index)
+{
+ identifier = Java_org_kde_qt_QMenuData_insertItem__Ljava_lang_String_2II(env, obj, text, identifier, index);
+
+ if ((bool) Java_org_kde_qt_QMenuData_connectItem(env, obj, identifier, receiver, member)) {
+ Java_org_kde_qt_QMenuData_setAccel(env, obj, accel, identifier);
+ }
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuData_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jstring text, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QMenuData_insertItem__Ljava_lang_String_2II(env, obj, text, -1, -1);
+ Java_org_kde_qt_QMenuData_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject icon, jstring text, jobject receiver, jstring member)
+{
+static QString * _qstring_text = 0;
+ jint identifier = Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2II(env, obj, icon, text, -1, -1);
+ Java_org_kde_qt_QMenuData_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject pixmap, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QPixmap_2II(env, obj, pixmap, -1, -1);
+ Java_org_kde_qt_QMenuData_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject icon, jobject pixmap, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QMenuData_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2II(env, obj, icon, pixmap, -1, -1);
+ Java_org_kde_qt_QMenuData_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QMenuData_connectItem(JNIEnv *env, jobject obj, jint identifier, jobject receiver, jstring member)
+{
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, member);
+
+ if ( ((QMenuDataJBridge*) QtSupport::getQt(env, obj))->connectItem( identifier,
+ javaSlot,
+ javaSlot->javaToQtSlotName(env, member) ) )
+ {
+ return(jboolean) JNI_TRUE;
+ } else {
+ return (jboolean) JNI_FALSE;
+ }
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QMenuData_disconnectItem(JNIEnv *env, jobject obj, jint identifier, jobject receiver, jstring member)
+{
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, member);
+
+ if ( ((QMenuDataJBridge*) QtSupport::getQt(env, obj))->disconnectItem( identifier,
+ javaSlot,
+ javaSlot->javaToQtSlotName(env, member) ) )
+ {
+ return(jboolean) JNI_TRUE;
+ } else {
+ return (jboolean) JNI_FALSE;
+ }
+}
+
+EOF
+
+ $qmenubarjniExtras = <<EOF;
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuBar_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2Lorg_kde_qt_QKeySequence_2II(JNIEnv *env, jobject obj, jstring text, jobject receiver, jstring member, jobject accel, jint identifier, jint index)
+{
+ identifier = Java_org_kde_qt_QMenuBar_insertItem__Ljava_lang_String_2II(env, obj, text, identifier, index);
+
+ if ((bool) Java_org_kde_qt_QMenuBar_connectItem(env, obj, identifier, receiver, member)) {
+ Java_org_kde_qt_QMenuBar_setAccel(env, obj, accel, identifier);
+ }
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuBar_insertItem__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jstring text, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QMenuBar_insertItem__Ljava_lang_String_2II(env, obj, text, -1, -1);
+ Java_org_kde_qt_QMenuBar_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject icon, jstring text, jobject receiver, jstring member)
+{
+static QString * _qstring_text = 0;
+ jint identifier = Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QIconSet_2Ljava_lang_String_2II(env, obj, icon, text, -1, -1);
+ Java_org_kde_qt_QMenuBar_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject pixmap, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QPixmap_2II(env, obj, pixmap, -1, -1);
+ Java_org_kde_qt_QMenuBar_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jint JNICALL
+Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject icon, jobject pixmap, jobject receiver, jstring member)
+{
+ jint identifier = Java_org_kde_qt_QMenuBar_insertItem__Lorg_kde_qt_QIconSet_2Lorg_kde_qt_QPixmap_2II(env, obj, icon, pixmap, -1, -1);
+ Java_org_kde_qt_QMenuBar_connectItem(env, obj, identifier, receiver, member);
+
+ return identifier;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QMenuBar_connectItem(JNIEnv *env, jobject obj, jint identifier, jobject receiver, jstring member)
+{
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, member);
+
+ if ( ((QMenuBarJBridge*) QtSupport::getQt(env, obj))->connectItem( identifier,
+ javaSlot,
+ javaSlot->javaToQtSlotName(env, member) ) )
+ {
+ return(jboolean) JNI_TRUE;
+ } else {
+ return (jboolean) JNI_FALSE;
+ }
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QMenuBar_disconnectItem(JNIEnv *env, jobject obj, jint identifier, jobject receiver, jstring member)
+{
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, member);
+
+ if ( ((QMenuBarJBridge*) QtSupport::getQt(env, obj))->disconnectItem( identifier,
+ javaSlot,
+ javaSlot->javaToQtSlotName(env, member) ) )
+ {
+ return(jboolean) JNI_TRUE;
+ } else {
+ return (jboolean) JNI_FALSE;
+ }
+}
+
+
+EOF
+
+ $quridragExtras = <<EOF;
+ public static native boolean decode(QMimeSourceInterface e, ArrayList i);
+ public static native boolean decodeToUnicodeUris(QMimeSourceInterface e, ArrayList i);
+ public static native boolean decodeLocalFiles(QMimeSourceInterface e, ArrayList i);
+
+EOF
+
+ $quridragjniExtras = <<EOF;
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QUriDrag_decode(JNIEnv *env, jclass cls, jobject e, jobject i)
+{
+static QStrList * _qlist_i = 0;
+ if (_qlist_i == 0) {
+ _qlist_i = new QStrList();
+ }
+ (void) cls;
+ jboolean result = (jboolean) QUriDragJBridge::decode(QtSupport::mimeSource(env, e), *_qlist_i);
+ QtSupport::arrayWithQStrList(env, _qlist_i, i);
+ return result;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QUriDrag_decodeToUnicodeUris(JNIEnv *env, jclass cls, jobject e, jobject i)
+{
+static QStringList * _qlist_i = 0;
+ if (_qlist_i == 0) {
+ _qlist_i = new QStringList();
+ }
+ (void) cls;
+ jboolean result = (jboolean) QUriDragJBridge::decodeToUnicodeUris(QtSupport::mimeSource(env, e), *_qlist_i);
+ QtSupport::arrayWithQStringList(env, _qlist_i, i);
+ return result;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_qt_QUriDrag_decodeLocalFiles(JNIEnv *env, jclass cls, jobject e, jobject i)
+{
+static QStringList * _qlist_i = 0;
+ if (_qlist_i == 0) {
+ _qlist_i = new QStringList();
+ }
+ (void) cls;
+ jboolean result = (jboolean) QUriDragJBridge::decodeLocalFiles(QtSupport::mimeSource(env, e), *_qlist_i);
+ QtSupport::arrayWithQStringList(env, _qlist_i, i);
+ return result;
+}
+
+EOF
+
+ $kapplicationExtras = <<EOF;
+ /**
+ Used internally by the KDE Koala Java bindings runtime
+ */
+ public static native void setJavaSlotFactory();
+
+EOF
+
+ $kapplicationjniExtras = <<EOF;
+#include <kdejava/KDEJavaSlot.h>
+
+JNIEXPORT void JNICALL
+Java_org_kde_koala_KApplication_setJavaSlotFactory(JNIEnv* env, jclass cls)
+{
+ (void) env;
+ (void) cls;
+ JavaSlot::setJavaSlotFactory(new KDEJavaSlotFactory());
+ return;
+}
+
+EOF
+
+ $kmainwindowExtras = <<EOF;
+ /**
+ List of members of KMainWindow class.
+ */
+ public native ArrayList memberList();
+
+ public static void RESTORE(String typeName) {
+ Class savedClass;
+
+ try {
+ savedClass = Class.forName(typeName);
+ int n = 1;
+ while (KMainWindow.canBeRestored(n)){
+ ((KMainWindow) savedClass.newInstance()).restore(n);
+ n++;
+ }
+ } catch(Exception e) {
+ return;
+ }
+
+ return;
+ }
+
+EOF
+
+ $kmainwindowjniExtras = <<EOF;
+JNIEXPORT jobject JNICALL
+Java_org_kde_koala_KMainWindow_memberList(JNIEnv* env, jobject obj)
+{
+ return (jobject) KDESupport::arrayWithKMainWindowList(env, KMainWindow::memberList);
+}
+
+EOF
+
+ $kcmdlineargsjniExtras = <<EOF;
+JNIEXPORT void JNICALL
+Java_org_kde_koala_KCmdLineArgs_init___3Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2(JNIEnv* env, jclass cls, jobjectArray args, jstring _appname, jstring programName, jstring _description, jstring _version)
+{
+ (void) cls;
+static QCString* _qstring__appname = 0;
+static QCString* _qstring_programName = 0;
+static QCString* _qstring__description = 0;
+static QCString* _qstring__version = 0;
+ int argc = (int) env->GetArrayLength(args);
+ KCmdLineArgsJBridge::init((int) argc+1, (char**) QtSupport::toArgv(env, args), (const char*) QtSupport::toCharString(env, _appname, &_qstring__appname), (const char*) QtSupport::toCharString(env, programName, &_qstring_programName), (const char*) QtSupport::toCharString(env, _description, &_qstring__description), (const char*) QtSupport::toCharString(env, _version, &_qstring__version));
+ return;
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_koala_KCmdLineArgs_init___3Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Z(JNIEnv* env, jclass cls, jobjectArray args, jstring _appname, jstring programName, jstring _description, jstring _version, jboolean noKApp)
+{
+ (void) cls;
+static QCString* _qstring__appname = 0;
+static QCString* _qstring_programName = 0;
+static QCString* _qstring__description = 0;
+static QCString* _qstring__version = 0;
+ int argc = (int) env->GetArrayLength(args);
+ KCmdLineArgsJBridge::init(argc+1, (char**) QtSupport::toArgv(env, args), (const char*) QtSupport::toCharString(env, _appname, &_qstring__appname), (const char*) QtSupport::toCharString(env, programName, &_qstring_programName), (const char*) QtSupport::toCharString(env, _description, &_qstring__description), (const char*) QtSupport::toCharString(env, _version, &_qstring__version), (bool) noKApp);
+ return;
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_koala_KCmdLineArgs_init___3Ljava_lang_String_2Lorg_kde_koala_KAboutData_2(JNIEnv* env, jclass cls, jobjectArray args, jobject about)
+{
+ (void) cls;
+ int argc = (int) env->GetArrayLength(args);
+ KCmdLineArgsJBridge::init(argc+1, (char**) QtSupport::toArgv(env, args), (const KAboutData*) QtSupport::getQt(env, about));
+ return;
+}
+
+JNIEXPORT void JNICALL
+Java_org_kde_koala_KCmdLineArgs_init___3Ljava_lang_String_2Lorg_kde_koala_KAboutData_2Z(JNIEnv* env, jclass cls, jobjectArray args, jobject about, jboolean noKApp)
+{
+ (void) cls;
+ int argc = (int) env->GetArrayLength(args);
+ KCmdLineArgsJBridge::init(argc+1, (char**) QtSupport::toArgv(env, args), (const KAboutData*) QtSupport::getQt(env, about), (bool) noKApp);
+ return;
+}
+
+EOF
+
+ $schedulerjniExtras = <<EOF;
+JNIEXPORT jboolean JNICALL
+Java_org_kde_koala_Scheduler_connect__Ljava_lang_String_2Lorg_kde_qt_QObject_2Ljava_lang_String_2(JNIEnv* env, jclass cls, jstring signal, jobject receiver, jstring member)
+{
+ (void) cls;
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, member);
+ QString qtSignalName(javaSlot->javaToQtSignalName(env, signal, 0));
+ jboolean xret = (jboolean) SchedulerJBridge::connect((const char*) qtSignalName, (const QObject*) javaSlot, javaSlot->javaToQtSlotName(env, member, qtSignalName));
+ return xret;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_koala_Scheduler_connect__Lorg_kde_qt_QObject_2Ljava_lang_String_2Ljava_lang_String_2(JNIEnv *env, jobject obj, jobject sender, jstring signal, jstring member)
+{
+ return QtSupport::connect(env, sender, signal, obj, member);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_kde_koala_Scheduler_disconnect(JNIEnv *env, jclass cls, jobject sender, jstring signal, jobject receiver, jstring member)
+{
+ (void) cls;
+ return QtSupport::disconnect(env, sender, signal, receiver, member);
+}
+
+EOF
+
+}
+
+sub javaImport($)
+{
+ my ( $classname ) = @_;
+ my $classname_ptr = $classname . "*";
+ if ( cplusplusToJava($classname_ptr) eq "" or $classname eq $main::globalSpaceClassName ) {
+ return "";
+ } elsif ( cplusplusToJava($classname_ptr) eq "ArrayList" ) {
+ return "java.util.ArrayList";
+ } elsif ( cplusplusToJava($classname_ptr) eq "Calendar" ) {
+ return "java.util.Calendar";
+ } elsif ( cplusplusToJava($classname_ptr) eq "StringBuffer" ) {
+ return "";
+ } elsif ( cplusplusToJava($classname_ptr) eq "String" ) {
+ return "";
+ } elsif ( cplusplusToJava($classname_ptr) eq "String[][]" ) {
+ return "";
+ } elsif ( cplusplusToJava($classname_ptr) eq "String[]" ) {
+ return "";
+ } elsif ( cplusplusToJava($classname_ptr) eq "Date" ) {
+ return "java.util.Date";
+ } elsif ( cplusplusToJava($classname_ptr) =~ /^[a-z]/ ) {
+ return "";
+ } elsif ( $classname =~ /^Q/ ) {
+ return "org.kde.qt." . $classname;
+ } else {
+ return "org.kde.koala." . $classname;
+ }
+}
+
+sub cplusplusToJava
+{
+ my ( $cplusplusType ) = @_;
+ my $isConst = ($cplusplusType =~ /const / or $cplusplusType !~ /[*&]/ ? 1 : 0);
+ $cplusplusType =~ s/const //;
+ $cplusplusType =~ s/^signed//;
+ my $className = $cplusplusType;
+ $className =~ s/[*&]//;
+
+ if ( $cplusplusType =~ /void\*|DCOPArg|DCOPRef|^MSG\s*\*|QGfx|^Display\s*\*|KHTMLPart::PageSecurity|QFileInfoList|QValueList<QIconDragItem>|QValueList<QCString>|QValueList<QVariant>|QValueList<QPixmap>|QValueListConstIterator<QString>|QMap|EditMode|QPtrList<QPixmap>|QPtrList<QPoint>|QTextFormat|QTextCursor|QTextDocument|QNetworkProtocolFactoryBase|QDomNodePrivate|QSqlDriverCreatorBase|QSqlFieldInfoList|QObjectUserData|QUObject|QTextParag|QWidgetMapper|QMemArray<int>|QBitArray|QLayoutIterator|QAuBucket|QUnknownInterface|QConnectionList/ ) {
+ return ""; # Unsupported type
+ } elsif ( $cplusplusType =~ /QSignal\s*\*|QMenuItem|QWSEvent|QWSDisplay|QWSSocket|QPaintDeviceX11Data|QWindowsMime|QDirectPainter|QMember|QDiskFont|QGCache|QRichText|QWSDecoration/ && $main::qt_embedded ) {
+ return ""; # Unsupported Qt/E type
+ } elsif ( $cplusplusType =~ /bool/ && kalyptusDataDict::ctypemap($cplusplusType) eq "int" ) {
+ return "boolean";
+ } elsif ( $cplusplusType =~ /bool\s*[*&]/ ) {
+ return "boolean[]";
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /^void\s*\*/ ) {
+ return "int";
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /^\s*(unsigned )?int\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /^qt_QIntValueList\*/
+ || $cplusplusType =~ /^int[*&]$/ )
+ {
+ return "int[]";
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /^\s*double\s*\*/ ) {
+ return "double[]";
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /^\s*(unsigned )?short\s*\*/ ) {
+ return "short[]";
+ } elsif ( $cplusplusType =~ /KCmdLineOptions/ ) {
+ return "String[][]";
+ } elsif ( $cplusplusType =~ /char\s*\*\*/ || $cplusplusType =~ /QStringList/|| $cplusplusType =~ /QStrList/) {
+ return "String[]";
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QUrlInfoValueList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QVariantValueList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QIconDragItemValueList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QPixmapValueList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_QCStringList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QObjectList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QDomNodeList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QWidgetList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_KURLList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_KMainWindow\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_KFileItemList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_KFileViewItemList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_DOMNodeList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_StyleSheetList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_MediaList\s*\*/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_OfferList\s*\*/
+ || $cplusplusType =~ /QMemArray<QRect>/
+ || $cplusplusType =~ /QArray<QRect>/
+ || kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QCanvasItemList\s*\*/ ) {
+ return "ArrayList"
+ } elsif ( $cplusplusType =~ /uchar\s*\*/ ) {
+ return "char[]";
+ } elsif ( $cplusplusType =~ /QC?String/ and !$isConst ) {
+ return "StringBuffer"
+ } elsif ( $cplusplusType =~ /(DOM::)?DOMString/ || $cplusplusType =~ /QString/ || $cplusplusType =~ /QCString/ || kalyptusDataDict::ctypemap($cplusplusType) =~ /^(const )?char\s*\*/ ) {
+ return "String"
+ } elsif ( $cplusplusType =~ /QChar\s*[&\*]?/ || $cplusplusType =~ /^char$/ ) {
+ return "char"
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QTime\s*\*/ ) {
+ return "Date"
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QDateTime\s*\*/ || kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_QDate\s*\*/ ) {
+ return "Calendar"
+ } elsif ( $cplusplusType =~ /QPaintDevice/ ) {
+ return "QPaintDeviceInterface"
+ } elsif ( $cplusplusType =~ /QByteArray/ ) {
+ return "byte[]"
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /qt_([^\*\s]*)(.*)$/ and !$skippedClasses{$className}) {
+ if ( kalyptusDataDict::interfacemap($1) ne () ) {
+ return $1."Interface";
+ } else {
+ return $1;
+ }
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /kde_([^\*\s]*)(.*)$/ and !$skippedClasses{$className}) {
+ if ( kalyptusDataDict::interfacemap($1) ne () ) {
+ return $1."Interface";
+ } else {
+ return $1;
+ }
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /unsigned char/ ) {
+ return "short";
+ } elsif ( $typedeflist{$cplusplusType} =~ /ulong|long/ ) {
+ return "long";
+ } elsif ( $typedeflist{$cplusplusType} =~ /uint|int/ or $cplusplusType =~ /^int\&$/ ) {
+ return "int";
+ } elsif ( $typedeflist{$cplusplusType} =~ /ushort|short/ ) {
+ return "short";
+ } elsif ( kalyptusDataDict::ctypemap($cplusplusType) =~ /(unsigned )(.*)/ ) {
+ return $2;
+ } else {
+ my $node;
+ my $item;
+ if ($className =~ /^(\w+)::(\w+)$/) {
+ $node = kdocAstUtil::findRef( $rootnode, $1 );
+ $item = kdocAstUtil::findRef( $node, $2 ) if defined $node;
+ if (defined $item && $item->{NodeType} eq 'enum') {
+ return "int";
+ } elsif (defined $item && ($item->{NodeType} eq 'class' || $item->{NodeType} eq 'struct')) {
+ return $skippedClasses{$className} ? "" : $2;
+ }
+ }
+
+ if ($className =~ /^\w+$/) {
+ $item = kdocAstUtil::findRef( $rootnode, $className );
+ if (defined $item && ($item->{NodeType} eq 'class' || $item->{NodeType} eq 'struct')) {
+ return $skippedClasses{$className} ? "" : $className;
+ }
+ }
+ return kalyptusDataDict::ctypemap($cplusplusType);
+ }
+
+}
+
+sub cplusplusToJNI
+{
+ my ( $cplusplusType ) = @_;
+ my $javaType = cplusplusToJava( $cplusplusType );
+
+ if ( $cplusplusType =~ /void/ ) {
+ return "void"
+ } elsif ( $javaType =~ /^Calendar$/ ) {
+ return "jobject"
+ } elsif ( $javaType =~ /^Date$/ ) {
+ return "jobject"
+ } elsif ( $javaType =~ /ArrayList/ ) {
+ return "jobjectArray"
+ } elsif ( $javaType =~ /String\[\]\[\]/ ) {
+ return "jobjectArray";
+ } elsif ( $javaType =~ /String\[\]/ ) {
+ return "jobjectArray";
+ } elsif ( $javaType =~ /StringBuffer/ ) {
+ return "jobject";
+ } elsif ( $javaType =~ /^String$/ ) {
+ return "jstring";
+ } elsif ( $javaType =~ /boolean\[\]/ ) {
+ return "jbooleanArray";
+ } elsif ( $javaType =~ /char\[\]/ ) {
+ return "jcharArray";
+ } elsif ( $javaType =~ /byte\[\]/ ) {
+ return "jbyteArray";
+ } elsif ( $javaType =~ /short\[\]/ ) {
+ return "jshortArray";
+ } elsif ( $javaType =~ /int\[\]/ ) {
+ return "jintArray";
+ } elsif ( $javaType =~ /double\[\]/ ) {
+ return "jdoubleArray";
+ } elsif ( $javaType =~ /^Q/ ) {
+ return "jobject";
+ } elsif ( $javaType =~ /^[A-Z]/ ) {
+ return "jobject";
+ } elsif ( $javaType =~ /^boolean\s*/ ) {
+ return "jboolean";
+ } elsif ( $javaType =~ /^byte\s*/ ) {
+ return "jbyte";
+ } elsif ( $javaType =~ /^char\s*/ ) {
+ return "jchar";
+ } elsif ( $javaType =~ /^short\s*/ ) {
+ return "jshort";
+ } elsif ( $javaType =~ /^int\s*/ ) {
+ return "jint";
+ } elsif ( $javaType =~ /^long\s*/ ) {
+ return "jlong";
+ } elsif ( $javaType =~ /^float\s*/ ) {
+ return "jfloat";
+ } elsif ( $javaType =~ /^double\s*/ ) {
+ return "jdouble";
+ } else {
+ return "";
+ }
+
+}
+
+sub cplusplusToJNISignature
+{
+ my ( $cplusplusType ) = @_;
+ my $javaType = cplusplusToJava( $cplusplusType );
+
+ if ( $javaType =~ /^Calendar$/ ) {
+ return "Ljava_util_Calendar_2"
+ } elsif ( $javaType eq 'Date' ) {
+ return "Ljava_util_Date_2"
+ } elsif ( $javaType =~ /ArrayList/ ) {
+ return "Ljava_util_ArrayList_2"
+ } elsif ( $javaType =~ /String\[\]\[\]/ ) {
+ return "_3_3Ljava_lang_String_2";
+ } elsif ( $javaType =~ /String\[\]/ ) {
+ return "_3Ljava_lang_String_2";
+ } elsif ( $javaType =~ /StringBuffer/ ) {
+ return "Ljava_lang_StringBuffer_2";
+ } elsif ( $javaType eq 'String' ) {
+ return "Ljava_lang_String_2";
+ } elsif ( $javaType =~ /boolean\[\]/ ) {
+ return "_3Z";
+ } elsif ( $javaType =~ /char\[\]/ ) {
+ return "_3C";
+ } elsif ( $javaType =~ /byte\[\]/ ) {
+ return "_3B";
+ } elsif ( $javaType =~ /short\[\]/ ) {
+ return "_3S";
+ } elsif ( $javaType =~ /int\[\]/ ) {
+ return "_3I";
+ } elsif ( $javaType =~ /double\[\]/ ) {
+ return "_3D";
+ } elsif ( $javaType =~ /^Q/ ) {
+ return "Lorg_kde_qt_$javaType"."_2";
+ } elsif ( $javaType =~ /^[A-Z]/ ) {
+ return "Lorg_kde_koala_$javaType"."_2";
+ } elsif ( $javaType =~ /^boolean\s*/ ) {
+ return "Z";
+ } elsif ( $javaType =~ /^byte\s*/ ) {
+ return "B";
+ } elsif ( $javaType =~ /^char\s*/ ) {
+ return "C";
+ } elsif ( $javaType =~ /^short\s*/ ) {
+ return "S";
+ } elsif ( $javaType =~ /^int\s*/ ) {
+ return "I";
+ } elsif ( $javaType =~ /^long\s*/ ) {
+ return "J";
+ } elsif ( $javaType =~ /^float\s*/ ) {
+ return "F";
+ } elsif ( $javaType =~ /^double\s*/ ) {
+ return "D";
+ } else {
+ return "";
+ }
+
+}
+
+sub jniArgTocplusplus
+{
+ my ( $cplusplusType, $argName ) = @_;
+ my $jniLocal = ''; # output
+ my $jniArg = ''; # output
+ my $jniCleanup = ''; # output
+
+ my $javaType = cplusplusToJava( $cplusplusType );
+ my $jniType = cplusplusToJNI( $cplusplusType );
+
+ if ( $javaType =~ /^Calendar$/ ) {
+ my $dateclass = $cplusplusType =~ /QDateTime/ ? "QDateTime" : "QDate";
+ $jniLocal = "static $dateclass* _qdate_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::to$dateclass(env, $argName, &_qdate_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*($dateclass*) QtSupport::to$dateclass(env, $argName, &_qdate_$argName)";
+ }
+ } elsif ( $javaType =~ /^Date$/ ) {
+ $jniLocal = "static QTime* _qtime_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toQTime(env, $argName, &_qtime_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QTime*) QtSupport::toQTime(env, $argName, &_qtime_$argName)";
+ }
+ } elsif ( $javaType =~ /ArrayList/ ) {
+ if ( $cplusplusType =~ /KFileItemList/ ) {
+ $jniLocal ="static KFileItemList* _qlist_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) KDESupport::toKFileItemList(env, $argName, &_qlist_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QStrList*) KDESupport::toKFileItemList(env, $argName, &_qlist_$argName)";
+ }
+ } elsif ( $cplusplusType =~ /QCStringList/ ) {
+ $jniLocal ="static QCStringList* _qlist_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) KDESupport::toQCStringList(env, $argName, &_qlist_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QCStringList*) KDESupport::toQCStringList(env, $argName, &_qlist_$argName)";
+ }
+ } elsif ( $cplusplusType =~ /KURL::List/ ) {
+ $jniLocal ="static KURL::List* _qlist_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) KDESupport::toKURLList(env, $argName, &_qlist_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(KURL::List*) KDESupport::toKURLList(env, $argName, &_qlist_$argName)";
+ }
+ }
+ } elsif ( $javaType =~ /String\[\]\[\]/ ) {
+ if ( $cplusplusType =~ /KCmdLineOptions/ ) {
+ $jniArg = "(KCmdLineOptions*) KDESupport::toKCmdLineOptions(env, $argName)";
+ }
+ } elsif ( $javaType =~ /String\[\]/ ) {
+ if ( $cplusplusType =~ /QStringList/ ) {
+ $jniLocal ="static QStringList* _qlist_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toQStringList(env, $argName, &_qlist_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QStringList*) QtSupport::toQStringList(env, $argName, &_qlist_$argName)";
+ }
+ } elsif ( $cplusplusType =~ /QStrList/ ) {
+ $jniLocal ="static QStrList* _qlist_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toQStrList(env, $argName, &_qlist_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QStrList*) QtSupport::toQStrList(env, $argName, &_qlist_$argName)";
+ }
+ } elsif ( $cplusplusType =~ /char\s*\*\*/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toStringArray(env, $argName)";
+ }
+ } elsif ( $javaType =~ /StringBuffer/ ) {
+ if ( $cplusplusType =~ /QCString/ ) {
+ $jniLocal = "static QCString* _qcstring_$argName = 0;\n";
+ $jniLocal .= "\tif (_qcstring_$argName == 0) {\n";
+ $jniLocal .= "\t\t_qcstring_$argName = new QCString();\n";
+ $jniLocal .= "\t}\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) _qcstring_$argName";
+ } else {
+ $jniArg = "($cplusplusType)*(QCString*) _qcstring_$argName";
+ }
+ $jniCleanup = "\tQtSupport::fromQCStringToStringBuffer(env, _qcstring_$argName, $argName);\n";
+ } else {
+ $jniLocal ="static QString* _qstring_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toQStringFromStringBuffer(env, $argName, &_qstring_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QString*) QtSupport::toQStringFromStringBuffer(env, $argName, &_qstring_$argName)";
+ }
+ $jniCleanup = "\tQtSupport::fromQStringToStringBuffer(env, _qstring_$argName, $argName);\n";
+ }
+ } elsif ( $javaType =~ /^String$/ ) {
+ if ( $cplusplusType =~ /QString/ ) {
+ $jniLocal ="static QString* _qstring_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toQString(env, $argName, &_qstring_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QString*) QtSupport::toQString(env, $argName, &_qstring_$argName)";
+ }
+ } elsif ( $cplusplusType =~ /QCString/ ) {
+ $jniLocal ="static QCString* _qcstring_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toQCString(env, $argName, &_qcstring_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QCString*) QtSupport::toQCString(env, $argName, &_qcstring_$argName)";
+ }
+ } elsif ( $cplusplusType =~ /DOMString/ ) {
+ $jniLocal ="static DOM::DOMString* _domstring_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "(DOM::DOMString*) KDESupport::toDOMString(env, $argName, &_domstring_$argName)";
+ } else {
+ $jniArg = "(DOM::DOMString)*(DOM::DOMString*) KDESupport::toDOMString(env, $argName, &_domstring_$argName)";
+ }
+ } else {
+ $jniLocal ="static QCString* _qstring_$argName = 0;\n";
+ $jniArg = "($cplusplusType) ". ($cplusplusType =~ /[\&]/ ? "*(char*)" : "") . "QtSupport::toCharString(env, $argName, &_qstring_$argName)";
+ }
+ } elsif ( $javaType =~ /boolean\[\]/ ) {
+ $jniLocal ="\tbool* _bool_$argName = QtSupport::toBooleanPtr(env, $argName);\n";
+ $jniArg = " ($cplusplusType) " . ($cplusplusType =~ /[\*]/ ? "" : "*") . "_bool_$argName";
+ $jniCleanup = "\tenv->SetBooleanArrayRegion($argName, 0, 1, (jboolean*) _bool_$argName);\n";
+ } elsif ( $javaType =~ /char\[\]/ ) {
+ $jniLocal ="static QByteArray* _qbytearray_$argName = 0;\n";
+ $jniArg = "($cplusplusType) QtSupport::toUcharArray(env, $argName, &_qbytearray_$argName)";
+ } elsif ( $javaType =~ /byte\[\]/ ) {
+ $jniLocal = "static QByteArray* _qbyteArray_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toQByteArray(env, $argName, &_qbyteArray_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QByteArray*) QtSupport::toQByteArray(env, $argName, &_qbyteArray_$argName)";
+ }
+ } elsif ( $javaType =~ /short\[\]/ ) {
+ $jniLocal ="\tshort* _short_$argName = QtSupport::toShortPtr(env, $argName);\n";
+ $jniArg = " ($cplusplusType) " . ($cplusplusType =~ /[\*]/ ? "" : "*") . "_short_$argName";
+ $jniCleanup = "\tenv->SetShortArrayRegion($argName, 0, 1, (jshort*) _short_$argName);\n";
+ } elsif ( $javaType =~ /int\[\]/ ) {
+ if ( $cplusplusType =~ /QValueList/ ) {
+ $jniLocal = "static QValueList<int>* _qlist_$argName = 0;\n";
+ $jniArg = "($cplusplusType) QtSupport::toQIntValueList(env, $argName, &_qlist_$argName)";
+ } else {
+ $jniLocal ="\tint* _int_$argName = QtSupport::toIntPtr(env, $argName);\n";
+ $jniArg = " ($cplusplusType) " . ($cplusplusType =~ /[\*]/ ? "" : "*") . "_int_$argName";
+ $jniCleanup = "\tenv->SetIntArrayRegion($argName, 0, 1, (jint *) _int_$argName);\n";
+ }
+ } elsif ( $javaType =~ /double\[\]/ ) {
+ $jniLocal ="\tdouble* _double_$argName = QtSupport::toDoublePtr(env, $argName);\n";
+ $jniArg = " ($cplusplusType) " . ($cplusplusType =~ /[\*]/ ? "" : "*") . "_double_$argName";
+ $jniCleanup = "\tenv->SetDoubleArrayRegion($argName, 0, 1, (jdouble*) _double_$argName);\n";
+ } elsif ( $javaType =~ /^QPaintDeviceInterface$/ ) {
+ $jniArg = "($cplusplusType) QtSupport::paintDevice(env, $argName)";
+ } elsif ( $javaType =~ /^QMimeSourceInterface$/ ) {
+ $jniArg = "($cplusplusType) QtSupport::mimeSource(env, $argName)";
+ } elsif ( $javaType =~ /^[A-Z]/ ) {
+ ( my $className = $cplusplusType ) =~ s/[&*]//g;
+ $jniArg = (($cplusplusType !~ /[\*]/ or $cplusplusType =~ /\*\&/) ? "($cplusplusType)*" : "") . "($className*) QtSupport::getQt(env, $argName)";
+ } elsif ( $javaType =~ /^boolean\s*/ ) {
+ $jniArg = "($cplusplusType) $argName";
+ } elsif ( $javaType =~ /^byte\s*/ ) {
+ $jniArg = "($cplusplusType) $argName";
+ } elsif ( $javaType =~ /^char\s*/ ) {
+ if ( $cplusplusType =~ /QChar/ ) {
+ $jniLocal = "static QChar* _qchar_$argName = 0;\n";
+ if ( $cplusplusType =~ /[\*]/ ) {
+ $jniArg = "($cplusplusType) QtSupport::toQChar(env, $argName, &_qchar_$argName)";
+ } else {
+ $jniArg = "($cplusplusType)*(QChar*) QtSupport::toQChar(env, $argName, &_qchar_$argName)";
+ }
+ } else {
+ $jniArg = "($cplusplusType) $argName";
+ }
+ } elsif ( $javaType =~ /^short\s*/ ) {
+ $jniArg = "($cplusplusType) $argName";
+ } elsif ( $javaType =~ /^int\s*/ ) {
+ $jniArg = "($cplusplusType) $argName";
+ } elsif ( $javaType =~ /^long\s*/ ) {
+ $jniArg = "($cplusplusType) $argName";
+ } elsif ( $javaType =~ /^float\s*/ ) {
+ $jniArg = "($cplusplusType) $argName";
+ } elsif ( $javaType =~ /^double\s*/ ) {
+ $jniArg = "($cplusplusType) $argName";
+ } else {
+ ;
+ }
+
+ return ($jniLocal, $jniArg, $jniCleanup);
+}
+
+sub jniToReturnValue($$$)
+{
+ my ( $cplusplusType, $functionCall, $jniCleanups ) = @_;
+ my $jniLocal = ''; # output
+ my $returnCall = ''; # output
+
+ my $javaType = cplusplusToJava( $cplusplusType );
+ my $const = ($cplusplusType =~ /const / ? "const " : "");
+
+ if ( $cplusplusType =~ /void/ ) {
+ $returnCall = "\t$functionCall;\n\treturn;\n";
+ $returnCall = "\t$functionCall;\n$jniCleanups\treturn;\n";
+ } elsif ( $javaType =~ /^Calendar$/ ) {
+ $cplusplusType =~ /(QDateTime|QDate)\s*(\*)?&?\s*$/;
+ $jniLocal = "\t$1 $2 _qdate;\n";
+ $returnCall = "\t_qdate = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn (jobject) QtSupport::from$1(env, ($1*) " . ($2 eq "\*" ? "" : "&") . "_qdate);\n";
+ } elsif ( $javaType =~ /^Date$/ ) {
+ $cplusplusType =~ /(QTime)\s*(\*)?&?\s*$/;
+ $jniLocal = "\t$1 $2 _qtime;\n";
+ $returnCall = "\t_qtime = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn (jobject) QtSupport::fromQTime(env, ($1*) " . ($2 eq "\*" ? "" : "&") . "_qtime);\n";
+ } elsif ( $javaType =~ /ArrayList/ || $javaType =~ /String\[\]/ ) {
+ if ( $cplusplusType !~ /\*/ ) {
+ $const = "";
+ }
+ $cplusplusType =~ /(const )?([^\&]*)(\*)?&?/;
+ $jniLocal = "\t$const$2 $3 _qlist;\n";
+ $returnCall = "\t_qlist = $functionCall;\n$jniCleanups";
+ if ( $cplusplusType =~ /(QStrList|QStringList|QCanvasItemList|QWidgetList|QDomNodeList|QObjectList)\s*([\*\&])?\s*$/ ) {
+ $returnCall .= "\treturn (jobject) QtSupport::arrayWith$1(env, ($1*) " . ($2 eq "\*" ? "" : "&") . "_qlist);\n";
+ } elsif ( $cplusplusType =~ /DOM::(NodeList|StyleSheetList|MediaList)\s*([\*\&])?\s*$/ ) {
+ $returnCall .= "\treturn (jobject) KDESupport::arrayWith$1(env, (DOM::$1 *) " . ($2 eq "\*" ? "" : "&") . "_qlist);\n";
+ } elsif ( $cplusplusType =~ /(QCStringList|KFileItemList|KFileViewItemList)\s*([\*\&])?\s*$/ ) {
+ $returnCall .= "\treturn (jobject) KDESupport::arrayWith$1(env, ($1*) " . ($2 eq "\*" ? "" : "&") . "_qlist);\n";
+ } elsif ( $cplusplusType =~ /(KTrader::OfferList)\s*([\*\&])?\s*$/ ) {
+ $returnCall .= "\treturn (jobject) KDESupport::arrayWithOfferList(env, ($1*) " . ($2 eq "\*" ? "" : "&") . "_qlist);\n";
+ } elsif ( $cplusplusType =~ /(KURL::List)\s*([\*\&])?\s*$/ ) {
+ $returnCall .= "\treturn (jobject) KDESupport::arrayWithKURLList(env, ($1*) " . ($2 eq "\*" ? "" : "&") . "_qlist);\n";
+ } elsif ( $cplusplusType =~ /QValueList<QIconDragItem>\s*([\*\&])?\s*$/ ) {
+ $returnCall .= "\treturn (jobject) QtSupport::arrayWithQIconDragItemList(env, (QValueList<QIconDragItem>*) " . ($1 eq "\*" ? "" : "&") . "_qlist);\n";
+ } elsif ( $cplusplusType =~ /QMemArray<QRect>\s*([\*\&])?\s*$/ ) {
+ $returnCall .= "\treturn (jobject) QtSupport::arrayWithQRectList(env, (QMemArray<QRect>*) " . ($1 eq "\*" ? "" : "&") . "_qlist);\n";
+ } elsif ( $cplusplusType =~ /QArray<QRect>\s*([\*\&])?\s*$/ ) {
+ $returnCall .= "\treturn (jobject) QtSupport::arrayWithQRectList(env, (QArray<QRect>*) " . ($1 eq "\*" ? "" : "&") . "_qlist);\n";
+ }
+ } elsif ( $javaType =~ /String\[\]/ ) {
+ ; # Do nothing, string arrays are ArrayLists as return values
+ } elsif ( $javaType =~ /String/ || $javaType =~ /StringBuffer/ ) {
+ if ( $cplusplusType =~ /QString(\s*\*)?/ ) {
+ $jniLocal = "\tQString $1 _qstring;\n";
+ $returnCall = "\t_qstring = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn QtSupport::fromQString(env, " . ($cplusplusType =~ /\*/ ? "" : "&") . "_qstring);\n";
+ } elsif ($cplusplusType =~ /QCString(\s*\*)?/) {
+ $jniLocal = "\tQCString $1 _qstring;\n";
+ $returnCall = "\t_qstring = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn QtSupport::fromQCString(env, " . ($cplusplusType =~ /\*/ ? "" : "&") . "_qstring);\n";
+ } elsif ($cplusplusType =~ /DOM::DOMString(\s*\*)?/) {
+ $jniLocal = "\tDOM::DOMString $1 _qstring;\n";
+ $returnCall = "\t_qstring = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn KDESupport::fromDOMString(env, " . ($cplusplusType =~ /\*/ ? "" : "&") . "_qstring);\n";
+ } else {
+ $jniLocal = "\t$cplusplusType _qstring;\n";
+ $returnCall = "\t_qstring = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn QtSupport::fromCharString(env, (char *) _qstring);\n";
+ }
+ } elsif ( $javaType =~ /boolean\[\]/ ) {
+ ;
+ } elsif ( $cplusplusType =~ /uchar\s*\*/ ) {
+ ;
+ } elsif ( $javaType =~ /char\[\]/ ) {
+ ;
+ } elsif ( $javaType =~ /byte\[\]/ ) {
+ $jniLocal = "\tQByteArray " . ($cplusplusType =~ /\*/ ? "*" : "") . "_qbyteArray;\n";
+ $returnCall = "\t_qbyteArray = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn QtSupport::fromQByteArray(env, " . ($cplusplusType =~ /\*/ ? "" : "&") . "_qbyteArray);\n";
+ } elsif ( $javaType =~ /short\[\]/ ) {
+ ;
+ } elsif ( $javaType =~ /int\[\]/ && $cplusplusType !~ /\&/ ) {
+ if ( $cplusplusType =~ /(int\*|QRgb\*)/ ) {
+ $jniLocal = "\t$1 _qint;\n";
+ $returnCall = "\t_qint = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn QtSupport::fromIntPtr(env, (int*)_qint);\n";
+ } else {
+ $jniLocal = "\tQValueList<int> _qintArray;\n";
+ $returnCall = "\t_qintArray = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn QtSupport::fromQIntValueList(env, &_qintArray);\n";
+ }
+ } elsif ( $javaType =~ /double\[\]/ ) {
+ ;
+ } elsif ( $javaType =~ /^[A-Z]/ ) {
+ my $className = $cplusplusType;
+ $className =~ s/[\*\&]|const //g;
+ $returnCall = "\tjobject xret = QtSupport::objectForQtKey(env, (void*)";
+ my $fullyQualifiedReturnType = ($javaType =~ /^Q/ ? "org.kde.qt.$javaType" : "org.kde.koala.$javaType");
+ if ($cplusplusType =~ /\*/) {
+ $returnCall .= "$functionCall, \"$fullyQualifiedReturnType\");\n";
+ } elsif ($cplusplusType =~ /\&/) {
+ $returnCall .= "($className *) &$functionCall, \"$fullyQualifiedReturnType\");\n";
+ } else {
+ $returnCall .= "new $className($functionCall), \"$fullyQualifiedReturnType\", TRUE);\n";
+ }
+ $returnCall .= "$jniCleanups\treturn xret;\n";
+ } elsif ( $javaType =~ /^char\s*/ ) {
+ if ( $cplusplusType =~ /(QChar)(\s*\*)?\s*$/ ) {
+ $jniLocal = "\t$const$1 $2 _qchar;\n";
+ $returnCall = "\t_qchar = $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn (jchar) QtSupport::fromQChar(env, (QChar*) " . ($cplusplusType =~ /\*/ ? "" : "&") . "_qchar);\n";
+ } else {
+ $returnCall = "\tjchar xret = (jchar) $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn xret;\n";
+ }
+ } elsif ( $javaType =~ /int\[\]/ && $cplusplusType =~ /\&/ ) {
+ $returnCall = "\tjint xret = (jint) $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn xret;\n";
+ } elsif ( $javaType =~ /(^boolean|^byte|^short|^int|^long|^float|^double)/ ) {
+ $returnCall = "\tj$1 xret = (j$1) $functionCall;\n$jniCleanups";
+ $returnCall .= "\treturn xret;\n";
+ }
+
+ return ($jniLocal, $returnCall);
+}
+
+sub writeDoc
+{
+ ( $libname, $rootnode, $outputdir, $opt ) = @_;
+
+ print STDERR "Starting writeDoc for $libname...\n";
+
+ $debug = $main::debuggen;
+
+ mkpath( $outputdir ) unless -f $outputdir;
+
+ # Define QPtrCollection::Item, for resolveType
+ unless ( kdocAstUtil::findRef( $rootnode, "QPtrCollection::Item" ) ) {
+ my $cNode = kdocAstUtil::findRef( $rootnode, "QPtrCollection" );
+ warn "QPtrCollection not found" if (!$cNode);
+ my $node = Ast::New( 'Item' );
+ $node->AddProp( "NodeType", "Forward" );
+ $node->AddProp( "Source", $cNode->{Source} ) if ($cNode);
+ kdocAstUtil::attachChild( $cNode, $node ) if ($cNode);
+ $node->AddProp( "Access", "public" );
+ }
+
+ print STDERR "Preparsing...\n";
+
+ # Preparse everything, to prepare some additional data in the classes and methods
+ Iter::LocalCompounds( $rootnode, sub { preParseClass( shift ); } );
+
+ # Have a look at each class again, to propagate CanBeCopied
+ Iter::LocalCompounds( $rootnode, sub { propagateCanBeCopied( shift ); } );
+
+ # Write out smokedata.cpp
+ writeSmokeDataFile($rootnode);
+
+ print STDERR "Writing *.java...\n";
+
+ # Generate *java file for each class
+ Iter::LocalCompounds( $rootnode, sub { writeClassDoc( shift ); } );
+
+ print STDERR "Done.\n";
+}
+
+=head2 preParseClass
+ Called for each class
+=cut
+sub preParseClass
+{
+ my( $classNode ) = @_;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+
+ if( $#{$classNode->{Kids}} < 0 ||
+ $classNode->{Access} eq "private" ||
+ $classNode->{Access} eq "protected" || # e.g. QPixmap::QPixmapData
+ exists $classNode->{Tmpl} ||
+ # Don't generate standard bindings for QString, this class is handled as a native type
+ $className eq 'QString' ||
+ $className eq 'QConstString' ||
+ $className eq 'QCString' ||
+ # Don't map classes which are really arrays
+ $className eq 'QStringList' ||
+ $className eq 'QCanvasItemList' ||
+ $className eq 'QWidgetList' ||
+ $className eq 'QObjectList' ||
+ $className eq 'QStrList' ||
+ # Those are template related
+ $className eq 'QTSManip' || # cause compiler errors with several gcc versions
+ $className eq 'QIconFactory' ||
+ $className eq 'QGDict' ||
+ $className eq 'QGList' ||
+ $className eq 'QGVector' ||
+ $className eq 'QStrIList' ||
+ $className eq 'QStrIVec' ||
+ $className eq 'QByteArray' ||
+ $className eq 'QBitArray' ||
+ $className eq 'QWExtra' ||
+ $className eq 'QTLWExtra' ||
+ $className eq 'QMetaEnum::Item' ||
+ $className eq 'QWidgetContainerPlugin' ||
+ $className eq 'QGArray::array_data' ||
+ $className eq 'KBookmarkMenu::DynMenuInfo' ||
+ $className eq 'KCompletionMatches' ||
+ $className eq 'KDEDesktopMimeType::Service' ||
+ $className eq 'KGlobalSettings::KMouseSettings' ||
+ $className eq 'KMimeType::Format' ||
+ $className eq 'KNotifyClient::Instance' ||
+ $className eq 'KParts::Plugin::PluginInfo' ||
+ $className eq 'KProtocolInfo::ExtraField' ||
+ $className eq 'KXMLGUIClient::StateChange' ||
+ $className eq 'KIconTheme' ||
+ $className eq 'KEditListBox::CustomEditor' ||
+ $className eq 'KIO::KBookmarkMenuNSImporter' ||
+ $className eq 'KPerDomainSettings' ||
+ $className eq 'KApplicationPropsPlugin' ||
+ $className eq 'KPrinter' ||
+ $className eq 'KPty' ||
+ $className eq 'KOpenWithHandler' ||
+ $className eq 'KFileOpenWithHandler' ||
+ $className eq 'KBindingPropsPlugin' ||
+ $className eq 'KPropsDlgPlugin' ||
+ $className eq 'KFileSharePropsPlugin' ||
+ $className eq 'KBookmarkMenuNSImporter' ||
+ $className eq 'KDevicePropsPlugin' ||
+ $className eq 'KWin::WindowInfo' ||
+ $className eq 'KDEDModule' ||
+ $className eq 'KFileMetaInfoProvider' ||
+ $className eq 'KFileMimeTypeInfo' ||
+ $className eq 'KExecPropsPlugin' ||
+ $className eq 'KFilePermissionsPropsPlugin' ||
+ $className eq 'KImageFilePreview' ||
+ $className eq 'KBookmarkManager' ||
+ $className eq 'KBookmarkNotifier' ||
+ $className eq 'KOCRDialogFactory' ||
+ $className eq 'KExtendedBookmarkOwner' ||
+ $className eq 'KSharedPixmap' ||
+ $className eq 'KSocket' ||
+ $className eq 'KLibrary' ||
+ $className eq 'KScanDialogFactory' ||
+ $className eq 'KDictSpellingHighlighter' ||
+ $className eq 'KPropertiesDialog' ||
+ $className eq 'ProgressItem' ||
+ $className eq 'KIO::ChmodInfo' ||
+ $className eq 'KIO::MetaData' ||
+ $className eq 'KFileMimeTypeInfo::ItemInfo' ||
+ $className eq 'KIO::UDSAtom' ||
+ $className eq 'khtml::DrawContentsEvent' || # the khtml:: classes build, but don't link
+ $className eq 'khtml::MouseDoubleClickEvent' ||
+ $className eq 'khtml::MouseMoveEvent' ||
+ $className eq 'khtml::MousePressEvent' ||
+ $className eq 'khtml::MouseReleaseEvent' ||
+ $className eq 'khtml::MouseEvent' ||
+ $className eq 'KURL::List' ||
+ $className eq 'KWin::Info' ||
+ $className eq 'TerminalInterface' ||
+ $className =~ /.*Private$/ || # Ignore any classes which aren't for public consumption
+ $className =~ /.*Impl$/ ||
+ $className =~ /.*Internal.*/ ||
+# $classNode->{Deprecated} ||
+ $classNode->{NodeType} eq 'union' # Skip unions for now, e.g. QPDevCmdParam
+ ) {
+ print STDERR "Skipping $className\n" if ($debug);
+ print STDERR "Skipping union $className\n" if ( $classNode->{NodeType} eq 'union');
+ $skippedClasses{$className} = 1;
+ delete $classNode->{Compound}; # Cheat, to get it excluded from Iter::LocalCompounds
+ return;
+ }
+
+ my $signalCount = 0;
+ my $eventHandlerCount = 0;
+ my $defaultConstructor = 'none'; # none, public, protected or private. 'none' will become 'public'.
+ my $constructorCount = 0; # total count of _all_ ctors
+ # If there are ctors, we need at least one public/protected one to instanciate the class
+ my $hasPublicProtectedConstructor = 0;
+ # We need a public dtor to destroy the object --- ### aren't protected dtors ok too ??
+ my $hasPublicDestructor = 1; # by default all classes have a public dtor!
+ #my $hasVirtualDestructor = 0;
+ my $hasDestructor = 0;
+ my $hasPrivatePureVirtual = 0;
+ my $hasCopyConstructor = 0;
+ my $hasPrivateCopyConstructor = 0;
+ # Note: no need for hasPureVirtuals. $classNode{Pure} has that.
+
+ my $doPrivate = $main::doPrivate;
+ $main::doPrivate = 1;
+ # Look at each class member (looking for methods and enums in particular)
+ Iter::MembersByType ( $classNode, undef,
+ sub {
+
+ my( $classNode, $m ) = @_;
+ my $name = $m->{astNodeName};
+
+ if( $m->{NodeType} eq "method" ) {
+ if ( $m->{ReturnType} eq 'typedef' # QFile's EncoderFn/DecoderFn callback, very badly parsed
+ ) {
+ $m->{NodeType} = 'deleted';
+ next;
+ }
+
+ print STDERR "preParseClass: looking at $className\::$name $m->{Params}\n" if ($debug);
+
+ if ( $name eq $classNode->{astNodeName} ) {
+ if ( $m->{ReturnType} =~ /~/ ) {
+ # A destructor
+ $hasPublicDestructor = 0 if $m->{Access} ne 'public';
+ #$hasVirtualDestructor = 1 if ( $m->{Flags} =~ "v" && $m->{Access} ne 'private' );
+ $hasDestructor = 1;
+ } else {
+ # A constructor
+ $constructorCount++;
+ $defaultConstructor = $m->{Access} if ( $m->{Params} eq '' );
+ $hasPublicProtectedConstructor = 1 if ( $m->{Access} ne 'private' );
+
+ # Copy constructor?
+ if ( $#{$m->{ParamList}} == 0 ) {
+ my $theArgType = @{$m->{ParamList}}[0]->{ArgType};
+ if ($theArgType =~ /$className\s*\&/) {
+ $hasCopyConstructor = 1;
+ $hasPrivateCopyConstructor = 1 if ( $m->{Access} eq 'private' );
+ }
+ }
+ # Hack the return type for constructors, since constructors return an object pointer
+ $m->{ReturnType} = $className."*";
+ }
+ }
+
+ if ( $name =~ /~$classNode->{astNodeName}/ && $m->{Access} ne "private" ) { # not used
+ $hasPublicDestructor = 0 if $m->{Access} ne 'public';
+ #$hasVirtualDestructor = 1 if ( $m->{Flags} =~ "v" );
+ $hasDestructor = 1;
+ }
+
+ if ( $m->{Flags} =~ "p" && $m->{Access} =~ /private/ ) {
+ $hasPrivatePureVirtual = 1; # ouch, can't inherit from that one
+ }
+
+ # All we want from private methods is to check for virtuals, nothing else
+ next if ( $m->{Access} =~ /private/ );
+
+ # Don't generate code for deprecated methods,
+ # or where the code won't compile/link for obscure reasons. Or even obvious reasons..
+ if ( ($classNode->{astNodeName} eq 'KCharSelectTable' and $name eq 'paintCell')
+ || ($classNode->{astNodeName} eq 'KAnimWidget' and $name eq 'KAnimWidget' and @{$m->{ParamList}} == 2)
+ || ($classNode->{astNodeName} eq 'KDCOPActionProxy' and $name eq 'actions')
+ || ($classNode->{astNodeName} eq 'KFileDialog' and $name eq 'addDirEntry')
+ || ($classNode->{astNodeName} eq 'KFileDialog' and $name eq 'getDirEntry')
+ || ($classNode->{astNodeName} eq 'KFileView' and $name eq 'selectionMode')
+ || ($classNode->{astNodeName} eq 'KFind' and $name eq 'KFind' and @{$m->{ParamList}} == 4)
+ || ($classNode->{astNodeName} eq 'KGlobalAccel' and $name eq 'setEnabled')
+ || ($classNode->{astNodeName} eq 'KCharsets' and $name eq 'encodingsForLanguage')
+ || ($classNode->{astNodeName} eq 'KInputDialog' and $name eq 'getInteger')
+ || ($classNode->{astNodeName} eq 'KIO' and $name eq 'buildHTMLErrorString')
+ || ($classNode->{astNodeName} eq 'KIO' and $name eq 'calculateRemainingSeconds')
+ || ($classNode->{astNodeName} eq 'SlaveBase' and $name eq 'checkCachedAuthentication')
+ || ($classNode->{astNodeName} eq 'SlaveBase' and $name eq 'cacheAuthentication')
+ || ($classNode->{astNodeName} eq 'KInputDialog' and $name eq 'getDouble')
+ || ($classNode->{astNodeName} eq 'KToolBar' and $name eq 'enable')
+ || ($classNode->{astNodeName} eq 'KAccel' and $name eq 'insert' and @{$m->{ParamList}} == 2)
+ || ($classNode->{astNodeName} eq 'KAccel' and $name eq 'autoupdate')
+ || ($classNode->{astNodeName} eq 'KAccel' and $name eq 'getAutoUpdate')
+ || ($classNode->{astNodeName} eq 'KStdAccel' and $name eq 'insert')
+ || ($classNode->{astNodeName} eq 'KBookmarkMenu' and $name eq 'invalid')
+ || ($classNode->{astNodeName} eq 'KCharsets' and $name eq 'languages')
+ || ($classNode->{astNodeName} eq 'KCombiView' and $name eq 'setDropOptions')
+ || ($classNode->{astNodeName} eq 'KFileMetaInfoItem' and $name eq 'unit')
+ || ($classNode->{astNodeName} eq 'KInstance' and $name eq 'charsets')
+ || ($classNode->{astNodeName} eq 'KInstance' and $name eq 'KInstance' and $m->{Access} =~ /protected/)
+ || ($classNode->{astNodeName} eq 'KKey' and $name eq 'isValidQt')
+ || ($classNode->{astNodeName} eq 'KKey' and $name eq 'isValidNative')
+ || ($classNode->{astNodeName} eq 'KKeySequence' and $name eq 'init')
+ || ($classNode->{astNodeName} eq 'KKeySequence' and $name eq 'setTriggerOnRelease')
+ || ($classNode->{astNodeName} eq 'KEMailSettings' and $name eq 'getExtendedSetting')
+ || ($classNode->{astNodeName} eq 'KEMailSettings' and $name eq 'setExtendedSetting')
+ || ($classNode->{astNodeName} eq 'KHTMLSettings' and $name eq 'fallbackAccessKeysAssignments')
+ || ($classNode->{astNodeName} eq 'KProtocolManager' and $name eq 'defaultConnectTimeout')
+ || ($classNode->{astNodeName} eq 'KMD5' and $name eq 'transform')
+ || ($classNode->{astNodeName} eq 'KSSLCertificate' and $name eq 'operator!=')
+ || ($classNode->{astNodeName} eq 'KSSLPKCS7' and $name eq 'validate')
+ || ($classNode->{astNodeName} eq 'KSSLPKCS7' and $name eq 'revalidate')
+ || ($classNode->{astNodeName} eq 'KSSLSession' and $name eq 'KSSLSession' and @{$m->{ParamList}} == 1)
+ || ($classNode->{astNodeName} eq 'KSimpleFileFilter' and $name eq 'nameFilters')
+ || ($classNode->{astNodeName} eq 'KTabWidget' and $name eq 'isTabReorderingEnabled')
+ || ($classNode->{astNodeName} eq 'KTabWidget' and $name eq 'hoverCloseButton')
+ || ($classNode->{astNodeName} eq 'KTar' and $name eq 'writeFile_impl')
+
+ # Various methods to skip in Qt/E (Qt 2.3.x)
+ || ($main::qt_embedded
+ && ( ($classNode->{astNodeName} eq 'QUriDrag' and $name =~ /^decode$|decodeLocalFiles|decodeToUnicodeUris/)
+ || ($classNode->{astNodeName} eq 'QApplication' and $name =~ /^qwsSetCustomColors|^setArgs$|^winMouseButtonUp|^winFocus|^winMouseButtonUP$|^winVersion$/)
+ || ($classNode->{astNodeName} eq 'QPrinter' and $name =~ /^setIdle$|^setActive$/)
+ || ($classNode->{astNodeName} eq 'QDragObject' and $name eq 'dragLink')
+ || ($classNode->{astNodeName} eq 'QFont' and $name eq 'qwsRenderToDisk')
+ || ($classNode->{astNodeName} eq 'QFontInfo' and $name eq 'font')
+ || ($classNode->{astNodeName} eq 'QLineEdit' and $name eq 'getSelection')
+ || ($classNode->{astNodeName} eq 'QMainWindow' and $name eq 'toolBars')
+ || ($classNode->{astNodeName} eq 'QMovie' and $name eq 'setDisplayWidget')
+ || ($classNode->{astNodeName} eq 'QMetaObject' and $name =~ /^new_metaenum_item$|^new_metaaccess$/)
+ || ($classNode->{astNodeName} eq 'QPainter' and $name eq 'pos')
+ || ($classNode->{astNodeName} eq 'QPixmap' and $name =~ /^allocCell$|^clut$|^freeCell|^hbm|^isMultiCellPixmap|^multiCellPixmap|^multiCellBitmap|^multiCellHandle|^multiCellOffset|^numCols/)
+ || ($name eq 'handle')
+ || ($name eq 'resetInputContext')
+ || ($name eq 'propagateUpdates')
+ || ($name eq 'bytesPerLine')
+ || ($name eq 'scanLine')
+ || ($name eq 'hPal')
+ || ($name eq 'copyX11Data')
+ || ($name eq 'getX11Data')
+ || ($name eq 'setX11Data')
+ || ($name eq 'realizePal')
+ || ($name eq 'qwsDisplay')
+ || ($name eq 'fixport')
+ || ($name eq 'hack_strrchr')
+ || ($name eq 'hack_strchr')
+ || ($name eq 'hack_strstr') ) )
+
+ || ($name eq 'virtual_hook')
+ || ($name =~ /_KShared_/)
+ || ($name eq 'qObject')
+ || ($name =~ /argv/)
+ || ($name =~ /argc/)
+ || ($name eq 'qt_emit')
+ || ($name eq 'qt_invoke')
+ || ($name eq 'qt_cast')
+ || ($name eq 'qt_property')
+ || ($name eq 'staticMetaObject')
+ # Assume only Qt classes have tr() and trUtf8() in their Q_OBJECT macro
+ || ($classNode->{astNodeName} !~ /^Q/ and $name eq 'tr')
+ || ($classNode->{astNodeName} !~ /^Q/ and $name eq 'trUtf8')
+ || $name eq 'trUtf8'
+ || $m->{Deprecated} ) {
+ $m->{NodeType} = 'deleted';
+ next;
+ }
+
+ my $argId = 0;
+ my $firstDefaultParam;
+ foreach my $arg ( @{$m->{ParamList}} ) {
+ # Look for first param with a default value
+ if ( defined $arg->{DefaultValue} && !defined $firstDefaultParam ) {
+ $firstDefaultParam = $argId;
+ }
+
+ if ( $arg->{ArgType} eq '...' # refuse a method with variable arguments
+ or $arg->{ArgType} eq 'image_io_handler' # QImage's callback
+ or $arg->{ArgType} eq 'DecoderFn' # QFile's callback
+ or $arg->{ArgType} eq 'EncoderFn' # QFile's callback
+ or $arg->{ArgType} =~ /bool \(\*\)\(QObject/ # QMetaObject's ctor
+ or $arg->{ArgType} eq 'QtStaticMetaObjectFunction' # QMetaObjectCleanUp's ctor with func pointer
+ or $arg->{ArgType} eq 'const QTextItem&' # ref to a private class in 3.2.0b1
+ or $arg->{ArgType} eq 'FILE*' # won't be able to handle that I think
+ or $arg->{ArgType} eq 'const KKeyNative&' #
+ ) {
+ $m->{NodeType} = 'deleted';
+ }
+ else
+ {
+ # Resolve type in full, e.g. for QSessionManager::RestartHint
+ # (QSessionManagerJBridge doesn't inherit QSessionManager)
+ $arg->{ArgType} = kalyptusDataDict::resolveType($arg->{ArgType}, $classNode, $rootnode);
+ registerType( $arg->{ArgType} );
+ $argId++;
+ }
+ }
+ $m->AddProp( "FirstDefaultParam", $firstDefaultParam );
+ $m->{ReturnType} = kalyptusDataDict::resolveType($m->{ReturnType}, $classNode, $rootnode) if ($m->{ReturnType});
+ registerType( $m->{ReturnType} );
+ }
+ elsif( $m->{NodeType} eq "enum" ) {
+ if ( ! $m->{astNodeName} ) {
+ $m->{Access} = 'protected';
+ }
+ my $fullEnumName = $className."::".$m->{astNodeName};
+ if ( ($fullEnumName eq 'KMimeType::Format' and $name eq 'compression')
+ || $m->{Deprecated} ) {
+ $m->{NodeType} = 'deleted';
+ next;
+ }
+
+ $classNode->{enumerations}{$m->{astNodeName}} = $fullEnumName;
+# if $m->{astNodeName} and $m->{Access} ne 'private';
+# if $m->{astNodeName} ;
+
+ # Define a type for this enum
+ registerType( $fullEnumName );
+
+ # Remember that it's an enum
+ findTypeEntry( $fullEnumName )->{isEnum} = 1;
+ }
+ elsif( $m->{NodeType} eq 'var' ) {
+ my $varType = $m->{Type};
+ # We are interested in public static vars, like QColor::blue
+ if ( $varType =~ s/static\s+// && $m->{Access} ne 'private'
+ && $className."::".$m->{astNodeName} ne "KSpell::modalListText" )
+ {
+ $varType =~ s/const\s+(.*)\s*&/$1/;
+ $varType =~ s/\s*$//;
+ print STDERR "var: $m->{astNodeName} '$varType'\n" if ($debug);
+
+ # Register the type
+ registerType( $varType );
+
+ } else {
+ # To avoid duplicating the above test, we just get rid of any other var
+ $m->{NodeType} = 'deleted';
+ }
+ }
+ },
+ undef
+ );
+ $main::doPrivate = $doPrivate;
+
+ print STDERR "$className: ctor count: $constructorCount, hasPublicProtectedConstructor: $hasPublicProtectedConstructor, hasCopyConstructor: $hasCopyConstructor:, defaultConstructor: $defaultConstructor, hasPublicDestructor: $hasPublicDestructor, hasPrivatePureVirtual:$hasPrivatePureVirtual\n" if ($debug);
+
+ # Note that if the class has _no_ constructor, the default ctor applies. Let's even generate it.
+ if ( !$constructorCount && $defaultConstructor eq 'none' && !$hasPrivatePureVirtual ) {
+ # Create a method node for the constructor
+ my $methodNode = Ast::New( $classNode->{astNodeName} );
+ $methodNode->AddProp( "NodeType", "method" );
+ $methodNode->AddProp( "Flags", "" );
+ $methodNode->AddProp( "Params", "" );
+ $methodNode->AddProp( "ParamList", [] );
+ kdocAstUtil::attachChild( $classNode, $methodNode );
+
+ # Hack the return type for constructors, since constructors return an object pointer
+ $methodNode->AddProp( "ReturnType", $className."*" );
+ registerType( $className."*" );
+ $methodNode->AddProp( "Access", "public" ); # after attachChild
+ $defaultConstructor = 'public';
+ $hasPublicProtectedConstructor = 1;
+ }
+
+ # Also, if the class has no explicit destructor, generate a default one.
+ if ( !$hasDestructor && !$hasPrivatePureVirtual ) {
+ my $methodNode = Ast::New( "$classNode->{astNodeName}" );
+ $methodNode->AddProp( "NodeType", "method" );
+ $methodNode->AddProp( "Flags", "" );
+ $methodNode->AddProp( "Params", "" );
+ $methodNode->AddProp( "ParamList", [] );
+ kdocAstUtil::attachChild( $classNode, $methodNode );
+
+ $methodNode->AddProp( "ReturnType", "~" );
+ $methodNode->AddProp( "Access", "public" );
+ }
+
+ # If we have a private pure virtual, then the class can't be instanciated (e.g. QCanvasItem)
+ # Same if the class has only private constructors (e.g. QInputDialog)
+ $classNode->AddProp( "CanBeInstanciated", $hasPublicProtectedConstructor
+# && !$hasPrivatePureVirtual
+ && (!$classNode->{Pure} or $classNode->{astNodeName} eq 'QValidator')
+ && !($classNode->{NodeType} eq 'namespace')
+ && ($classNode->{astNodeName} !~ /^DrawContentsEvent$|^MouseEvent$|^MouseDoubleClickEvent$|^MouseMoveEvent$|^MouseReleaseEvent$|^MousePressEvent$/)
+ && ($classNode->{astNodeName} !~ /QMetaObject|QDragObject|Slave|CopyJob|KMdiChildFrm|KNamedCommand/) );
+
+ # We will derive from the class only if it has public or protected constructors.
+ # (_Even_ if it has pure virtuals. But in that case the *.cpp class can't be instantiated either.)
+ $classNode->AddProp( "BindingDerives", $hasPublicProtectedConstructor );
+
+ # We need a public dtor to destroy the object --- ### aren't protected dtors ok too ??
+ $classNode->AddProp( "HasPublicDestructor", $hasPublicDestructor );
+
+ # Hack for QAsyncIO. We don't implement the "if a class has no explicit copy ctor,
+ # then all of its member variables must be copiable, otherwise the class isn't copiable".
+ $hasPrivateCopyConstructor = 1 if ( $className eq 'QAsyncIO' );
+
+ # Remember if this class can't be copied - it means all its descendants can't either
+ $classNode->AddProp( "CanBeCopied", !$hasPrivateCopyConstructor );
+ $classNode->AddProp( "HasCopyConstructor", $hasCopyConstructor );
+}
+
+sub propagateCanBeCopied($)
+{
+ my $classNode = shift;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+ my @super = superclass_list($classNode);
+ # A class can only be copied if none of its ancestors have a private copy ctor.
+ for my $s (@super) {
+ if (!$s->{CanBeCopied}) {
+ $classNode->{CanBeCopied} = 0;
+ print STDERR "$classNode->{astNodeName} cannot be copied\n" if ($debug);
+ last;
+ }
+ }
+
+ # Prepare the {case} dict for the class
+ prepareCaseDict( $classNode );
+}
+
+=head2 writeClassDoc
+
+ Called by writeDoc for each class to be written out
+
+=cut
+
+sub writeClassDoc
+{
+ my( $node ) = @_;
+ my $className = join( "::", kdocAstUtil::heritage($node) );
+ my $javaClassName = $node->{astNodeName};
+ # Makefile doesn't like '::' in filenames, so use __
+ my $fileName = $node->{astNodeName};
+# my $fileName = join( "__", kdocAstUtil::heritage($node) );
+ print "Enter: $className\n" if $debug;
+
+ my $typeprefix = ($className =~ /^Q/ ? "qt_" : "kde_");
+ my $packagename = ($typeprefix eq 'qt_' ? "org.kde.qt" : "org.kde.koala");
+
+ # Write out the *.java file
+ my $classFile = "$outputdir/$fileName.java";
+ open( CLASS, ">$classFile" ) || die "Couldn't create $classFile\n";
+ print STDERR "Writing $fileName.java\n" if ($debug);
+
+ print CLASS "//Auto-generated by $0. DO NOT EDIT.\n";
+
+ print CLASS "package $packagename;\n\n";
+
+ # And write out the *.cpp file
+ my $jniFile = "$outputdir/$fileName.cpp";
+ open( JNISOURCE, ">$jniFile" ) || die "Couldn't create $jniFile\n";
+ print STDERR "Writing $fileName.cpp\n" if ($debug);
+
+ print JNISOURCE "//Auto-generated by $0. DO NOT EDIT.\n";
+
+ my %javaMethods = ();
+ my %jniMethods = ();
+ my $jniCode;
+ my %addImport = ();
+ my %addInclude = ();
+
+ my @ancestors = ();
+ my @ancestor_nodes = ();
+ Iter::Ancestors( $node, $rootnode, undef, undef, sub {
+ my ( $ances, $name, $type, $template ) = @_;
+ if ( $name ne "QMemArray" and $name ne "QArray" and $name ne "QSqlFieldInfoList" ) {
+ push @ancestor_nodes, $ances;
+ push @ancestors, $name;
+ }
+ },
+ undef
+ );
+
+ my ($methodCode, $interfaceCode, $signalCode, $jbridgeCode) = generateAllMethods( $node, $#ancestors + 1,
+ \%javaMethods, \%jniMethods,
+ $node,
+ ($node->{NodeType} eq 'namespace' ? 0 : 1),
+ \%addImport, \%addInclude );
+
+ my $signalFile = "$outputdir/$fileName" . "Signals.java";
+ if ( $signalCode ne '' ) {
+ open( SIGNALS, ">$signalFile" ) || die "Couldn't create $signalFile\n";
+ print SIGNALS "//Auto-generated by $0. DO NOT EDIT.\n";
+ print SIGNALS "package $packagename;\n\n";
+ }
+
+ my $tempMethodNumber = $methodNumber;
+
+ # Add method calls for the interfaces implemented by the class
+ foreach my $ancestor_node ( @ancestor_nodes ) {
+ if ( kalyptusDataDict::interfacemap($ancestor_node->{astNodeName}) ne () && ($#ancestors > 0) ) {
+ my ($meth, $interf, $sig, $jbridge) = generateAllMethods( $ancestor_node, 0, \%javaMethods, \%jniMethods, $node, 0, \%addImport, \%addInclude );
+ $methodCode .= $meth;
+ $jbridgeCode .= $jbridge;
+ }
+ }
+
+
+ if ( $className eq 'Qt' or $className eq 'KDE' ) {
+ my $globalSpace = kdocAstUtil::findRef( $rootnode, $main::globalSpaceClassName );
+ my ($meth, $interf, $sig, $jbridge) = generateAllMethods( $globalSpace, 0, \%javaMethods, \%jniMethods, $node, 0, \%addImport, \%addInclude );
+ $methodCode .= $meth;
+ $jbridgeCode .= $jbridge;
+ }
+
+
+ $jbridgeCode .= virtualMethodCallbacks( $node );
+
+ $methodNumber = $tempMethodNumber;
+
+ if ( $className eq 'Qt' ) {
+ print CLASS "import java.io.*;\n";
+ print CLASS "import java.text.MessageFormat;\n";
+ print CLASS "import java.lang.reflect.*;\n";
+ } else {
+ if ( $className eq 'QListView' or $className eq 'QListViewItem' or $className eq 'QUriDrag' ) {
+ # Special case these two classes as they have methods that use ArrayList added as 'extras'
+ print CLASS "import java.util.ArrayList;\n";
+ }
+ print CLASS "import org.kde.qt.Qt;\n";
+ }
+
+ if ( kalyptusDataDict::interfacemap($javaClassName) ne () ) {
+ my $interfaceFile = "$outputdir/" . kalyptusDataDict::interfacemap($javaClassName) . ".java";
+ open( INTERFACE, ">$interfaceFile" ) || die "Couldn't create $interfaceFile\n";
+ print INTERFACE "//Auto-generated by $0. DO NOT EDIT.\n";
+ print INTERFACE "package $packagename;\n\n";
+ }
+
+ foreach my $imp (keys %addImport) {
+ die if $imp eq '';
+ # Ignore any imports for classes in the same package as the current class
+ if ($imp !~ /$packagename/) {
+ print CLASS "import $imp;\n";
+ print INTERFACE "import $imp;\n";
+ print SIGNALS "import $imp;\n" unless $signalCode eq '';;
+ }
+ }
+
+ if ( kalyptusDataDict::interfacemap($javaClassName) ne () ) {
+ print INTERFACE "\npublic interface " . kalyptusDataDict::interfacemap($javaClassName) . " {\n";
+ print INTERFACE $interfaceCode;
+ print INTERFACE "}\n";
+ close INTERFACE;
+ }
+
+ my $classdec;
+ if ($node->{NodeType} eq 'namespace') {
+ $classdec = "public class $javaClassName {\n";
+ } elsif ( $#ancestors < 0 ) {
+ $classdec = "public class $javaClassName implements QtSupport";
+ if ( kalyptusDataDict::interfacemap($javaClassName) ne () ) {
+ $classdec .= ", " . kalyptusDataDict::interfacemap($javaClassName);
+ }
+
+ $classdec .= " {\n\tprivate long _qt;\n";
+ $classdec .= "\tprivate boolean _allocatedInJavaWorld = true;\n";
+ $classdec .= "\tprotected $javaClassName(Class dummy){}\n\n";
+ } else {
+ $classdec = "public class $javaClassName extends ";
+ my $ancestor;
+ foreach $ancestor ( @ancestors ) {
+ if ( kalyptusDataDict::interfacemap($ancestor) eq () or $ancestor eq @ancestors[$#ancestors] ) {
+ $ancestor =~ s/^.*:://;
+ $classdec .= "$ancestor ";
+ if ( $typeprefix ne 'qt_' and $ancestor =~ /^Q/ ) {
+ print CLASS "import org.kde.qt.$ancestor;\n";
+ }
+ last;
+ }
+ }
+
+ my @implements = ();
+ if ( $#ancestors >= 1 ) {
+ foreach $ancestor ( @ancestors ) {
+ if ( kalyptusDataDict::interfacemap($ancestor) ne () ) {
+ push(@implements, kalyptusDataDict::interfacemap($ancestor));
+ }
+ }
+ }
+
+ if ($#implements >= 0) {
+ $classdec .= "implements ";
+ $classdec .= join(", ", @implements);
+ }
+
+ $classdec .= " {\n";
+ $classdec .= "\tprotected $javaClassName(Class dummy){super((Class) null);}\n";
+ }
+
+ print CLASS "\n";
+ if ( $javaClassName !~ /^Q/ or $signalCode ne '' ) {
+ my $signalLink = '';
+ if ( $signalCode ne '' ) {
+ print SIGNALS "\npublic interface $javaClassName" . "Signals {\n";
+ print SIGNALS $signalCode;
+ print SIGNALS "}\n";
+ close SIGNALS;
+
+ $signalLink = " See {\@link $javaClassName" . "Signals} for signals emitted by $javaClassName\n";
+ }
+ my $docnode = $node->{DocNode};
+ print CLASS "/**\n";
+ if ( defined $docnode ) {
+ print CLASS printJavadocComment( $docnode, "", "", $signalLink ) . "\n"
+ } else {
+ print CLASS $signalLink;
+ }
+ print CLASS "*/\n";
+ }
+
+ print CLASS $classdec;
+ print CLASS $methodCode;
+
+ my %jniNames;
+ my $name;
+ foreach my $methodName (keys %jniMethods) {
+ die if $methodName eq '';
+ $name = $methodName;
+ $name =~ s/(.*[^_])__[^1].*/$1/;
+ $name =~ s/(.*[^_])__$/$1/;
+ if (defined $jniNames{$name}) {
+ $jniNames{$name}++;
+ } else {
+ $jniNames{$name} = 1;
+ }
+ }
+
+ # Add the JNI functions sorted by name. And with the correct
+ # signature minus the arg types if name not duplicated
+ foreach my $methodName (sort keys %jniMethods) {
+ die if $methodName eq '';
+ my $methodCode = $jniMethods{$methodName};
+ $methodName =~ s/(.*[^_])__[^1].*/$1/;
+ $methodName =~ s/(.*[^_])__$/$1/;
+ if ($jniNames{$methodName} == 1) {
+ $methodCode =~ s/__\(/\(/;
+ $methodCode =~ s/__[^1][^\(]*\(/\(/;
+ }
+ $jniCode .= $methodCode;
+ }
+
+ if ( $className eq 'Qt' ) {
+ if ($main::qt_embedded) {
+ $qtExtras =~ s/public static native QCursor whatsThisCursor\(\);//;
+ $qtjniExtras =~ s/JNIEXPORT jobject JNICALL\nJava_org_kde_qt_Qt_whatsThisCursor[^}]*}//;
+ }
+ print CLASS $qtExtras;
+ $jniCode .= $qtjniExtras;
+ } elsif ( $className eq 'QApplication' ) {
+ print CLASS $qapplicationExtras;
+ $jniCode .= $qapplicationjniExtras;
+ } elsif ( $className eq 'QBitmap' ) {
+ print CLASS $qbitmapExtras;
+ $jniCode .= $qbitmapjniExtras;
+ } elsif ( $className eq 'QDropEvent' ) {
+ print CLASS $qdropeventExtras;
+ $jniCode .= $qdropeventjniExtras;
+ } elsif ( $className eq 'QDragObject' ) {
+ print CLASS $qdragobjectExtras;
+ $jniCode .= $qdragobjectjniExtras;
+ } elsif ( $className eq 'QObject' ) {
+ print CLASS $qobjectExtras;
+ $jniCode .= $qobjectjniExtras;
+ } elsif ( $className eq 'QImage' ) {
+ $jniCode .= $qimagejniExtras;
+ } elsif ( $className eq 'QListView' ) {
+ print CLASS $qlistviewExtras;
+ $jniCode .= $qlistviewjniExtras;
+ } elsif ( $className eq 'QListViewItem' ) {
+ print CLASS $qlistviewitemExtras;
+ $jniCode .= $qlistviewitemjniExtras;
+ } elsif ( $className eq 'QMenuBar' ) {
+ if ($main::qt_embedded) {
+ $qmenubarjniExtras =~ s/jobject accel/jlong accel/;
+ }
+ $jniCode .= $qmenubarjniExtras;
+ } elsif ( $className eq 'QMenuData' ) {
+ if ($main::qt_embedded) {
+ $qmenudatajniExtras =~ s/jobject accel/jlong accel/;
+ }
+ $jniCode .= $qmenudatajniExtras;
+ } elsif ( $className eq 'QMimeSource' ) {
+ print CLASS $qmimesourceExtras;
+ $jniCode .= $qmimesourcejniExtras;
+ } elsif ( $className eq 'QPopupMenu' ) {
+ if ($main::qt_embedded) {
+ $qpopupmenujniExtras =~ s/jobject accel/jlong accel/;
+ }
+ $jniCode .= $qpopupmenujniExtras;
+ } elsif ( $className eq 'QWidget' ) {
+ print CLASS $qwidgetExtras;
+ $jniCode .= $qwidgetjniExtras;
+ } elsif ( $className eq 'QPaintDevice' ) {
+ print CLASS $qpaintdeviceExtras;
+ $jniCode .= $qpaintdevicejniExtras;
+ } elsif ( $className eq 'QPixmap' ) {
+ print CLASS $qpixmapExtras;
+ $jniCode .= $qpixmapjniExtras;
+ } elsif ( $className eq 'QIODevice' ) {
+ print CLASS $qiodeviceExtras;
+ } elsif ( $className eq 'QPointArray' ) {
+ print CLASS $qpointarrayExtras;
+ $jniCode .= $qpointarrayjniExtras;
+ } elsif ( $className eq 'QUriDrag' ) {
+ print CLASS $quridragExtras;
+ $jniCode .= $quridragjniExtras;
+ } elsif ( $className eq 'KCmdLineArgs' ) {
+ $jniCode .= $kcmdlineargsjniExtras;
+ } elsif ( $className eq 'KIO::Scheduler' ) {
+ $jniCode .= $schedulerjniExtras;
+ } elsif ( $className eq 'KApplication' ) {
+ print CLASS $kapplicationExtras;
+ $jniCode .= $kapplicationjniExtras;
+ } elsif ( $className eq 'KMainWindow' ) {
+ print CLASS $kmainwindowExtras;
+ $jniCode .= $kmainwindowjniExtras;
+ }
+
+ print CLASS "}\n";
+ close CLASS;
+
+ foreach my $incl (keys %addInclude) {
+ die if $incl eq '';
+ print JNISOURCE "#include <$incl>\n";
+ }
+
+ print JNISOURCE "\n";
+ print JNISOURCE "#include <qtjava/QtSupport.h>\n";
+
+ if ($jniCode =~ /JavaSlot/) {
+ print JNISOURCE "#include <qtjava/JavaSlot.h>\n";
+ }
+
+ if ( $typeprefix eq "qt_" ) {
+ print JNISOURCE "#include <qtjava/$javaClassName" . ".h>\n";
+ } else {
+ print JNISOURCE "#include <kdejava/KDESupport.h>\n";
+ print JNISOURCE "#include <kdejava/$javaClassName" . ".h>\n";
+ }
+
+ if ($javaClassName eq 'KIO') {
+ # Hack: namespaces can be defined in several source files, which doesn't work, so this..
+ print JNISOURCE "#include <kio/job.h>\n";
+ print JNISOURCE "#include <kio/davjob.h>\n";
+ print JNISOURCE "#include <kio/metainfojob.h>\n";
+ print JNISOURCE "#include <kio/previewjob.h>\n";
+ print JNISOURCE "#include <kio/paste.h>\n";
+ }
+
+ print JNISOURCE "\n";
+
+ if ($jbridgeCode ne '' && $node->{CanBeInstanciated}) {
+ print JNISOURCE "class $javaClassName" . "JBridge : public $className\n";
+ print JNISOURCE "{\npublic:\n";
+ print JNISOURCE $jbridgeCode;
+ print JNISOURCE "};\n\n"
+ }
+ print JNISOURCE $jniCode;
+ close JNISOURCE;
+}
+
+
+# Generate the prototypes for a method (one per arg with a default value)
+# Helper for makeprotos
+sub iterproto($$$$$) {
+ my $classidx = shift; # to check if a class exists
+ my $method = shift;
+ my $proto = shift;
+ my $idx = shift;
+ my $protolist = shift;
+
+ my $argcnt = scalar @{ $method->{ParamList} } - 1;
+ if($idx > $argcnt) {
+ push @$protolist, $proto;
+ return;
+ }
+ if(defined $method->{FirstDefaultParam} and $method->{FirstDefaultParam} <= $idx) {
+ push @$protolist, $proto;
+ }
+
+ my $arg = $method->{ParamList}[$idx]->{ArgType};
+
+ my $typeEntry = findTypeEntry( $arg );
+ my $realType = $typeEntry->{realType};
+
+ # A scalar ?
+ $arg =~ s/\bconst\b//g;
+ $arg =~ s/\s+//g;
+ if($typeEntry->{isEnum} || $allTypes{$realType}{isEnum} || exists $typeunion{$realType} || exists $mungedTypeMap{$arg})
+ {
+ my $id = '$'; # a 'scalar
+ $id = '?' if $arg =~ /[*&]{2}/;
+ $id = $mungedTypeMap{$arg} if exists $mungedTypeMap{$arg};
+ iterproto($classidx, $method, $proto . $id, $idx + 1, $protolist);
+ return;
+ }
+
+ # A class ?
+ if(exists $classidx->{$realType}) {
+ iterproto($classidx, $method, $proto . '#', $idx + 1, $protolist);
+ return;
+ }
+
+ # A non-scalar (reference to array or hash, undef)
+ iterproto($classidx, $method, $proto . '?', $idx + 1, $protolist);
+ return;
+}
+
+# Generate the prototypes for a method (one per arg with a default value)
+sub makeprotos($$$) {
+ my $classidx = shift;
+ my $method = shift;
+ my $protolist = shift;
+ iterproto($classidx, $method, $method->{astNodeName}, 0, $protolist);
+}
+
+# Return the string containing the signature for this method (without return type).
+# If the 2nd arg is not the size of $m->{ParamList}, this method returns a
+# partial signature (this is used to handle default values).
+sub methodSignature($$) {
+ my $method = shift;
+ my $last = shift;
+ my $sig = $method->{astNodeName};
+ my @argTypeList;
+ my $argId = 0;
+ foreach my $arg ( @{$method->{ParamList}} ) {
+ last if $argId > $last;
+ push @argTypeList, $arg->{ArgType};
+ $argId++;
+ }
+ $sig .= "(". join(", ",@argTypeList) .")";
+ $sig .= " const" if $method->{Flags} =~ "c";
+ return $sig;
+}
+
+# Return the string containing the java signature for this method (without return type).
+# If the 2nd arg is not the size of $m->{ParamList}, this method returns a
+# partial signature (this is used to handle default values).
+sub javaMethodSignature($$) {
+ my $method = shift;
+ my $last = shift;
+ my $sig = $method->{astNodeName};
+ my @argTypeList;
+ my $argId = 0;
+ foreach my $arg ( @{$method->{ParamList}} ) {
+ $argId++;
+ last if $argId > $last;
+ push @argTypeList, "arg" . "$argId ". cplusplusToJava( $arg->{ArgType} );
+ }
+ $sig .= "(". join(", ",@argTypeList) .")";
+ return $sig;
+}
+
+# Return the string containing the JNI signature for this method (without return type).
+# If the 2nd arg is not the size of $m->{ParamList}, this method returns a
+# partial signature (this is used to handle default values).
+sub jniMethodSignature($$$$$) {
+ my $method = shift;
+ my $methodname = shift;
+ my $last = shift;
+ my $javaClassName = shift;
+ my $javaArgList = shift;
+
+ my $sig = ($javaClassName =~ /^Q/ ? "Java_org_kde_qt_" : "Java_org_kde_koala_");
+ $sig .= $javaClassName . "_";
+ $methodname =~ s/_/_1/g;
+ $sig .= $methodname . "__";
+ my @argTypeList;
+ my @argList;
+ my $javaStatic = ($method->{Flags} =~ "s" or $method->{Parent}->{NodeType} eq 'namespace');
+ push @argTypeList, "JNIEnv*";
+ push @argTypeList, ($javaStatic ? "jclass" : "jobject");
+ push @argList, "JNIEnv* env";
+ push @argList, ($javaStatic ? "jclass cls" : "jobject obj");
+ my $argId = 0;
+ foreach my $arg ( @{$method->{ParamList}} ) {
+ $argId++;
+ last if $argId > $last;
+ push @argTypeList, cplusplusToJNI( $arg->{ArgType} );
+ push @argList, cplusplusToJNI( $arg->{ArgType} ) . " " . $javaArgList->[$argId - 1];
+ $sig .= cplusplusToJNISignature( $arg->{ArgType} );
+ }
+ my $call = $sig;
+ $sig .= "(" . join(", ",@argTypeList) .")";
+ $call .= "(" . join(", ",@argList) .")";
+ return ( $sig, $call );
+}
+
+sub coerce_type($$$$) {
+ #my $m = shift;
+ my $union = shift;
+ my $var = shift;
+ my $type = shift;
+ my $new = shift; # 1 if this is a return value, 0 for a normal param
+
+ my $typeEntry = findTypeEntry( $type );
+ my $realType = $typeEntry->{realType};
+
+ my $unionfield = $typeEntry->{typeId};
+# die "$type" unless defined( $unionfield );
+ if ( ! defined( $unionfield ) ) {
+ print STDERR "type field not defined: $type\n";
+ return "";
+ }
+
+ $unionfield =~ s/t_/s_/;
+
+ $type =~ s/\s+const$//; # for 'char* const'
+ $type =~ s/\s+const\s*\*$/\*/; # for 'char* const*'
+
+ my $code = "$union.$unionfield = ";
+ if($type =~ /&$/) {
+ $code .= "(void*)&$var;\n";
+ } elsif($type =~ /\*$/) {
+ $code .= "(void*)$var;\n";
+ } else {
+ if ( $unionfield eq 's_class'
+ or ( $unionfield eq 's_voidp' and $type ne 'void*' )
+ or $type eq 'QString' ) { # hack
+ $type =~ s/^const\s+//;
+ if($new) {
+ $code .= "(void*)new $type($var);\n";
+ } else {
+ $code .= "(void*)&$var;\n";
+ }
+ } else {
+ $code .= "$var;\n";
+ }
+ }
+
+ return $code;
+}
+
+# Generate the list of args casted to their real type, e.g.
+# (QObject*)x[1].s_class,(QEvent*)x[2].s_class,x[3].s_int
+sub makeCastedArgList
+{
+ my @castedList;
+ my $i = 1; # The args start at x[1]. x[0] is the return value
+ my $arg;
+ foreach $arg (@_) {
+ my $type = $arg;
+ my $cast;
+
+ my $typeEntry = findTypeEntry( $type );
+ my $unionfield = $typeEntry->{typeId};
+# die "$type" unless defined( $unionfield );
+ if ( ! defined( $unionfield ) ) {
+ print STDERR "type field not defined: $type\n";
+ return "";
+ }
+ $unionfield =~ s/t_/s_/;
+
+ $type =~ s/\s+const$//; # for 'char* const'
+ $type =~ s/\s+const\s*\*$/\*/; # for 'char* const*'
+
+ my $v .= " arg$i";
+ if($type =~ /&$/) {
+ $cast = "*($type *)";
+ } elsif($type =~ /\*$/) {
+ $cast = "($type)";
+ } elsif($type =~ /\(\*\)\s*\(/) { # function pointer ... (*)(...)
+ $cast = "($type)";
+ } else {
+ if ( $unionfield eq 's_class'
+ or ( $unionfield eq 's_voidp' and $type ne 'void*' )
+ or $type eq 'QString' ) { # hack
+ $cast = "*($type *)";
+ } else {
+ $cast = "($type)";
+ }
+ }
+ push @castedList, "$type$v";
+ $i++;
+ }
+ return @castedList;
+}
+
+# Adds the header for node $1 to be included in $2 if not already there
+# Prints out debug stuff if $3
+sub addIncludeForClass($$$)
+{
+ my ( $node, $addInclude, $debugMe ) = @_;
+ my $sourcename = $node->{Source}->{astNodeName};
+ if ( $sourcename !~ s!.*(kio/|kparts/|dom/|kabc/|ksettings/|kjs/|ktexteditor/|kdeprint/|kdesu/)(.*)!$1$2!m ) {
+ $sourcename =~ s!.*/(.*)!$1!m;
+ }
+# die "Empty source name for $node->{astNodeName}" if ( $sourcename eq '' );
+ return if ( $sourcename eq '' );
+ unless ( defined $addInclude->{$sourcename} ) {
+ print " Including $sourcename\n" if ($debugMe);
+ $addInclude->{$sourcename} = 1;
+ }
+ else { print " $sourcename already included.\n" if ($debugMe); }
+}
+
+sub checkIncludesForObject($$)
+{
+ my $type = shift;
+ my $addInclude = shift;
+
+ my $debugCI = 0; #$debug
+ #print "checkIncludesForObject $type\n";
+ $type =~ s/const\s+//;
+ my $it = $type;
+ if (!($it and exists $typeunion{$it}) and $type !~ /\*/ and $type ne ""
+ #and $type !~ /&/ # in fact we also want refs, due to the generated code
+ ) {
+ $type =~ s/&//;
+ print " Detecting an object by value/ref: $type\n" if ($debugCI);
+ my $node = kdocAstUtil::findRef( $rootnode, $type );
+ if ($node) {
+ addIncludeForClass( $node, $addInclude, $debugCI );
+ }
+ else { print " No header found for $type\n" if ($debugCI); }
+ }
+}
+
+
+
+# Adds the import for node $1 to be imported in $2 if not already there
+# Prints out debug stuff if $3
+sub addImportForClass($$$)
+{
+ my ( $node, $addImport, $debugMe ) = @_;
+ my $importname = javaImport( $node->{astNodeName} );
+# print " Importing $importname for node name: " . $node->{astNodeName} . "\n";
+ # No import needed, so return
+ return if ( $importname eq '' );
+ unless ( defined $addImport->{$importname} ) {
+ print " Importing $importname\n" if ($debugMe);
+ $addImport->{$importname} = 1;
+ if ( kalyptusDataDict::interfacemap($node->{astNodeName}) ) {
+ $addImport->{$importname . "Interface"} = 1;
+ }
+ }
+ else { print " $importname already imported.\n" if ($debugMe); }
+}
+
+sub checkImportsForObject($$)
+{
+ my $type = shift;
+ my $addImport = shift;
+
+ my $debugCI = 0; #$debug
+ # print "checkImportsForObject $type\n";
+ $type =~ s/const\s+//;
+ my $it = $type;
+ if (!($it and exists $typeunion{$it}) and $type ne ""
+ #and $type !~ /&/ # in fact we also want refs, due to the generated code
+ ) {
+ $type =~ s/&//;
+ $type =~ s/[*]//;
+ print " Detecting an object by value/ref: $type\n" if ($debugCI);
+ my $node = kdocAstUtil::findRef( $rootnode, $type );
+ if ($node and $node->{NodeType} eq "class" ) {
+ print " NodeType: " . $node->{NodeType} . "\n" if ($debugCI);
+ addImportForClass( $node, $addImport, $debugCI );
+ }
+ else {
+ if ( cplusplusToJava($it) eq 'ArrayList' ) {
+ $addImport->{"java.util.ArrayList"} = 1;
+ } else {
+ print " No import found for $type\n" if ($debugCI);
+ }
+ }
+ }
+}
+
+sub generateVirtualMethod($$$$$)
+{
+ # Generating methods for $class.
+ # $m: method node. $methodClass: the node of the class in which the method is really declared
+ # (can be different from $class when the method comes from a super class)
+ # This is important because of $allMethods, which has no entry for class::method in that case.
+
+ my( $classNode, $signature, $m, $methodClass, $addImport ) = @_;
+ my $methodCode = ''; # output
+ my $returnType = $m->{ReturnType};
+ return ('', '') if $returnType eq '~'; # skip destructors
+
+ my $className = $classNode->{astNodeName};
+ my $flags = $m->{Flags};
+ my @argList = @{$m->{ParamList}};
+
+ print "generateVirtualMethod $className: $signature ($m->{Access})\n" if ($debug);
+
+ # Detect objects returned by value
+ checkImportsForObject( $returnType, $addImport ) if ($returnType ne 'void');
+
+ # Generate a matching virtual method in the x_ class
+ $methodCode .= "\tvirtual $returnType $m->{astNodeName}(";
+ my $i = 0;
+ foreach my $arg ( @argList ) {
+ $methodCode .= ", " if $i++;
+ $methodCode .= $arg->{ArgType};
+ $methodCode .= " x$i";
+
+ # Detect objects passed by value
+ checkImportsForObject( $arg->{ArgType}, $addImport );
+ }
+ $methodCode .= ") ";
+ $methodCode .= "const " if ($flags =~ "c");
+ $methodCode .= "\{\n";
+
+ # Now the code of the method
+ my $this = $classNode->{BindingDerives} > 0 ? "this" : "xthis";
+
+ $i++; # Now the number of args
+ $methodCode .= "\tSmoke::StackItem x[$i];\n";
+ $i = 1;
+ for my $arg (@argList) {
+ $methodCode .= "\t";
+ $methodCode .= coerce_type("x[$i]", "x$i", $arg->{ArgType}, 0);
+ $i++;
+ }
+
+ my $sig = $methodClass->{astNodeName} . "::" . $signature;
+ my $idx = $allMethods{$sig};
+# die "generateVirtualMethod: $className: No method found for $sig\n" if !defined $idx;
+ if ( !defined $idx ) {
+ print STDERR "generateVirtualMethod: $className: No method found for $sig\n";
+ return "";
+ }
+
+ if($flags =~ "p") { # pure virtual
+ $methodCode .= "\t${libname}_Smoke->binding->callMethod($idx, (void*)$this, x, true /*pure virtual*/);\n";
+ } else {
+ $methodCode .= "\tif(${libname}_Smoke->binding->callMethod($idx, (void*)$this, x)) ";
+ }
+
+ $returnType = undef if ($returnType eq 'void');
+ if($returnType) {
+ my $arg = $returnType;
+ my $it = $arg;
+ my $cast;
+ my $v = "x[0]";
+ my $indent = ($flags =~ "p") ? "\t" : "";
+ if($it and exists $typeunion{$it}) {
+ $v .= ".$typeunion{$it}";
+ $cast = "($arg)";
+ $methodCode .= "${indent}return $cast$v;\n";
+ } else {
+ $v .= ".s_class";
+ if($arg =~ s/&//) {
+ $cast = "*($arg *)";
+ $methodCode .= "${indent}return $cast$v;\n";
+ } elsif($arg !~ /\*/) {
+ unless($flags =~ "p") {
+ $indent = "\t ";
+ $methodCode .= "{\n";
+ }
+ # we assume it's a new thing, and handle it
+ $methodCode .= "${indent}$arg *xptr = ($arg *)$v;\n";
+ $methodCode .= "${indent}$arg xret(*xptr);\n";
+ $methodCode .= "${indent}delete xptr;\n";
+ $methodCode .= "${indent}return xret;\n";
+ $methodCode .= "\t}\n" unless $flags =~ "p";
+ } else {
+ $cast = "($arg)";
+ $methodCode .= "${indent}return $cast$v;\n";
+ }
+ }
+ } else {
+ $methodCode .= "\t" if $flags =~ "p";
+ $methodCode .= "return;\n";
+ }
+ if($flags =~ "p") {
+ $methodCode .= "\t// ABSTRACT\n";
+ $methodCode .= " }\n";
+ return ( $methodCode );
+ }
+ $methodCode .= "\t";
+ if($returnType) {
+ $methodCode .= "return ";
+ }
+ $methodCode .= "$this\->$methodClass->{astNodeName}\::$m->{astNodeName}(";
+ $i = 0;
+ for my $arg (@argList) {
+ $methodCode .= ", " if $i++;
+ $methodCode .= "x$i";
+ }
+ $methodCode .= ");\n";
+ $methodCode .= "\t}\n";
+ return ( $methodCode );
+}
+
+sub generateMethod($$$$$$$$$)
+{
+ my( $classNode, $m, $addImport, $addInclude, $ancestorCount, $javaMethods, $jniMethods, $mainClassNode, $generateConstructors ) = @_; # input
+ my $methodCode = ''; # output
+ my $interfaceCode = ''; # output
+ my $signalCode = ''; # output
+ my $jbridgeCode = ''; # output
+
+ my $jniCode;
+ my $name = $m->{astNodeName}; # method name
+
+ my @heritage = kdocAstUtil::heritage($classNode);
+ my $className = join( "::", @heritage );
+
+ @heritage = kdocAstUtil::heritage($mainClassNode);
+ my $mainClassName = join( "::", @heritage );
+
+ # The javaClassName might be 'QWidget', while currentClassName is 'QRangeControl'
+ # and the QRangeControl methods are being copied into QWidget.
+ my $javaClassName = $mainClassNode->{astNodeName};
+ my $currentClassName = $classNode->{astNodeName};
+
+ my $bridgeClassName;
+ if ($classNode->{astNodeName} eq $main::globalSpaceClassName) {
+ $bridgeClassName = "";
+ } elsif (!$mainClassNode->{CanBeInstanciated}) {
+ $bridgeClassName = $className;
+ } else {
+ $bridgeClassName = $mainClassNode->{astNodeName} . "JBridge";
+ }
+
+ my $firstUnknownArgType = 99;
+ my $returnType = $m->{ReturnType};
+
+ # Don't use $className here, it's never the fully qualified (A::B) name for a ctor.
+ my $isConstructor = ($name eq $classNode->{astNodeName} );
+ my $isDestructor = ($returnType eq '~');
+
+ # Don't generate anything for destructors, or constructors for namespaces
+ return if $isDestructor
+ or ($classNode->{NodeType} eq 'namespace' and $isConstructor)
+ or (!$mainClassNode->{CanBeInstanciated} and $m->{Access} =~ /protected/);
+
+ # Rename operator methods 'op_...'
+ if ( $name =~ /^operator.*/ ) {
+ $methodNumber++;
+ $name =~ s/ //;
+ if (! exists $operatorNames{$name} ) {
+ return;
+ }
+ $name = $operatorNames{$name};
+ }
+
+ if ($classNode->{astNodeName} eq $main::globalSpaceClassName) {
+ my $sourcename = $m->{Source}->{astNodeName};
+ # Only put Global methods which came from sources beginning with q into class Qt
+ # Skip any methods in qstring.h/qcstring.h apart from QByteArray compress/uncompress
+ if ($javaClassName eq 'Qt'
+ and ( $sourcename !~ /\/q[^\/]*$/ or ($sourcename =~ /string.h$/ and $name !~ /[Cc]ompress/) )) {
+ return;
+ }
+ # ..and any other global methods into KDE
+ if ($javaClassName eq 'KDE' and $m->{Source}->{astNodeName} =~ /\/q[^\/]*$/) {
+ return;
+ }
+
+ if ( $sourcename !~ s!.*(kio/|kparts/|dom/|kabc/|ksettings/|kjs/|ktexteditor/|kdeprint/|kdesu/)(.*)!$1$2!m ) {
+ $sourcename =~ s!.*/(.*)!$1!m;
+ }
+ if ( $sourcename eq '' ) {
+ return;
+ }
+ $addInclude->{$sourcename} = 1;
+ }
+
+ if ($returnType eq 'void') {
+ $returnType = undef;
+ } else {
+ # Detect objects returned by value
+ checkImportsForObject( $returnType, $addImport );
+ checkIncludesForObject( $returnType, $addInclude );
+ }
+
+ my $hasDuplicateSignature = 0;
+ my $isStatic = $m->{Flags} =~ "s";
+ my $isPure = $m->{Flags} =~ "p";
+
+ return if ( $m->{SkipFromSwitch} && $m->{Flags} !~ "p" );
+
+# # Skip internal methods, which return unknown types
+# # Hmm, the C# bindings have a list of those too.
+# return if ( $returnType =~ m/QGfx\s*\*/ );
+# return if ( $returnType eq 'CGContextRef' );
+# return if ( $returnType eq 'QWSDisplay *' );
+# # This stuff needs callback, or **
+# return if ( $name eq 'defineIOHandler' or $name eq 'qt_init_internal' );
+# # Skip casting operators, but not == < etc.
+# return if ( $name =~ /operator \w+/ );
+# # QFile's EncoderFn/DecoderFn
+# return if ( $name =~ /set[ED][ne]codingFunction/ );
+# # How to implement this? (QXmlDefaultHandler/QXmlEntityResolver::resolveEntity, needs A*&)
+# return if ( $name eq 'resolveEntity' and $className =~ /^QXml/ );
+# return if ( $className eq 'QBitArray' && $m->{Access} eq 'protected' );
+
+ #print STDERR "Tests passed, generating.\n";
+
+
+ my $argId = 0;
+
+ my @argTypeList=();
+ my @javaArgTypeList=();
+ my @javaArgList = ();
+ my @jniArgList = ();
+ my @jniArgLocals = ();
+ my @jniCleanups = ();
+ my @namedArgTypeList=();
+
+ foreach my $arg ( @{$m->{ParamList}} ) {
+ $argId++;
+
+ if ( $arg->{ArgName} =~ /^super$|^int$|^env$|^cls$|^obj$|^byte$/ ) {
+ $arg->{ArgName} = "";
+ }
+
+ if ( $arg->{ArgName} =~ /^short$|^long$/ ) {
+ # Oops looks like a parser error
+ $arg->{ArgType} = $arg->{ArgName};
+ $arg->{ArgName} = "";
+ }
+
+ print STDERR " Param ".$arg->{astNodeName}." type: ".$arg->{ArgType}." name:".$arg->{ArgName}." default: ".$arg->{DefaultValue}." java: ".cplusplusToJava($arg->{ArgType})."\n" if ($debug);
+
+ my $argType = $arg->{ArgType};
+ my $namedArgType;
+ my $javaArgType;
+ my $javaArg;
+ my $jniArg;
+ my $jniLocal;
+ my $jniCleanup;
+ my $argName;
+
+ if ( cplusplusToJava($argType) eq "" && $firstUnknownArgType > $argId ) {
+ $firstUnknownArgType = $argId;
+ }
+
+ $javaArg = ($arg->{ArgName} eq "" ? "arg" . $argId : $arg->{ArgName});
+ $namedArgType = $argType . " " . $javaArg;
+ $javaArgType = cplusplusToJava($argType) . " " . $javaArg;
+ ($jniLocal, $jniArg, $jniCleanup) = jniArgTocplusplus($argType, $javaArg);
+
+ push @argTypeList, $argType;
+ push @javaArgTypeList, $javaArgType;
+ push @javaArgList, $javaArg;
+ push @jniArgLocals, $jniLocal;
+ push @jniCleanups, $jniCleanup;
+ push @jniArgList, $jniArg;
+ push @namedArgTypeList, $namedArgType;
+
+ # Detect objects passed by value
+ checkImportsForObject( $argType, $addImport );
+ checkIncludesForObject( $argType, $addInclude );
+ }
+
+ if ( $name eq 'QApplication' or ($javaClassName eq 'KCmdLineArgs' and $name eq 'init' and scalar(@javaArgList) > 1) ) {
+ # Junk the 'int argc' parameter
+ shift @javaArgTypeList;
+ shift @javaArgList;
+ }
+
+ my @castedArgList = makeCastedArgList( @argTypeList );
+
+ # We iterate as many times as we have default params
+ my $firstDefaultParam = $m->{FirstDefaultParam};
+ $firstDefaultParam = scalar(@argTypeList) unless defined $firstDefaultParam;
+ my $iterationCount = scalar(@argTypeList) - $firstDefaultParam;
+
+ my $jniReturnType = cplusplusToJNI($m->{ReturnType});
+ # ArrayLists are jobjectArrays in args, but jobjects in return types
+ $jniReturnType =~ s/jobjectArray/jobject/;
+
+ my $javaReturnType = cplusplusToJava($m->{ReturnType});
+ if ( $javaReturnType =~ s/StringBuffer/String/ ) {
+ $jniReturnType =~ s/jobject/jstring/;
+ } elsif ( $javaReturnType =~ s/String\[\]/ArrayList/ ) {
+ $addImport->{"java.util.ArrayList"} = 1;
+ }
+
+ if ($m->{ReturnType} =~ /^int\&/) {
+ $javaReturnType = 'int';
+ $jniReturnType =~ s/jintArray/jint/;
+ }
+
+ if ($javaReturnType eq "") {
+ $firstUnknownArgType = 0;
+ }
+
+ print STDERR " ". ($iterationCount+1). " iterations for $name\n" if ($debug);
+
+ my $javaSignature = javaMethodSignature( $m, @argTypeList );
+
+ if ( defined $javaMethods->{$javaSignature} ) {
+ $hasDuplicateSignature = 1;
+ }
+
+ my $docnode = $m->{DocNode};
+ if ( $firstUnknownArgType >= 0 && $m->{Access} !~ /signals/ && ! $hasDuplicateSignature
+ && defined $docnode && ($generateConstructors || !$isConstructor) )
+ {
+ my $javadocComment = printJavadocComment( $docnode, "", "\t", "" );
+ $methodCode .= "\t/**" . $javadocComment . "*/\n" unless $javadocComment =~ /^\s*$/;
+ }
+
+ while($iterationCount >= 0) {
+
+ $javaMethods->{$javaSignature} = 1;
+
+ local($") = ",";
+
+ if($firstUnknownArgType <= scalar(@argTypeList) || $hasDuplicateSignature || ($name =~ /^qObject$/) || $m->{Access} =~ /dcop/ ) {
+ if ( $firstUnknownArgType <= scalar(@argTypeList) || $m->{Access} =~ /dcop/ ) {
+ my $failedConversion = "\t// " . $m->{ReturnType} . " $name(@castedArgList[0..$#argTypeList]); >>>> NOT CONVERTED\n";
+ if ( $m->{Access} =~ /signals/ ) {
+ $signalCode .= $failedConversion;
+ } else {
+ $methodCode .= $failedConversion;
+ }
+ }
+ } else {
+
+# $jniCode .= "\tcase $methodNumber: ";
+# if ($flags =~ "s" || $isConstructor) { # static or constructor
+# $jniCode .= "$bridgeClassName\::";
+# } else {
+# $jniCode .= "xself->"
+# }
+# $jniCode .= "x_$methodNumber(args);";
+# $jniCode .= "\tbreak;\n";
+
+ if ($name eq 'find' and $javaClassName eq 'QButtonGroup') {
+ # Can't override a static method find() in QWidget
+ $name = "findButton";
+ } elsif ( $name eq 'null' ) {
+ $name = "nil";
+ } elsif ( $name eq 'form' and $javaClassName =~ /^HTML/ ) {
+ $name = "formElement";
+ } elsif ( $name eq 'wait' and $javaClassName eq 'KProcess' ) {
+ $name = "waitThread";
+ } elsif ( $name eq 'finalize' and $javaClassName eq 'KMD5' ) {
+ $name = "finalizeDigest";
+ } elsif ( $name eq 'icon' and $javaClassName eq 'QMessageBox' ) {
+ $name = "iconId";
+ } elsif ( $name eq 'icon' and $javaClassName eq 'KURLBarItemDialog' ) {
+ $name = "iconName";
+ } elsif ( $name eq 'iconText' and $javaClassName eq 'KToolBar' ) {
+ $name = "iconTextId";
+ } elsif ( $name eq 'reset' and $javaClassName eq 'KExtendedSocket' ) {
+ $name = "resetSocket";
+ } elsif ( $name eq 'palette' and $javaClassName eq 'KPaletteTable' ) {
+ $name = "paletteName";
+ } elsif ( $name eq 'size' and $javaClassName eq 'KAnimWidget' ) {
+ $name = "iconSize";
+ } elsif ( $name eq 'size' and $javaClassName eq 'KFontCombo' ) {
+ $name = "pointSize";
+ } elsif ($javaSignature eq "icon()" and $javaClassName eq 'KIconButton') {
+ $name = "iconName";
+ } elsif ($javaSignature eq "close()" and $javaClassName eq 'KDirOperator') {
+ $name = "closeLoading";
+ } elsif ($javaSignature eq "font()" and $javaClassName eq 'KCharSelect') {
+ $name = "fontName";
+ } elsif ($javaSignature eq "layout()" and $javaReturnType eq 'void') {
+ $name = "updateLayout";
+ } elsif ( $name eq 'sorting' and $javaReturnType eq 'boolean' ) {
+ $name = "sortOnInsert";
+ } elsif ($javaSignature eq "statusBar()" and $javaClassName =~ /^K/ ) {
+ $name = "kstatusBar";
+ } elsif ($javaSignature eq "menuBar()" and $javaClassName =~ /^K/ ) {
+ $name = "kmenuBar";
+ } elsif ( $name eq 'addLabel' and $javaClassName eq 'QTableHeader' ) {
+ $name = "addHeaderLabel";
+ }
+
+ my $javaparams = join( ", ", @javaArgTypeList );
+ my ( $jniSignature, $jniCall ) = jniMethodSignature( $m,
+ ($isConstructor ? "new$name" : $name),
+ @argTypeList, $javaClassName, \@javaArgList );
+
+ my $cplusplusparams;
+ my $i = 0;
+ for my $arg (@argTypeList) {
+ $cplusplusparams .= "," if $i++;
+ $cplusplusparams .= "arg" . $i;
+ }
+
+ if ($isConstructor) {
+ if ( $generateConstructors && $mainClassNode->{CanBeInstanciated} ) {
+ $jbridgeCode .= "\t$bridgeClassName(@castedArgList[0..$#argTypeList]) : $className($cplusplusparams) {};\n";
+
+ $methodCode .= "\tpublic $javaClassName($javaparams) {\n";
+ if ( $ancestorCount > 0 ) {
+ $methodCode .= "\t\tsuper((Class) null);\n"
+ }
+ $methodCode .= "\t\tnew$javaClassName(@javaArgList[0..$#javaArgTypeList]);\n";
+ $methodCode .= "\t}\n";
+ $methodCode .= "\tprivate native void new$javaClassName($javaparams);\n";
+
+ $jniCode = "JNIEXPORT void JNICALL\n";
+ $jniCode .= "$jniCall\n";
+ $jniCode .= "{\n";
+ $jniCode .= join( "", @jniArgLocals );
+ $jniCode .= "\tif (QtSupport::getQt(env, obj) == 0) {\n";
+ $jniCode .= "\t\tQtSupport::setQt(env, obj, new $bridgeClassName(" . join( ", ", @jniArgList ). "));\n";
+ $jniCode .= "\t\tQtSupport::setObjectForQtKey(env, obj, QtSupport::getQt(env, obj));\n";
+ $jniCode .= join( "", @jniCleanups );
+ $jniCode .= "\t}\n\treturn;\n}\n\n";
+
+ # Look for args which are are a QQbject/slot string pair and replace with a java proxy slot
+ if ($jniCode =~ s/QtSupport::getQt\(env, (receiver|recvr|pObjSlot)\), \(const char\*\) QtSupport::toCharString\(env, (member|slot|psMethodSlot), \&_qstring_(member|slot|psMethodSlot)\)/QtSupport::slotForReceiver(env, $1, $2), "1invoke()"/) {
+ $jniCode =~ s/static QCString\* _qstring_(member|slot|psMethodSlot) = 0;\n//;
+ }
+
+ $jniSignature =~ /^([^\)]*)\(.*/;
+ if ($skippedJniMethods{$1}) {
+ # Don't generate code for jni methods added as 'extras'
+ $jniMethods->{$jniSignature} = "";
+ } else {
+ $jniMethods->{$jniSignature} = $jniCode;
+ }
+ }
+ } else {
+ my $access = $m->{Access};
+ $access =~ s/_slots//;
+
+ if ( $access eq 'public' or $access eq 'protected' ) {
+ if ( $name =~ /^takeItem$|^setPixmap$|^clearCell$|^setItem$|^item$|^minimumSize$/
+ or $name =~ /^stepUp$|^stepDown$|^sectionFormattedText$|^addNumber$|^removeLastNumber$/
+ or $name =~ /^cancel$|^setSource$|^paintCell$|^updateContents$|^sizeHint$|^setFocusSection$/
+ or $name =~ /^event$|^eventFilter$|^copy$|^detach$|^showEvent$|^format$|^encodedData$/
+ or $name =~ /^styleChange$|^insertItem$|^setStatus$|^setState$|^minimumSizeHint$/
+ or $name =~ /^bytesPerLine$|^paintBranches$|^scanLine$|^ensureCursorVisible$|^setCursor$/
+ or $name =~ /^updateGeometry$|^setState$|^exec$|^pixmap$|^areaPoints$|^draw$|^writeDir$/ ) {
+ # These methods are public in some places, but protected in others,
+ # so make them all public.
+ $access = "public";
+ }
+
+ $methodCode .= "\t" . $access . (($isStatic or $classNode->{NodeType} eq 'namespace') ? " static " : " ") . "native ";
+# $methodCode .= ( $m->{Flags} =~ "v" || $isStatic ? "" : "final " );
+
+ my $altReturnType = undef;
+ if ($name =~ /^xForm$/ ) {
+ $javaReturnType = "Object";
+ } elsif ($javaSignature eq "layout()" and $javaReturnType ne 'void') {
+ $altReturnType = "QLayout";
+ } elsif ($javaSignature eq "defaultFactory()" and $javaReturnType eq 'QSqlEditorFactory') {
+ $javaReturnType = "QEditorFactory";
+ } elsif ($javaSignature =~ /^bits|^scanLine/) {
+ $javaReturnType = "byte[]";
+ } elsif ($javaSignature eq "at()" and $javaClassName eq 'KFilterDev') {
+ $javaReturnType = "long";
+ } elsif ($javaSignature =~ /copyTo/ and $javaClassName eq "KDesktopFile" ) {
+ $altReturnType = "KConfig";
+ }
+
+ if ( defined $altReturnType ) {
+ checkImportsForObject( $altReturnType, $addImport );
+ $javaReturnType = $altReturnType;
+ }
+ $methodCode .= $javaReturnType;
+ $methodCode .= " $name($javaparams);\n";
+
+ if ($access eq 'public' and !$isStatic) {
+ $interfaceCode .= "\t\t$javaReturnType $name($javaparams);\n";
+ }
+
+ my $methodName = $m->{astNodeName};
+ # Hack to stop calling super for QWidget::polish() from looping
+ if ( $m->{Access} =~ /public/
+ && $returnType eq ''
+ && $m->{Flags} =~ "v"
+ && $cplusplusparams eq ''
+ && $bridgeClassName ne $className )
+ {
+ $methodName = "public_" . $m->{astNodeName};
+ $jbridgeCode .= "\t";
+ $jbridgeCode .= "void $methodName() {\n";
+ $jbridgeCode .= "\t\t$className" . "::" . $m->{astNodeName} . "();\n";
+ $jbridgeCode .= "\t\treturn;\n";
+ $jbridgeCode .= "\t}\n";
+ }
+
+ if ($m->{Access} =~ /protected/) {
+ $methodName = "protected_" . $m->{astNodeName};
+ $jbridgeCode .= (($isStatic or $classNode->{NodeType} eq 'namespace') ? "\tstatic " : "\t");
+ if ( $returnType eq '' ) {
+ $jbridgeCode .= "void $methodName(@castedArgList[0..$#argTypeList]) {\n";
+ $jbridgeCode .= "\t\t$className" . "::" . $m->{astNodeName} . "($cplusplusparams);\n";
+ $jbridgeCode .= "\t\treturn;\n";
+ } else {
+ $jbridgeCode .= "$returnType $methodName(@castedArgList[0..$#argTypeList]) {\n";
+ $jbridgeCode .= "\t\treturn ($returnType) $className" . "::" . $m->{astNodeName} . "($cplusplusparams);\n";
+ }
+ $jbridgeCode .= "\t}\n";
+
+ }
+
+ $jniCode = "JNIEXPORT $jniReturnType JNICALL\n";
+ $jniCode .= "$jniCall\n";
+ $jniCode .= "{\n";
+ my $selfstring;
+ if ( $isStatic or $classNode->{NodeType} eq 'namespace' ) {
+ $selfstring = $bridgeClassName . "::" . $methodName;
+ } else {
+ if ($m->{Access} =~ /protected/ || $methodName =~ /^public_/) {
+ $selfstring = "(($bridgeClassName*) QtSupport::getQt(env, obj))->$methodName";
+ } else {
+ $selfstring = "(($className*)" . ($mainClassName eq $className ? "" : "($mainClassName*)") . " QtSupport::getQt(env, obj))->" . $m->{astNodeName};
+ }
+ }
+ my ($locals, $fcall) = jniToReturnValue( $m->{ReturnType}, "$selfstring(" . join( ", ", @jniArgList ). ")", join( "", @jniCleanups ) );
+ # Add dummy statements to avoid compiler warnings if needed
+ $locals .= ($jniSignature =~ /jclass/ ? "\t(void) cls;\n" : "");
+ $locals .= ($fcall !~ /env/ ? "\t(void) env;\n" : "");
+
+ my $slotArgType = '';
+ if ($name eq 'insertAnimatedWidget' or $name eq 'connectStatus' or $name eq 'disconnectStatus') {
+ $slotArgType = 'int';
+ } elsif ($name eq 'connectResize' or $name eq 'disconnectResize') {
+ $slotArgType = 'const QSize&';
+ } elsif ($name eq 'connectUpdate' or $name eq 'disconnectUpdate') {
+ $slotArgType = 'const QRect&';
+ }
+ # Look for args which are are a QQbject/slot string pair and replace with a java proxy slot
+
+ $locals .= join( "", @jniArgLocals );
+
+ if ($fcall =~ s/QtSupport::getQt\(env, (receiver|recvr|pObjSlot)\), \(const char\*\) QtSupport::toCharString\(env, (member|slot|psMethodSlot), \&_qstring_(member|slot|psMethodSlot)\)/QtSupport::slotForReceiver(env, $1, $2), "1invoke($slotArgType)"/) {
+ $locals =~ s/static QCString\* _qstring_(member|slot|psMethodSlot) = 0;\n//;
+ }
+
+ $jniCode .= $locals;
+
+ if ($name eq 'readBlock') {
+ $interfaceCode =~ s/String /StringBuffer /;
+ $methodCode =~ s/String /StringBuffer /;
+ $jniCode =~ s/jstring/jobject/;
+ $jniCode =~ /(jlong|jint) (\w+)\)/;
+ my $arg2 = $2;
+ $jniCode =~ s/_qstring_(\w+) = 0;\n/_qstring_$1 = 0;\n\tif \(_qstring_$1 == 0\) { _qstring_$1 = new QCString\(\); }\n\t_qstring_$1->resize\(\(uint\) $arg2\);\n/;
+ my $arg1 = $1;
+ $fcall =~ s/QtSupport::toCharString\([^\)]*\)/_qstring_$arg1->data()/;
+ $fcall =~ s/return xret;/QtSupport::fromQCStringToStringBuffer(env, _qstring_$arg1, $arg1);\n\treturn xret;/;
+ }
+
+ $jniCode .= $fcall;
+ $jniCode .= "}\n\n";
+
+ if ($isPure && $m->{Access} =~ /protected/) {
+ # Can't do a lot with implementing these, so give up
+ $jniCode = "";
+ $jbridgeCode = "";
+ }
+
+ $jniSignature =~ /^([^\)]*)\(.*/;
+ if ($skippedJniMethods{$1}) {
+ # Don't generate code for jni methods added as 'extras'
+ $jniMethods->{$jniSignature} = "";
+ } else {
+ $jniMethods->{$jniSignature} = $jniCode;
+ }
+ } else {
+ if ( $access =~ /signals/ ) {
+ my $docnode = $m->{DocNode};
+ if ( defined $docnode ) {
+ my $javadocComment = printJavadocComment( $docnode, "", "\t", "" );
+ $signalCode .= "\t/**" . $javadocComment . "*/\n" unless $javadocComment =~ /^\s*$/;
+ }
+ $signalCode .= "\tvoid $name($javaparams);\n";
+ }
+ }
+ }
+ }
+
+ pop @argTypeList;
+ pop @javaArgTypeList;
+ pop @javaArgList;
+ pop @jniArgList;
+ pop @jniArgLocals;
+ pop @jniCleanups;
+
+ $javaSignature = javaMethodSignature( $m, @argTypeList );
+ $hasDuplicateSignature = (defined $javaMethods->{$javaSignature} ? 1 : 0);
+
+ $methodNumber++;
+ $iterationCount--;
+ } # Iteration loop
+
+ return ( $methodCode, $interfaceCode, $signalCode, $jbridgeCode );
+}
+
+
+sub generateEnum($$$)
+{
+ my( $classNode, $m, $generateAnonymous ) = @_; # input
+ my $methodCode = ''; # output
+
+ my @heritage = kdocAstUtil::heritage($classNode);
+ my $className = join( "::", @heritage );
+ my $javaClassName = $classNode->{astNodeName};
+
+ if ( ($generateAnonymous and $m->{astNodeName} ) or (! $generateAnonymous and ! $m->{astNodeName}) ) {
+ return;
+ }
+
+ if ( defined $m->{DocNode} ) {
+ my $javadocComment = printJavadocComment( $m->{DocNode}, "", "\t", "" );
+ $methodCode .= "\t/**" . $javadocComment . "*/\n" unless $javadocComment =~ /^\s*$/;
+ }
+
+ my @enums = split(",", $m->{Params});
+ my $enumCount = 0;
+ foreach my $enum ( @enums ) {
+ $enum =~ s/\s//g;
+ $enum =~ s/::/./g;
+ $enum =~ s/\(mode_t\)//;
+ if ( $enum =~ /(.*)=([-0-9]+)$/ ) {
+ $methodCode .= "\tpublic static final int $1 = $2;\n";
+ $enumCount = $2;
+ $enumCount++;
+ } elsif ( $enum =~ /(.*)=(.*)/ ) {
+ $methodCode .= "\tpublic static final int $1 = $2;\n";
+ } else {
+ $methodCode .= "\tpublic static final int $enum = $enumCount;\n";
+ $enumCount++;
+ }
+ }
+
+ $methodCode .= "\n";
+ $methodNumber++;
+
+ return ( $methodCode );
+}
+
+sub generateVar($$$)
+{
+ my( $classNode, $m, $addImport ) = @_; # input
+ my $methodCode = ''; # output
+ my $interfaceCode = ''; # output
+
+ my @heritage = kdocAstUtil::heritage($classNode);
+ my $className = join( "::", @heritage );
+ my $javaClassName = $classNode->{astNodeName};
+
+ my $name = $m->{astNodeName};
+ my $varType = $m->{Type};
+ $varType =~ s/static\s//;
+ $varType =~ s/const\s+(.*)\s*&/$1/;
+ $varType =~ s/\s*$//;
+ my $fullName = "$className\::$name";
+
+ checkImportsForObject( $varType, $addImport );
+
+# die "Invalid index for $fullName: $classNode->{case}{$fullName} instead of $methodNumber" if $classNode->{case}{$fullName} != $methodNumber;
+# $methodCode .= " static void x_$methodNumber(Smoke::Stack x) {\n";
+# $methodCode .= "\tx[0].s_class = (void*)new $varType($fullName);\n";
+# $methodCode .= " }\n";
+
+# if ( ($name !~ /^null$/) && (cplusplusToJava($varType) ne "") ) {
+ if ( ($name !~ /^null$/) && (cplusplusToJava($varType) ne "" ) ) {
+# $interfaceCode .= "\t\t". cplusplusToJava($varType) . " $name();\n";
+
+# $methodCode .= "\tpublic native static ". cplusplusToJava($varType) . " $name();\n";
+ }
+
+ $methodNumber++;
+ return ( $methodCode, $interfaceCode );
+}
+
+## Called by writeClassDoc
+sub generateAllMethods($$$$$$$$)
+{
+ my ($classNode, $ancestorCount, $javaMethods, $jniMethods, $mainClassNode, $generateConstructors, $addImport, $addInclude) = @_;
+ my $methodCode = '';
+ my $interfaceCode = '';
+ my $signalCode = '';
+ my $jbridgeCode = '';
+ $methodNumber = 0;
+ #my $className = $classNode->{astNodeName};
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+ my $javaClassName = $mainClassNode->{astNodeName};
+ my $jniClassName = ($classNode->{astNodeName} =~ /^Q/ ? "Java_org_kde_qt_" : "Java_org_kde_koala_") . $classNode->{astNodeName};
+ # If the C++ class had multiple inheritance, then the code for all but one of the
+ # parents must be copied into the code for javaClassName. Hence, for QWidget current
+ # classname might be QPaintDevice, as its methods are needed in QWidget.
+ my $currentClassName = join( ".", kdocAstUtil::heritage($classNode) );
+
+ my $sourcename = $classNode->{Source}->{astNodeName};
+
+ if ( $sourcename !~ s!.*(kio/|kparts/|dom/|kabc/|ksettings/|kjs/|ktexteditor/|kdeprint/|kdesu/)(.*)!$1$2!m ) {
+ $sourcename =~ s!.*/(.*)!$1!m;
+ }
+# die "Empty source name for $classNode->{astNodeName} $classNode->{Source}->{astNodeName}" if ( $sourcename eq '' );
+
+ if ($classNode->{astNodeName} ne $main::globalSpaceClassName && $sourcename ne '') {
+ $addInclude->{$sourcename} = 1;
+# my $s;
+# for my $sn( @{$classNode->{Sources}} ) {
+# if ( ($s = $sn->{astNodeName}) !~ s!.*(kio/|kparts/|dom/|kabc/|ksettings/|kjs/|ktexteditor/|kdeprint/|kdesu/)(.*)!$1$2!m ) {
+# $s =~ s!.*/(.*)!$1!m;
+# }
+# $addInclude->{$s} = 1;
+# }
+ }
+
+ $addImport->{"org.kde.qt.QtSupport"} = 1;
+
+ # Do all enums first, anonymous ones and then named enums
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $methodNode ) = @_;
+
+ if ( $methodNode->{NodeType} eq 'enum' and $currentClassName eq $javaClassName ) {
+ my ($meth) = generateEnum( $classNode, $methodNode, 1 );
+ $methodCode .= $meth;
+ }
+ }, undef );
+
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $methodNode ) = @_;
+
+ if ( $methodNode->{NodeType} eq 'enum' and $currentClassName eq $javaClassName ) {
+ my ($meth) = generateEnum( $classNode, $methodNode, 0 );
+ $methodCode .= $meth;
+ }
+ }, undef );
+
+ # Then all static vars
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $methodNode ) = @_;
+
+ if ( $methodNode->{NodeType} eq 'var' and $currentClassName eq $javaClassName ) {
+ my ($meth, $interface) = generateVar( $classNode, $methodNode, $addImport );
+ $methodCode .= $meth;
+# $interfaceCode .= $interface;
+ }
+ }, undef );
+
+ # Then all methods
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $methodNode ) = @_;
+
+ if ( $methodNode->{NodeType} eq 'method' ) {
+ my ($meth, $interf, $signals, $jbridge) = generateMethod( $classNode, $methodNode, $addImport, $addInclude, $ancestorCount, $javaMethods, $jniMethods, $mainClassNode, $generateConstructors );
+ $methodCode .= $meth;
+ $interfaceCode .= $interf;
+ $signalCode .= $signals;
+ $jbridgeCode .= $jbridge;
+# $jniCode .= $jni;
+ }
+ }, undef );
+
+ # Virtual methods
+# if ($classNode->{BindingDerives}) {
+# my %virtualMethods;
+# allVirtualMethods( $classNode, \%virtualMethods );
+
+# for my $sig (sort keys %virtualMethods) {
+# my ($meth) = generateVirtualMethod( $classNode, $sig, $virtualMethods{$sig}{method}, $virtualMethods{$sig}{class}, \%addImport );
+# $methodCode .= $meth;
+# }
+# }
+
+ # Destructor
+ # "virtual" is useless, if the base class has a virtual destructor then the x_* class too.
+ #if($classNode->{HasVirtualDestructor} and $classNode->{HasDestructor}) {
+ # $methodCode .= " virtual ~$bridgeClassName() {}\n";
+ #}
+ # We generate a dtor though, because we might want to add stuff into it
+
+ if ($currentClassName eq $javaClassName and $classNode->{CanBeInstanciated} and $classNode->{HasPublicDestructor}) {
+ if ( $generateConstructors ) {
+ my $jniCode;
+ my $jniSignature;
+
+ $jbridgeCode .= "\t~$className" . "JBridge() {QtSupport::qtKeyDeleted(this);}\n";
+ $methodCode .= "\t/** Deletes the wrapped C++ instance */\n";
+ $methodCode .= "\tprotected native void finalize() throws InternalError;\n";
+
+ $jniSignature = $jniClassName . "_finalize";
+ $jniCode = "JNIEXPORT void JNICALL\n$jniSignature(JNIEnv* env, jobject obj)\n{";
+
+ if ( is_kindof($classNode, 'QCheckListItem') ) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QCheckListItem*)($className*)QtSupport::getQt(env, obj))->parent() == 0 && ((QCheckListItem*)($className*)QtSupport::getQt(env, obj))->listView() == 0) {\n";
+ } elsif ( $classNode->{astNodeName} =~ /^KFileTreeViewToolTip$/ ) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && (($className*)QtSupport::getQt(env, obj))->parentWidget() == 0) {\n";
+ } elsif ( is_kindof($classNode, 'QTableItem')) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QTableItem*)($className*)QtSupport::getQt(env, obj))->table() == 0) {\n";
+ } elsif ( is_kindof($classNode, 'QPopupMenu')) {
+ if ($main::qt_embedded) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QPopupMenu*)($className*)QtSupport::getQt(env, obj))->parentWidget() == 0) {\n";
+ } else {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QPopupMenu*)($className*)QtSupport::getQt(env, obj))->parentWidget(FALSE) == 0) {\n";
+ }
+ } elsif ( is_kindof($classNode, 'QListViewItem') ) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QListViewItem*)($className*)QtSupport::getQt(env, obj))->parent() == 0 && ((QListViewItem*)($className*)QtSupport::getQt(env, obj))->listView() == 0) {\n";
+ } elsif ( is_kindof($classNode, 'QIconViewItem')) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QIconViewItem*)($className*)QtSupport::getQt(env, obj))->iconView() == 0) {\n";
+ } elsif ( is_kindof($classNode, 'QLayoutItem')) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QLayoutItem*)($className*)QtSupport::getQt(env, obj))->layout() == 0 && ((QLayoutItem*)($className*)QtSupport::getQt(env, obj))->widget() == 0 && ((QLayoutItem*)($className*)QtSupport::getQt(env, obj))->spacerItem() == 0) {\n";
+ } elsif ( $classNode->{astNodeName} =~ /^KSpell$|^KReplace$/ ) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj)) {\n";
+ } elsif ( $classNode->{astNodeName} =~ /^QWidget$/ || defined kdocAstUtil::findOverride( $rootnode, $classNode, "parentWidget" ) ) {
+ if ($main::qt_embedded) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QWidget*)($className*)QtSupport::getQt(env, obj))->parentWidget() == 0) {\n";
+ } else {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && ((QWidget*)($className*)QtSupport::getQt(env, obj))->parentWidget(TRUE) == 0) {\n";
+ }
+ } elsif ( $classNode->{astNodeName} =~ /^QObject$/ || defined kdocAstUtil::findOverride( $rootnode, $classNode, "parent" ) ) {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj) && (($className*)QtSupport::getQt(env, obj))->parent() == 0) {\n";
+ } else {
+ $jniCode .= "\n\tif (QtSupport::allocatedInJavaWorld(env, obj)) {\n";
+ }
+
+ if ($classNode->{astNodeName} !~ /^Q.*Style$/) {
+ $jniCode .= "\t\tdelete ($className*)QtSupport::getQt(env, obj);\n";
+ }
+
+ $jniCode .= "\t\tQtSupport::setQt(env, obj, 0);\n\t}\n\treturn;\n}\n\n";
+ $jniMethods->{$jniSignature} = $jniCode;
+
+# $interfaceCode .= "\t\tvoid dispose();\n";
+ $methodCode .= "\t/** Delete the wrapped C++ instance ahead of finalize() */\n";
+ $methodCode .= "\tpublic native void dispose();\n";
+
+# $interfaceCode .= "\t\tboolean isDisposed();\n";
+ $methodCode .= "\t/** Has the wrapped C++ instance been deleted? */\n";
+ $methodCode .= "\tpublic native boolean isDisposed();\n";
+
+
+ $jniSignature = $jniClassName . "_dispose";
+ $jniCode = "JNIEXPORT void JNICALL\n$jniSignature(JNIEnv* env, jobject obj)\n{";
+ $jniCode .= "\n\t$jniClassName" . "_finalize(env, obj);\n\treturn;\n}\n\n";
+ $jniMethods->{$jniSignature} = $jniCode;
+
+ $jniSignature = $jniClassName . "_isDisposed";
+ $jniCode = "JNIEXPORT jboolean JNICALL\n$jniSignature(JNIEnv* env, jobject obj)\n{";
+ $jniCode .= "\n\treturn (QtSupport::getQt(env, obj) == 0);\n}\n\n";
+ $jniMethods->{$jniSignature} = $jniCode;
+ }
+# die "$className destructor: methodNumber=$methodNumber != case entry=".$classNode->{case}{"~$className()"}."\n"
+# if $methodNumber != $classNode->{case}{"~$className()"};
+ $methodNumber++;
+ }
+
+ return ( $methodCode, $interfaceCode, $signalCode, $jbridgeCode );
+}
+
+sub virtualMethodCallbacks
+{
+ my( $node ) = @_;
+ my $jbridgeCode = ''; # output
+ my %allmem = ();
+ my $key;
+
+ my $m;
+ my $name;
+ my $isQObject = is_kindof($node, 'QObject');
+
+ kdocAstUtil::allMembers( \%allmem, $node );
+
+ foreach $key (keys (%allmem)) {
+ $m = $allmem{$key};
+ $name = $m->{astNodeName} ;
+ my $type = $m->{NodeType};
+ my $docnode = $m->{DocNode};
+ my $parent = $m->{Parent};
+
+ if ( $type eq "method" && ($m->{Flags} =~ "v" || $name =~ /^.*Event$/) && !$m->{SkipFromSwitch}
+ && $m->{Access} =~ /public|protected/
+ && $name !~ /qwsEvent/ && $name !~ /x11Event/ && $name !~ /winEvent/
+ && $name !~ /macEvent/ && $name !~ /movableDropEvent/ )
+ {
+ my @argTypeList = ();
+ my @castedArgList;
+ my $i = 0;
+ my $cplusplusparams;
+ foreach my $arg ( @{$m->{ParamList}} ) {
+ my $argType = $arg->{ArgType};
+ push @argTypeList, $argType;
+ $cplusplusparams .= "," if $i++;
+ $cplusplusparams .= "arg" . $i;
+ }
+
+ my $qobjectType = $node->{astNodeName};
+ $qobjectType =~ s/(.*)\*.*$/$1/;
+ $qobjectType =~ s/^([^Q].*)/org.kde.koala.$1/;
+ $qobjectType =~ s/^(Q.*)/org.kde.qt.$1/;
+ if( $m->{ReturnType} eq 'void' && $#argTypeList eq 0
+ && cplusplusToJNISignature( @argTypeList[0] ) =~ /Lorg_kde/
+ && $isQObject )
+ {
+ @castedArgList = makeCastedArgList( @argTypeList );
+ my $eventType = cplusplusToJava( @argTypeList[0] );
+ $eventType =~ s/(.*)\*.*$/$1/;
+ $eventType =~ s/^([^Q].*)/org.kde.koala.$1/;
+ $eventType =~ s/^(Q.*)/org.kde.qt.$1/;
+ $jbridgeCode .= "\tvoid $name(@castedArgList[0..$#argTypeList]) {\n";
+ $jbridgeCode .= "\t\tif (!QtSupport::eventDelegate(this,\"$name\",(void*)" . (@argTypeList[0] =~ /\*/ ? "" : "&") . "arg1,\"$eventType\")) {\n";
+ $jbridgeCode .= "\t\t\t" . $parent->{astNodeName} . "::" . "$name(arg1);\n";
+ $jbridgeCode .= "\t\t}\n";
+ $jbridgeCode .= "\t\treturn;\n\t}\n";
+ } elsif( $name =~ /eventFilter$/ and $isQObject and $#argTypeList eq 1) {
+ $jbridgeCode .= "\tbool eventFilter(QObject* object,QEvent* event) {\n";
+ $jbridgeCode .= "\t\tif (!QtSupport::eventFilterDelegate(this,\"$qobjectType\",object,event)) {\n";
+ $jbridgeCode .= "\t\t\treturn " . $parent->{astNodeName} . "::eventFilter(object,event);\n";
+ $jbridgeCode .= "\t\t} else {\n";
+ $jbridgeCode .= "\t\t\treturn TRUE;\n";
+ $jbridgeCode .= "\t\t}\n\t}\n";
+ } elsif( $name =~ /^fixup$/ and $node->{astNodeName} eq 'QValidator' ) {
+ $jbridgeCode .= "\tQValidator::State validate(QString& input,int& pos) const\n";
+ $jbridgeCode .= "\t{\n";
+ $jbridgeCode .= "\t\treturn (QValidator::State) QtSupport::validateDelegate((QValidator*)this,input,pos);\n";
+ $jbridgeCode .= "\t}\n";
+ $jbridgeCode .= "\tvoid fixup(QString& input) const\n";
+ $jbridgeCode .= "\t{\n";
+ $jbridgeCode .= "\t\tQtSupport::fixupDelegate((QValidator*) this, input);\n";
+ $jbridgeCode .= "\t\treturn;\n\t}\n";
+ } elsif( $m->{ReturnType} eq 'void' and $#argTypeList eq -1 and $isQObject) {
+ $jbridgeCode .= "\tvoid $name() {\n";
+ $jbridgeCode .= "\t\tif (!QtSupport::voidDelegate(this,\"$qobjectType\",\"$name\")) {\n";
+ $jbridgeCode .= "\t\t\t" . $parent->{astNodeName} . "::$name();\n";
+ $jbridgeCode .= "\t\t}\n";
+ $jbridgeCode .= "\t\treturn;\n\t}\n";
+ } elsif( cplusplusToJava( $m->{ReturnType} ) eq 'boolean' and $#argTypeList eq -1 and $isQObject ) {
+ $jbridgeCode .= "\t" . $m->{ReturnType} . " $name() {\n";
+ $jbridgeCode .= "\t\treturn QtSupport::booleanDelegate(this,\"$name\");\n";
+ $jbridgeCode .= "\t}\n";
+ }
+ }
+ }
+
+ return $jbridgeCode;
+}
+
+# Return 0 if the class has no virtual dtor, 1 if it has, 2 if it's private
+sub hasVirtualDestructor($)
+{
+ my ( $classNode ) = @_;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+ return if ( $skippedClasses{$className} );
+
+ my $parentHasIt;
+ # Look at ancestors, and (recursively) call hasVirtualDestructor for each
+ # It's enough to have one parent with a prot/public virtual dtor
+ Iter::Ancestors( $classNode, $rootnode, undef, undef, sub {
+ my $vd = hasVirtualDestructor( $_[0] );
+ $parentHasIt = $vd unless $parentHasIt > $vd;
+ } );
+ return $parentHasIt if $parentHasIt; # 1 or 2
+
+ # Now look in $classNode - including private methods
+ my $doPrivate = $main::doPrivate;
+ $main::doPrivate = 1;
+ my $result;
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $m ) = @_;
+ return unless( $m->{NodeType} eq "method" && $m->{ReturnType} eq '~' );
+
+ if ( $m->{Flags} =~ /[vp]/ ) {
+ if ( $m->{Access} =~ /private/ ) {
+ $result=2; # private virtual
+ } else {
+ $result=1; # [protected or public] virtual
+ }
+ }
+ },
+ undef
+ );
+ $main::doPrivate = $doPrivate;
+ $result=0 if (!defined $result);
+ return $result;
+}
+
+=head2 allVirtualMethods
+
+ Parameters: class node, dict
+
+ Adds to the dict, for all method nodes that are virtual, in this class and in parent classes :
+ {method} the method node, {class} the class node (the one where the virtual is implemented)
+
+=cut
+
+sub allVirtualMethods($$)
+{
+ my ( $classNode, $virtualMethods ) = @_;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+ return if ( $skippedClasses{$className} );
+
+ # Look at ancestors, and (recursively) call allVirtualMethods for each
+ # This is done first, so that virtual methods that are reimplemented as 'private'
+ # can be removed from the list afterwards (below)
+ Iter::Ancestors( $classNode, $rootnode, undef, undef, sub {
+ allVirtualMethods( @_[0], $virtualMethods );
+ }, undef
+ );
+
+ # Now look for virtual methods in $classNode - including private ones
+ my $doPrivate = $main::doPrivate;
+ $main::doPrivate = 1;
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $m ) = @_;
+ # Only interested in methods, and skip destructors
+ return unless( $m->{NodeType} eq "method" && $m->{ReturnType} ne '~' );
+
+ my $signature = methodSignature( $m, $#{$m->{ParamList}} );
+ print STDERR $signature . " ($m->{Access})\n" if ($debug);
+
+ # A method is virtual if marked as such (v=virtual p=pure virtual)
+ # or if a parent method with same signature was virtual
+ if ( $m->{Flags} =~ /[vp]/ or defined $virtualMethods->{$signature} ) {
+ if ( $m->{Access} =~ /private/ ) {
+ if ( defined $virtualMethods->{$signature} ) { # remove previously defined
+ delete $virtualMethods->{$signature};
+ }
+ # else, nothing, just ignore private virtual method
+ } else {
+ $virtualMethods->{$signature}{method} = $m;
+ $virtualMethods->{$signature}{class} = $classNode;
+ }
+ }
+ },
+ undef
+ );
+ $main::doPrivate = $doPrivate;
+}
+
+# Known typedef? If so, apply it.
+sub applyTypeDef($)
+{
+ my $type = shift;
+ # Parse 'const' in front of it, and '*' or '&' after it
+ my $prefix = $type =~ s/^const\s+// ? 'const ' : '';
+ my $suffix = $type =~ s/\s*([\&\*]+)$// ? $1 : '';
+
+ if (exists $typedeflist{$type}) {
+ return $prefix.$typedeflist{$type}.$suffix;
+ }
+ return $prefix.$type.$suffix;
+}
+
+# Register type ($1) into %allTypes if not already there
+sub registerType($$) {
+ my $type = shift;
+ #print "registerType: $type\n" if ($debug);
+
+ $type =~ s/\s+const$//; # for 'char* const'
+ $type =~ s/\s+const\s*\*$/\*/; # for 'char* const*'
+
+ return if ( $type eq 'void' or $type eq '' or $type eq '~' );
+ die if ( $type eq '...' ); # ouch
+
+ # Let's register the real type, not its known equivalent
+ #$type = applyTypeDef($type);
+
+ # Enum _value_ -> get corresponding type
+ if (exists $enumValueToType{$type}) {
+ $type = $enumValueToType{$type};
+ }
+
+ # Already in allTypes
+ if(exists $allTypes{$type}) {
+ return;
+ }
+
+ die if $type eq 'QTextEdit::UndoRedoInfo::Type';
+ die if $type eq '';
+
+ my $realType = $type;
+
+ # Look for references (&) and pointers (* or **) - this will not handle *& correctly.
+ # We do this parsing here because both the type list and iterproto need it
+ if($realType =~ s/&$//) {
+ $allTypes{$type}{typeFlags} = 'Smoke::tf_ref';
+ }
+ elsif($realType ne 'void*' && $realType =~ s/\*$//) {
+ $allTypes{$type}{typeFlags} = 'Smoke::tf_ptr';
+ }
+ else {
+ $allTypes{$type}{typeFlags} = 'Smoke::tf_stack';
+ }
+
+ if ( $realType =~ s/^const\s+// ) { # Remove 'const'
+ $allTypes{$type}{typeFlags} .= ' | Smoke::tf_const';
+ }
+
+ # Apply typedefs, and store the resulting type.
+ # For instance, if $type was Q_UINT16&, realType will be ushort
+ $allTypes{$type}{realType} = applyTypeDef( $realType );
+
+ # In the first phase we only create entries into allTypes.
+ # The values (indexes) are calculated afterwards, once the list is full.
+ $allTypes{$type}{index} = -1;
+ #print STDERR "Register $type. Realtype: $realType\n" if($debug);
+}
+
+# Get type from %allTypes
+# This returns a hash with {index}, {isEnum}, {typeFlags}, {realType}
+# (and {typeId} after the types array is written by writeSmokeDataFile)
+sub findTypeEntry($) {
+ my $type = shift;
+ my $typeIndex = -1;
+ $type =~ s/\s+const$//; # for 'char* const'
+ $type =~ s/\s+const\s*\*$/\*/; # for 'char* const*'
+
+ return undef if ( $type =~ '~' or $type eq 'void' or $type eq '' );
+
+ # Enum _value_ -> get corresponding type
+ if (exists $enumValueToType{$type}) {
+ $type = $enumValueToType{$type};
+ }
+
+ die "type not known: $type" unless defined $allTypes{$type};
+ return $allTypes{ $type };
+}
+
+# List of all java super-classes for a given class, via single inheritance.
+# Excluding any which are mapped onto interfaces to avoid multiple inheritance.
+sub direct_superclass_list($)
+{
+ my $classNode = shift;
+ my @super;
+ my $has_ancestor = 0;
+ my $direct_ancestor = undef;
+ my $name;
+
+ Iter::Ancestors( $classNode, $rootnode, undef, undef, sub {
+ ( $direct_ancestor, $name ) = @_;
+ if ($name =~ /QMemArray|QSqlFieldInfoList/) {
+ # Template classes, give up for now..
+ $has_ancestor = 1;
+ } elsif (kalyptusDataDict::interfacemap($name) eq "") {
+ push @super, $direct_ancestor;
+ push @super, direct_superclass_list( $direct_ancestor );
+ $has_ancestor = 1;
+ }
+ }, undef );
+
+ if (! $has_ancestor and defined $direct_ancestor) {
+ push @super, $direct_ancestor;
+ push @super, direct_superclass_list( $direct_ancestor );
+ }
+
+ return @super;
+}
+
+# List of all super-classes for a given class
+sub superclass_list($)
+{
+ my $classNode = shift;
+ my @super;
+ Iter::Ancestors( $classNode, $rootnode, undef, undef, sub {
+ push @super, @_[0];
+ push @super, superclass_list( @_[0] );
+ }, undef );
+ return @super;
+}
+
+sub is_kindof($$)
+{
+ my $classNode = shift;
+ my $className = shift;
+
+ if ($classNode->{astNodeName} eq $className) {
+ return 1;
+ }
+
+ my @superclasses = superclass_list($classNode);
+ foreach my $ancestor (@superclasses) {
+ if ($ancestor->{astNodeName} eq $className) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+# Store the {case} dict in the class Node (method signature -> index in the "case" switch)
+# This also determines which methods should NOT be in the switch, and sets {SkipFromSwitch} for them
+sub prepareCaseDict($) {
+
+ my $classNode = shift;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+ $classNode->AddProp("case", {});
+ my $methodNumber = 0;
+
+ # First look at all enums for this class
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $m ) = @_;
+
+ next unless $m->{NodeType} eq 'enum';
+ foreach my $val ( @{$m->{ParamList}} ) {
+ my $fullEnumName = "$className\::".$val->{ArgName};
+ print STDERR "Enum: $fullEnumName -> case $methodNumber\n" if ($debug);
+ $classNode->{case}{$fullEnumName} = $methodNumber;
+ $enumValueToType{$fullEnumName} = "$className\::$m->{astNodeName}";
+ $methodNumber++;
+ }
+ }, undef );
+
+ # Check for static vars
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $m ) = @_;
+
+ next unless $m->{NodeType} eq 'var';
+ my $name = "$className\::".$m->{astNodeName};
+ print STDERR "Var: $name -> case $methodNumber\n" if ($debug);
+ $classNode->{case}{$name} = $methodNumber;
+ $methodNumber++;
+
+ }, undef );
+
+
+ # Now look at all methods for this class
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $m ) = @_;
+
+ next unless $m->{NodeType} eq 'method';
+ my $name = $m->{astNodeName};
+ my $isConstructor = ($name eq $classNode->{astNodeName} );
+ if ($isConstructor and ($m->{ReturnType} eq '~')) # destructor
+ {
+ # Remember whether we'll generate a switch entry for the destructor
+ $m->{SkipFromSwitch} = 1 unless ($classNode->{CanBeInstanciated} and $classNode->{HasPublicDestructor});
+ next;
+ }
+
+ # Don't generate bindings for protected methods (incl. signals) if
+ # we're not deriving from the C++ class. Only take public and public_slots
+ my $ok = ( $classNode->{BindingDerives} or $m->{Access} =~ /public/ ) ? 1 : 0;
+
+ # Don't generate bindings for pure virtuals - we can't call them ;)
+ $ok = 0 if ( $ok && $m->{Flags} =~ "p" );
+
+ # Bugfix for Qt-3.0.4: those methods are NOT implemented (report sent).
+ $ok = 0 if ( $ok && $className eq 'QLineEdit' && ( $name eq 'setPasswordChar' || $name eq 'passwordChar' ) );
+ $ok = 0 if ( $ok && $className eq 'QWidgetItem' && $name eq 'widgetSizeHint' );
+
+ if ( !$ok )
+ {
+ #print STDERR "Skipping $className\::$name\n" if ($debug);
+ $m->{SkipFromSwitch} = 1;
+ next;
+ }
+
+ my @args = @{ $m->{ParamList} };
+ my $last = $m->{FirstDefaultParam};
+ $last = scalar @args unless defined $last;
+ my $iterationCount = scalar(@args) - $last;
+ while($iterationCount >= 0) {
+ my $sig = methodSignature( $m, $#args );
+ $classNode->{case}{$sig} = $methodNumber;
+ #print STDERR "prepareCaseDict: registered case number $methodNumber for $sig in $className()\n" if ($debug);
+ pop @args;
+ $iterationCount--;
+ $methodNumber++;
+ }
+ }, undef );
+
+ # Add the destructor, at the end
+ if ($classNode->{CanBeInstanciated} and $classNode->{HasPublicDestructor}) {
+ $classNode->{case}{"~$className()"} = $methodNumber;
+ # workaround for ~Sub::Class() being seen as Sub::~Class()
+ $classNode->{case}{"~$classNode->{astNodeName}()"} = $methodNumber;
+ #print STDERR "prepareCaseDict: registered case number $methodNumber for ~$className()\n" if ($debug);
+ }
+}
+
+sub writeSmokeDataFile($) {
+ my $rootnode = shift;
+
+ # Make list of classes
+ my %allImports; # list of all header files for all classes
+ my @classlist;
+ push @classlist, ""; # Prepend empty item for "no class"
+ my %enumclasslist;
+ Iter::LocalCompounds( $rootnode, sub {
+ my $classNode = $_[0];
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+
+ return if $classNode->{NodeType} eq 'namespace';
+
+ push @classlist, $className;
+ $enumclasslist{$className}++ if keys %{$classNode->{enumerations}};
+ $classNode->{ClassIndex} = $#classlist;
+ addImportForClass( $classNode, \%allImports, undef );
+ } );
+
+ my %classidx = do { my $i = 0; map { $_ => $i++ } @classlist };
+
+ my $file = "$outputdir/smokedata.cpp";
+# open OUT, ">$file" or die "Couldn't create $file\n";
+
+# foreach my $incl (sort{
+# return 1 if $a=~/qmotif/; # move qmotif* at bottom (they include dirty X11 headers)
+# return -1 if $b=~/qmotif/;
+# return -1 if substr($a,0,1) eq 'q' and substr($b,0,1) ne 'q'; # move Qt headers on top
+# return 1 if substr($a,0,1) ne 'q' and substr($b,0,1) eq 'q';
+# $a cmp $b
+# } keys %allIncludes) {
+# die if $imp eq '';
+# print OUT "import $imp;\n";
+# }
+
+# print OUT "\n";
+
+ print STDERR "Writing ${libname}_cast function\n" if ($debug);
+
+ # Prepare descendants information for each class
+ my %descendants; # classname -> list of descendant nodes
+ Iter::LocalCompounds( $rootnode, sub {
+ my $classNode = shift;
+ # Get _all_ superclasses (up any number of levels)
+ # and store that $classNode is a descendant of $s
+ my @super = superclass_list($classNode);
+ for my $s (@super) {
+ my $superClassName = join( "::", kdocAstUtil::heritage($s) );
+ Ast::AddPropList( \%descendants, $superClassName, $classNode );
+ }
+ } );
+
+ # Iterate over all classes, to write the xtypecast function
+ Iter::LocalCompounds( $rootnode, sub {
+ my $classNode = shift;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+ # @super will contain superclasses, the class itself, and all descendants
+ my @super = superclass_list($classNode);
+ push @super, $classNode;
+ if ( defined $descendants{$className} ) {
+ push @super, @{$descendants{$className}};
+ }
+ my $cur = $classidx{$className};
+
+ return if $classNode->{NodeType} eq 'namespace';
+
+# print OUT " case $cur:\t//$className\n";
+# print OUT "\tswitch(to) {\n";
+# $cur = -1;
+# my %casevalues;
+# for my $s (@super) {
+# my $superClassName = join( "::", kdocAstUtil::heritage($s) );
+# next if !defined $classidx{$superClassName}; # inherits from unknown class, see below
+# next if $classidx{$superClassName} == $cur; # shouldn't happen in Qt
+# next if $s->kdocAstUtil::inheritsAsVirtual($classNode); # can't cast from a virtual base class
+# $cur = $classidx{$superClassName}; # KDE has MI with diamond shaped cycles (cf. KXMLGUIClient)
+# next if $casevalues{$cur}; # ..so skip any duplicate parents
+# print OUT "\t case $cur: return (void*)($superClassName*)($className*)xptr;\n";
+# $casevalues{$cur} = 1;
+# }
+# print OUT "\t default: return xptr;\n";
+# print OUT "\t}\n";
+ } );
+# print OUT " default: return xptr;\n";
+# print OUT " }\n";
+# print OUT "}\n\n";
+
+
+ # Write inheritance array
+ # Imagine you have "Class : public super1, super2"
+ # The inheritlist array will get 3 new items: super1, super2, 0
+ my %inheritfinder; # key = (super1, super2) -> data = (index in @inheritlist). This one allows reuse.
+ my %classinherit; # we store that index in %classinherit{className}
+ # We don't actually need to store inheritlist in memory, we write it
+ # directly to the file. We only need to remember its current size.
+ my $inheritlistsize = 1;
+
+# print OUT "// Group of class IDs (0 separated) used as super class lists.\n";
+# print OUT "// Classes with super classes have an index into this array.\n";
+# print OUT "static short ${libname}_inheritanceList[] = {\n";
+# print OUT "\t0,\t// 0: (no super class)\n";
+ Iter::LocalCompounds( $rootnode, sub {
+ my $classNode = shift;
+ my $className = join( "__", kdocAstUtil::heritage($classNode) );
+
+ return if $classNode->{NodeType} eq 'namespace';
+
+ print STDERR "inheritanceList: looking at $className\n" if ($debug);
+
+ # Make list of direct ancestors
+ my @super;
+ Iter::Ancestors( $classNode, $rootnode, undef, undef, sub {
+ my $superClassName = join( "::", kdocAstUtil::heritage($_[0]) );
+ push @super, $superClassName;
+ }, undef );
+ # Turn that into a list of class indexes
+ my $key = '';
+ foreach my $superClass( @super ) {
+ if (defined $classidx{$superClass}) {
+ $key .= ', ' if ( length $key > 0 );
+ $key .= $classidx{$superClass};
+ }
+ }
+ if ( $key ne '' ) {
+ if ( !defined $inheritfinder{$key} ) {
+ print OUT "\t";
+ my $index = $inheritlistsize; # Index of first entry (for this group) in inheritlist
+ foreach my $superClass( @super ) {
+ if (defined $classidx{$superClass}) {
+ print OUT "$classidx{$superClass}, ";
+ $inheritlistsize++;
+ }
+ }
+ $inheritlistsize++;
+ my $comment = join( ", ", @super );
+ print OUT "0,\t// $index: $comment\n";
+ $inheritfinder{$key} = $index;
+ }
+ $classinherit{$className} = $inheritfinder{$key};
+ } else { # No superclass
+ $classinherit{$className} = 0;
+ }
+ } );
+# print OUT "};\n\n";
+
+
+# print OUT "// These are the xenum functions for manipulating enum pointers\n";
+ for my $className (keys %enumclasslist) {
+ my $c = $className;
+ $c =~ s/::/__/g;
+# print OUT "void xenum_$c\(Smoke::EnumOperation, Smoke::Index, void*&, long&);\n";
+ }
+# print OUT "\n";
+# print OUT "// Those are the xcall functions defined in each x_*.cpp file, for dispatching method calls\n";
+ my $firstClass = 1;
+ for my $className (@classlist) {
+ if ($firstClass) {
+ $firstClass = 0;
+ next;
+ }
+ my $c = $className; # make a copy
+ $c =~ s/::/__/g;
+# print OUT "void xcall_$c\(Smoke::Index, void*, Smoke::Stack);\n";
+ }
+# print OUT "\n";
+
+ # Write class list afterwards because it needs offsets to the inheritance array.
+# print OUT "// List of all classes\n";
+# print OUT "// Name, index into inheritanceList, method dispatcher, enum dispatcher, class flags\n";
+# print OUT "static Smoke::Class ${libname}_classes[] = {\n";
+ my $firstClass = 1;
+ Iter::LocalCompounds( $rootnode, sub {
+ my $classNode = shift;
+ my $className = join( "__", kdocAstUtil::heritage($classNode) );
+
+ return if $classNode->{NodeType} eq 'namespace';
+
+ if ($firstClass) {
+ $firstClass = 0;
+ print OUT "\t{ 0L, 0, 0, 0, 0 }, \t// 0 (no class)\n";
+ }
+ my $c = $className;
+ $c =~ s/::/__/g;
+ my $xcallFunc = "xcall_$c";
+ my $xenumFunc = "0";
+ $xenumFunc = "xenum_$c" if exists $enumclasslist{$className};
+ # %classinherit needs Foo__Bar, not Foo::Bar?
+ die "problem with $className" unless defined $classinherit{$c};
+
+ my $xClassFlags = 0;
+ $xClassFlags .= "|Smoke::cf_constructor" if $classNode->{CanBeInstanciated}; # correct?
+ $xClassFlags .= "|Smoke::cf_deepcopy" if $classNode->{CanBeCopied}; # HasCopyConstructor would be wrong (when it's private)
+ $xClassFlags .= "|Smoke::cf_virtual" if hasVirtualDestructor($classNode) == 1;
+ # $xClassFlags .= "|Smoke::cf_undefined" if ...;
+ $xClassFlags =~ s/0\|//; # beautify
+# print OUT "\t{ \"$className\", $classinherit{$c}, $xcallFunc, $xenumFunc, $xClassFlags }, \t//$classidx{$className}\n";
+ } );
+# print OUT "};\n\n";
+
+
+# print OUT "// List of all types needed by the methods (arguments and return values)\n";
+# print OUT "// Name, class ID if arg is a class, and TypeId\n";
+# print OUT "static Smoke::Type ${libname}_types[] = {\n";
+ my $typeCount = 0;
+ $allTypes{''}{index} = 0; # We need an "item 0"
+ for my $type (sort keys %allTypes) {
+ $allTypes{$type}{index} = $typeCount; # Register proper index in allTypes
+ if ( $typeCount == 0 ) {
+# print OUT "\t{ 0, 0, 0 },\t//0 (no type)\n";
+ $typeCount++;
+ next;
+ }
+ my $isEnum = $allTypes{$type}{isEnum};
+ my $typeId;
+ my $typeFlags = $allTypes{$type}{typeFlags};
+ my $realType = $allTypes{$type}{realType};
+ die "$type" if !defined $typeFlags;
+# die "$realType" if $realType =~ /\(/;
+ # First write the name
+# print OUT "\t{ \"$type\", ";
+ # Then write the classId (and find out the typeid at the same time)
+ if(exists $classidx{$realType}) { # this one first, we want t_class for QBlah*
+ $typeId = 't_class';
+# print OUT "$classidx{$realType}, ";
+ }
+ elsif($type =~ /&$/ || $type =~ /\*$/) {
+ $typeId = 't_voidp';
+# print OUT "0, "; # no classId
+ }
+ elsif($isEnum || $allTypes{$realType}{isEnum}) {
+ $typeId = 't_enum';
+ if($realType =~ /(.*)::/) {
+ my $c = $1;
+ if($classidx{$c}) {
+# print OUT "$classidx{$c}, ";
+ } else {
+# print OUT "0 /* unknown class $c */, ";
+ }
+ } else {
+# print OUT "0 /* unknown $realType */, "; # no classId
+ }
+ }
+ else {
+ $typeId = $typeunion{$realType};
+ if (defined $typeId) {
+ $typeId =~ s/s_/t_/; # from s_short to t_short for instance
+ }
+ else {
+ # Not a known class - ouch, this happens quite a lot
+ # (private classes, typedefs, template-based types, etc)
+ if ( $skippedClasses{$realType} ) {
+# print STDERR "$realType has been skipped, using t_voidp for it\n";
+ } else {
+ unless( $realType =~ /</ ) { # Don't warn for template stuff...
+ print STDERR "$realType isn't a known type (type=$type)\n";
+ }
+ }
+ $typeId = 't_voidp'; # Unknown -> map to a void *
+ }
+# print OUT "0, "; # no classId
+ }
+ # Then write the flags
+ die "$type" if !defined $typeId;
+# print OUT "Smoke::$typeId | $typeFlags },";
+# print OUT "\t//$typeCount\n";
+ $typeCount++;
+ # Remember it for coerce_type
+ $allTypes{$type}{typeId} = $typeId;
+ }
+# print OUT "};\n\n";
+
+
+ my %arglist; # registers the needs for argumentList (groups of type ids)
+ my %methods;
+ # Look for all methods and all enums, in all classes
+ # And fill in methods and arglist. This loop writes nothing to OUT.
+ Iter::LocalCompounds( $rootnode, sub {
+ my $classNode = shift;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+ print STDERR "writeSmokeDataFile: arglist: looking at $className\n" if ($debug);
+
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $m ) = @_;
+
+ my $methName = $m->{astNodeName};
+ # For destructors, get a proper signature that includes the '~'
+ if ( $m->{ReturnType} eq '~' )
+ {
+ $methName = '~' . $methName ;
+ # Let's even store that change, otherwise we have to do it many times
+ $m->{astNodeName} = $methName;
+ }
+
+ if( $m->{NodeType} eq "enum" ) {
+
+ foreach my $enum ( @{$m->{ParamList}} ) {
+ my $enumName = $enum->{ArgName};
+ $methods{$enumName}++;
+ }
+
+ } elsif ( $m->{NodeType} eq 'var' ) {
+
+ $methods{$m->{astNodeName}}++;
+
+ } elsif( $m->{NodeType} eq "method" ) {
+
+ $methods{$methName}++;
+ my @protos;
+ makeprotos(\%classidx, $m, \@protos);
+
+ #print "made @protos from $className $methName $m->{Signature})\n" if ($debug);
+ for my $p (@protos) {
+ $methods{$p}++;
+ my $argcnt = 0;
+ $argcnt = length($1) if $p =~ /([\$\#\?]+)/;
+ my $sig = methodSignature($m, $argcnt-1);
+ # Store in a class hash named "proto", a proto+signature => method association
+ $classNode->{proto}{$p}{$sig} = $m;
+ #$classNode->{signature}{$sig} = $p;
+ # There's probably a way to do this better, but this is the fastest way
+ # to get the old code going: store classname into method
+ $m->{class} = $className;
+ }
+
+ my $firstDefaultParam = $m->{FirstDefaultParam};
+ $firstDefaultParam = scalar(@{ $m->{ParamList} }) unless defined $firstDefaultParam;
+ my $argNames = '';
+ my $args = '';
+ for(my $i = 0; $i < @{ $m->{ParamList} }; $i++) {
+ $args .= ', ' if $i;
+ $argNames .= ', ' if $i;
+ my $argType = $m->{ParamList}[$i]{ArgType};
+ my $typeEntry = findTypeEntry( $argType );
+ $args .= defined $typeEntry ? $typeEntry->{index} : 0;
+ $argNames .= $argType;
+
+ if($i >= ($firstDefaultParam - 1)) {
+ #print "arglist entry: $args\n";
+ $arglist{$args} = $argNames;
+ }
+
+ }
+ # create an entry for e.g. "arg0,arg1,arg2" where argN is index in allTypes of type for argN
+ # The value, $argNames, is temporarily stored, to be written out as comment
+ # It gets replaced with the index in the next loop.
+ #print "arglist entry : $args\n";
+ $arglist{$args} = $argNames;
+ }
+ }, # end of sub
+ undef
+ );
+ });
+
+
+ $arglist{''} = 0;
+ # Print arguments array
+# print OUT "static Smoke::Index ${libname}_argumentList[] = {\n";
+ my $argListCount = 0;
+ for my $args (sort keys %arglist) {
+ my @dunnohowtoavoidthat = split(',',$args);
+ my $numTypes = $#dunnohowtoavoidthat;
+ if ($args eq '') {
+# print OUT "\t0,\t//0 (void)\n";
+ } else {
+ # This is a nice trick : args can be written in one go ;)
+# print OUT "\t$args, 0,\t//$argListCount $arglist{$args} \n";
+ }
+ $arglist{$args} = $argListCount; # Register proper index in argList
+ $argListCount += $numTypes + 2; # Move forward by as much as we wrote out
+ }
+# print OUT "};\n\n";
+
+ $methods{''} = 0;
+ my @methodlist = sort keys %methods;
+ my %methodidx = do { my $i = 0; map { $_ => $i++ } @methodlist };
+
+# print OUT "// Raw list of all methods, using munged names\n";
+# print OUT "static const char *${libname}_methodNames[] = {\n";
+ my $methodNameCount = $#methodlist;
+ for my $m (@methodlist) {
+# print OUT qq( "$m",\t//$methodidx{$m}\n);
+ }
+# print OUT "};\n\n";
+
+# print OUT "// (classId, name (index in methodNames), argumentList index, number of args, method flags, return type (index in types), xcall() index)\n";
+# print OUT "static Smoke::Method ${libname}_methods[] = {\n";
+ my @methods;
+ %allMethods = ();
+ my $methodCount = 0;
+ # Look at all classes and all enums again
+ Iter::LocalCompounds( $rootnode, sub {
+ my $classNode = shift;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+ return if $classNode->{NodeType} eq 'namespace';
+
+ my $classIndex = $classidx{$className};
+ print STDERR "writeSmokeDataFile: methods: looking at $className\n" if ($debug);
+
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $m ) = @_;
+
+ if( $m->{NodeType} eq "enum" ) {
+
+ foreach my $enum ( @{$m->{ParamList}} ) {
+ my $enumName = $enum->{ArgName};
+ my $fullEnumName = "$className\::$enumName";
+ my $sig = "$className\::$enumName\()";
+ my $xmethIndex = $methodidx{$enumName};
+ die "'Method index' for enum $sig not found" unless defined $xmethIndex;
+ my $typeId = findTypeEntry( $fullEnumName )->{index};
+ die "enum has no {case} value in $className: $fullEnumName" unless defined $classNode->{case}{$fullEnumName};
+# print OUT "\t{$classIndex, $xmethIndex, 0, 0, Smoke::mf_static, $typeId, $classNode->{case}{$fullEnumName}},\t//$methodCount $fullEnumName (enum)\n";
+ $allMethods{$sig} = $methodCount;
+ print STDERR "Added entry for " . $sig . " into \$allMethods\n" if ($debug);
+ $methods[$methodCount] = {
+ c => $classIndex,
+ methIndex => $xmethIndex,
+ argcnt => '0',
+ args => 0,
+ retTypeIndex => 0,
+ idx => $classNode->{case}{$fullEnumName}
+ };
+ $methodCount++;
+ }
+
+ } elsif( $m->{NodeType} eq 'var' ) {
+
+ my $name = $m->{astNodeName};
+ my $fullName = "$className\::$name";
+ my $sig = "$fullName\()";
+ my $xmethIndex = $methodidx{$name};
+ die "'Method index' for var $sig not found" unless defined $xmethIndex;
+ my $varType = $m->{Type};
+ $varType =~ s/static\s//;
+ $varType =~ s/const\s+(.*)\s*&/$1/;
+ $varType =~ s/\s*$//;
+ my $typeId = findTypeEntry( $varType )->{index};
+ die "var has no {case} value in $className: $fullName" unless defined $classNode->{case}{$fullName};
+# print OUT "\t{$classIndex, $xmethIndex, 0, 0, Smoke::mf_static, $typeId, $classNode->{case}{$fullName}},\t//$methodCount $fullName (static var)\n";
+ $allMethods{$sig} = $methodCount;
+ print STDERR "Added entry for " . $sig . " into \$allMethods\n" if ($debug);
+ $methods[$methodCount] = {
+ c => $classIndex,
+ methIndex => $xmethIndex,
+ argcnt => '0',
+ args => 0,
+ retTypeIndex => 0,
+ idx => $classNode->{case}{$fullName}
+ };
+ $methodCount++;
+
+
+ } elsif( $m->{NodeType} eq "method" ) {
+
+ # We generate a method entry only if the method is in the switch() code
+ # BUT: for pure virtuals, they need to have a method entry, even though they
+ # do NOT have a switch code.
+ return if ( $m->{SkipFromSwitch} && $m->{Flags} !~ "p" );
+
+ # No switch code for destructors if we didn't derive from the class (e.g. it has private ctors only)
+ return if ( $m->{ReturnType} eq '~' && ! ( $classNode->{BindingDerives} and $classNode->{HasPublicDestructor}) );
+
+ # Is this sorting really important?
+ #for my $m (sort {$a->{name} cmp $b->{name}} @{ $self->{$c}{method} }) {
+
+ my $methName = $m->{astNodeName};
+ my $def = $m->{FirstDefaultParam};
+ $def = scalar(@{ $m->{ParamList} }) unless defined $def;
+ my $last = scalar(@{ $m->{ParamList} }) - 1;
+ #print STDERR "writeSmokeDataFile: methods: generating for method $methName, def=$def last=$last\n" if ($debug);
+
+ while($last >= ($def-1)) {
+ last if $last < -1;
+ my $args = [ @{ $m->{ParamList} }[0..$last] ];
+ my $sig = methodSignature($m, $last);
+ #my $methodSig = $classNode->{signature}{$sig}; # Munged signature
+ #print STDERR "writeSmokeDataFile: methods: sig=$className\::$sig methodSig=$methodSig\n" if ($debug);
+ #my $methodIndex = $methodidx{$methodSig};
+ #die "$methodSig" if !defined $methodIndex;
+
+ my $methodIndex = $methodidx{$methName};
+ die "$methName" if !defined $methodIndex;
+ my $case = $classNode->{case}{$sig};
+ my $typeEntry = findTypeEntry( $m->{ReturnType} );
+ my $retTypeIndex = defined $typeEntry ? $typeEntry->{index} : 0;
+
+ my $i = 0;
+ my $t = '';
+ for my $arg (@$args) {
+ $t .= ', ' if $i++;
+ my $typeEntry = findTypeEntry( $arg->{ArgType} );
+ $t .= defined $typeEntry ? $typeEntry->{index} : 0;
+ }
+ my $arglist = $t eq '' ? 0 : $arglist{$t};
+ die "arglist for $t not found" unless defined $arglist;
+ if ( $m->{Flags} =~ "p" ) {
+ # Pure virtuals don't have a {case} number, that's normal
+ die if defined $case;
+ $case = -1; # This remains -1, not 0 !
+ } else {
+ ;
+# die "$className\::$methName has no case number for sig=$sig" unless defined $case;
+ }
+ my $argcnt = $last + 1;
+ my $methodFlags = '0';
+ $methodFlags .= "|Smoke::mf_static" if $m->{Flags} =~ "s";
+ $methodFlags .= "|Smoke::mf_const" if $m->{Flags} =~ "c"; # useful?? probably not
+ $methodFlags =~ s/0\|//; # beautify
+
+# print OUT "\t{$classIndex, $methodIndex, $arglist, $argcnt, $methodFlags, $retTypeIndex, $case},\t//$methodCount $className\::$sig";
+# print OUT " [pure virtual]" if ( $m->{Flags} =~ "p" ); # explain why $case = -1 ;)
+# print OUT "\n";
+
+ $allMethods{$className . "::" . $sig} = $methodCount;
+ $methods[$methodCount] = {
+ c => $classIndex,
+ methIndex => $methodIndex,
+ argcnt => $argcnt,
+ args => $arglist,
+ retTypeIndex => $retTypeIndex,
+ idx => $case
+ };
+ $methodCount++;
+ $last--;
+ } # while
+ } # if method
+ } ); # Method Iter
+ } ); # Class Iter
+# print OUT "};\n\n";
+
+ my @protos;
+ Iter::LocalCompounds( $rootnode, sub {
+ my $classNode = shift;
+ my $className = join( "::", kdocAstUtil::heritage($classNode) );
+
+ return if $classNode->{NodeType} eq 'namespace';
+
+ my $classIndex = $classidx{$className};
+ print STDERR "writeSmokeDataFile: protos: looking at $className\n" if ($debug);
+
+ Iter::MembersByType ( $classNode, undef,
+ sub { my ($classNode, $m ) = @_;
+
+ if( $m->{NodeType} eq "enum" ) {
+ foreach my $enum ( @{$m->{ParamList}} ) {
+ my $enumName = $enum->{ArgName};
+ my $sig = "$className\::$enumName\()";
+ my $xmeth = $allMethods{$sig};
+ die "'Method' for enum $sig not found" unless defined $xmeth;
+ my $xmethIndex = $methodidx{$enumName};
+ die "'Method index' for enum $enumName not found" unless defined $xmethIndex;
+ push @protos, {
+ methIndex => $xmethIndex,
+ c => $classIndex,
+ over => {
+ $sig => {
+ sig => $sig,
+ }
+ },
+ meth => $xmeth
+ };
+ }
+
+ } elsif( $m->{NodeType} eq 'var' ) {
+
+ my $name = $m->{astNodeName};
+ my $fullName = "$className\::$name";
+ my $sig = "$fullName\()";
+ my $xmeth = $allMethods{$sig};
+ die "'Method' for var $sig not found" unless defined $xmeth;
+ my $xmethIndex = $methodidx{$name};
+ die "'Method index' for var $name not found" unless defined $xmethIndex;
+ push @protos, {
+ methIndex => $xmethIndex,
+ c => $classIndex,
+ over => {
+ $sig => {
+ sig => $sig,
+ }
+ },
+ meth => $xmeth
+ };
+
+ }
+ });
+
+ for my $p (keys %{ $classNode->{proto} }) {
+ # For each prototype
+ my $scratch = { %{ $classNode->{proto}{$p} } }; # sig->method association
+ # first, grab all the superclass voodoo
+ for my $supNode (superclass_list($classNode)) {
+ my $i = $supNode->{proto}{$p};
+ next unless $i;
+ for my $k (keys %$i) {
+ $scratch->{$k} = $i->{$k} unless exists $scratch->{$k};
+ }
+ }
+
+ # Ok, now we have a full list
+ #if(scalar keys %$scratch > 1) {
+ #print STDERR "Overload: $p (@{[keys %$scratch]})\n" if ($debug);
+ #}
+ my $xmethIndex = $methodidx{$p};
+ my $classIndex = $classidx{$className};
+ for my $sig (keys %$scratch) {
+ #my $xsig = $scratch->{$sig}{class} . "::" . $sig;
+ my $xsig = $className . "::" . $sig;
+ $scratch->{$sig}{sig} = $xsig;
+ delete $scratch->{$sig}
+ if $scratch->{$sig}{Flags} =~ "p" # pure virtual
+ or not exists $allMethods{$xsig};
+ }
+ push @protos, {
+ methIndex => $xmethIndex,
+ c => $classIndex,
+ over => $scratch
+ } if scalar keys %$scratch;
+ }
+ });
+
+ my @protolist = sort { $a->{c} <=> $b->{c} || $a->{methIndex} <=> $b->{methIndex} } @protos;
+#for my $abc (@protos) {
+#print "$abc->{methIndex}.$abc->{c}\n";
+#}
+
+ print STDERR "Writing methodmap table\n" if ($debug);
+ my @resolve = ();
+# print OUT "// Class ID, munged name ID (index into methodNames), method def (see methods) if >0 or number of overloads if <0\n";
+ my $methodMapCount = 1;
+# print OUT "static Smoke::MethodMap ${libname}_methodMaps[] = {\n";
+# print OUT "\t{ 0, 0, 0 },\t//0 (no method)\n";
+ for my $cur (@protolist) {
+ if(scalar keys %{ $cur->{over} } > 1) {
+# print OUT "\t{$cur->{c}, $cur->{methIndex}, -@{[1+scalar @resolve]}},\t//$methodMapCount $classlist[$cur->{c}]\::$methodlist[$cur->{methIndex}]\n";
+ $methodMapCount++;
+ for my $k (keys %{ $cur->{over} }) {
+ my $p = $cur->{over}{$k};
+ my $xsig = $p->{class} ? "$p->{class}\::$k" : $p->{sig};
+ push @resolve, { k => $k, p => $p, cur => $cur, id => $allMethods{$xsig} };
+ }
+ push @resolve, 0;
+ } else {
+ for my $k (keys %{ $cur->{over} }) {
+ my $p = $cur->{over}{$k};
+ my $xsig = $p->{class} ? "$p->{class}\::$k" : $p->{sig};
+# print OUT "\t{$cur->{c}, $cur->{methIndex}, $allMethods{$xsig}},\t//$methodMapCount $classlist[$cur->{c}]\::$methodlist[$cur->{methIndex}]\n";
+ $methodMapCount++;
+ }
+ }
+ }
+# print OUT "};\n\n";
+
+
+ print STDERR "Writing ambiguousMethodList\n" if ($debug);
+# print OUT "static Smoke::Index ${libname}_ambiguousMethodList[] = {\n";
+# print OUT " 0,\n";
+ for my $r (@resolve) {
+ unless($r) {
+# print OUT " 0,\n";
+ next;
+ }
+ my $xsig = $r->{p}{class} ? "$r->{p}{class}\::$r->{k}" : $r->{p}{sig};
+ die "ambiguousMethodList: no method found for $xsig\n" if !defined $allMethods{$xsig};
+# print OUT " $allMethods{$xsig}, // $xsig\n";
+ }
+# print OUT "};\n\n";
+
+# print OUT "extern \"C\" { // needed?\n";
+# print OUT " void init_${libname}_Smoke();\n";
+# print OUT "}\n";
+# print OUT "\n";
+# print OUT "Smoke* qt_Smoke = 0L;\n";
+# print OUT "\n";
+# print OUT "// Create the Smoke instance encapsulating all the above.\n";
+# print OUT "void init_${libname}_Smoke() {\n";
+# print OUT " qt_Smoke = new Smoke(\n";
+# print OUT " ${libname}_classes, ".$#classlist.",\n";
+# print OUT " ${libname}_methods, $methodCount,\n";
+# print OUT " ${libname}_methodMaps, $methodMapCount,\n";
+# print OUT " ${libname}_methodNames, $methodNameCount,\n";
+# print OUT " ${libname}_types, $typeCount,\n";
+# print OUT " ${libname}_inheritanceList,\n";
+# print OUT " ${libname}_argumentList,\n";
+# print OUT " ${libname}_ambiguousMethodList,\n";
+# print OUT " ${libname}_cast );\n";
+# print OUT "}\n";
+# close OUT;
+
+#print "@{[keys %allMethods ]}\n";
+}
+=head2 printJavadocComment
+
+ Parameters: docnode filehandle
+
+ Converts a kdoc comment to javadoc format.
+ @ref's are converted to @link's; @p's and @em's are converted
+ to inline HTML.
+
+=cut
+
+sub printJavadocComment($$$$)
+{
+ my( $docnode, $name, $indent, $signalLink ) = @_;
+
+ my $node;
+ my $returntext = '';
+ foreach $node ( @{$docnode->{Text}} ) {
+ next if $node->{NodeType} ne "DocText" and $node->{NodeType} ne "ListItem"
+ and $node->{NodeType} ne "Param";
+ my $line = '';
+
+ if ($node->{NodeType} eq "Param") {
+ if ($node->{Name} !~ /argc/) {
+ $line = "\@param " . $node->{Name} . " " . $node->{astNodeName};
+ }
+ } else {
+ $line = $node->{astNodeName};
+ }
+ $line =~ s/argc, ?argv/args/g;
+ $line =~ s/int argc, ?char ?\* ?argv(\[\])?/String[] args/g;
+ $line =~ s/int argc, ?char ?\*\* ?argv/String[] args/g;
+ if ($node->{NodeType} eq "Param") {
+ $line =~ s/(const )?QC?StringList(\s*&)?/String[]/g;
+ } else {
+ $line =~ s/(const )?QC?StringList(\s*&)?/ArrayList/g;
+ }
+ $line =~ s/NodeList|KTrader::OfferList/ArrayList/g;
+ $line =~ s/(const )?QDate(Time)?(\s*&)?/Calendar/g;
+ $line =~ s/(const )?QTime([^r])/Date$1/g;
+ $line =~ s/QString::null/null/g;
+ $line =~ s/(const )?QC?String(\s*&)?/String/g;
+ $line =~ s/QByteArray/byte[]/g;
+ $line =~ s/(const )?KCmdLineOptions\s*(\w+)\[\]/String[][] $2/;
+ $line =~ s/KCmdLineLastOption//g;
+ $line =~ s/virtual //g;
+ $line =~ s/~\w+\(\)((\s*{\s*})|;)//g;
+ $line =~ s/0L/null/g;
+ $line =~ s/(\([^\)]*\))\s*:\s*\w+\([^\)]*\)/$1/g;
+ $line =~ s/\(void\)//g;
+ $line =~ s/const char/String/g;
+ $line =~ s/const (\w+)\&/$1/g;
+ $line =~ s/bool/boolean/g;
+ $line =~ s/SLOT\(\s*([^\)]*)\) ?\)/SLOT("$1)")/g;
+ $line =~ s/SIGNAL\(\s*([^\)]*)\) ?\)/SIGNAL("$1)")/g;
+ $line =~ s/Q_OBJECT\n//g;
+ $line =~ s/class\s+([\w]+)\s*:\s*public/public class $1 implements/g;
+ $line =~ s/public\s*(slots)?:\n/public /g;
+ $line =~ s/([^0-9"]\s*)\*(\s*[^0-9"-])/$1$2/g;
+ $line =~ s/^(\s*)\*/$1/g;
+ $line =~ s/\n \*/\n /g;
+ $line =~ s/\@ref\s+([\w]+)::([\w]+)\s*(\([^\)]*\))(\.)?/{\@link $1#$2}$4/g;
+ $line =~ s/\@ref\s+#([\w:]+)(\(\))?/{\@link #$1}/g;
+ $line =~ s/\@ref\s+([\w]+)\s*(\([^\)]*\))/{\@link #$1}/g;
+ $line =~ s/\@ref\s+([\w]+)::([\w]+)/{\@link $1#$2}/g;
+ $line =~ s/\@ref\s+([a-z][\w]+)/{\@link #$1}/g;
+ $line =~ s/\@ref\s+([\w]+)/{\@link $1}/g;
+ while ($line =~ /\@c\s+([\w#\\\.<>]+)/ ) {
+ my $code = $1;
+ $code =~ s!<!&lt;!g;
+ $code =~ s!>!&gt;!g;
+ $code =~ s!\\#!#!g;
+ $line =~ s!\@c\s+([\w#\\\.<>]+)!<code>$code</code>!;
+ }
+ $line =~ s!\@em\s+(\w+)!<b>$1</b>!g;
+ $line =~ s!\@p\s+([\w\._]*)!<code>$1</code>!g;
+ $line =~ s!\\paragraph\s+[\w]+\s([\w]+)!<li><b>$1</b></li>!g;
+ $line =~ s!\\b\s+([\w -]+)\\n!<li><b>$1</b></li>!g;
+ $line =~ s!\\c\s+([\w\@&\\?;-]+)!<code>$1</code>!g;
+ $line =~ s!\\p\s+([\w\@]+)!<pre>$1</pre>!g;
+ $line =~ s!\\li\s+([\w\@]+)!<li>$1</li>!g;
+ $line =~ s!<b>([\w\t \(\)-]*:?)</b>\\n!<li><b>$1</b></li>!g;
+ $line =~ s!static_cast<\s*([\w\.]*)\s*>!($1)!g;
+ if ($name ne "") {
+ $line =~ s/\@link #/\@link $name\#/g;
+ }
+
+ if ($node->{NodeType} eq "ListItem") {
+ $line =~ s/^/\n<li>\n/;
+ $line =~ s!$!\n</li>!;
+ $line =~ s/\n/\n$indent\t/g;
+ } else {
+ $line =~ s/^/$indent/;
+ $line =~ s/\n/\n$indent/g;
+ }
+
+ $line =~ s/\n/\n$indent/g;
+ $returntext .= $line;
+ }
+
+ $returntext .= $signalLink;
+
+ if ( defined $docnode->{Returns} ) {
+ my $text = $docnode->{Returns};
+ $text =~ s/QString::null/null/g;
+ $returntext .= "\t\t\@return $text\n";
+ }
+
+ if ( defined $docnode->{Author} ) {
+ $returntext .= "\t\t\@author " . $docnode->{Author} . "\n"
+ }
+
+ if ( defined $docnode->{Version} ) {
+ my $versionStr = $docnode->{Version};
+ $versionStr =~ s/\$\s*Id:([^\$]*) Exp \$/$1/;
+ $returntext .= "\t\t\@version $versionStr\n";
+ }
+
+ if ( defined $docnode->{ClassShort} ) {
+ my $shortText = $docnode->{ClassShort};
+ $shortText =~ s![\*\n]! !g;
+ $returntext .= "\t\t\@short $shortText\n";
+ }
+
+ if ( defined $docnode->{See} ) {
+ foreach my $text ( @{$docnode->{See}} ) {
+ next if ($text =~ /QString|^\s*and\s*$|^\s*$|^[^\w]*$/);
+ $text =~ s/KIO:://g;
+ $text =~ s/KParts:://g;
+ $text =~ s/bool/boolean/g;
+ $text =~ s/::/#/g;
+ $text =~ s/->/#/g;
+ $text =~ s/\./#/g;
+ $text =~ s/\(\)//g;
+ $text =~ s/^\s*([a-z].*)/#$1/g;
+ $text =~ s/^\s*Q/org.kde.qt.Q/g;
+# $text =~ s/^\s*K/org.kde.koala.K/g;
+ $returntext .= "\t\t\@see $text\n";
+ }
+ }
+
+ $returntext =~ s/DOM#([A-Z])/$1/g;
+ $returntext =~ s/KIO#([A-Z])/$1/g;
+ $returntext =~ s/KParts#([A-Z])/$1/g;
+ $returntext =~ s/const\s+(\w+)\s*\&/$1/g;
+ $returntext =~ s/QChar/char/g;
+ $returntext =~ s/QStringList/ArrayList/g;
+ $returntext =~ s/([Aa]) ArrayList/$1n ArrayList/g;
+ $returntext =~ s/QString/String/g;
+ $returntext =~ s/KCmdLineOptions/String[][]/;
+ $returntext =~ s!\\note!<b>Note:<\b>!g;
+ $returntext =~ s!\\(code|verbatim)!<pre>!g;
+ $returntext =~ s!\\(endcode|endverbatim)!</pre>!g;
+ $returntext =~ s!\\addtogroup\s+[\w]+\s+"([^"\@]+)"\s+\@{!<li><b>$1</b></li>!g;
+ $returntext =~ s![\\\@]relates\s+([a-z][\w]*)!{\@link #$1}!g;
+ $returntext =~ s![\\\@]relates\s+(\w+)::(\w+)!{\@link $1#$2}!g;
+ $returntext =~ s![\\\@]relates\s+(#?\w+)!{\@link $1}!g;
+ $returntext =~ s!\\c\s+([\w\@&\\?";-]+)!<code>$1</code>!g;
+ $returntext =~ s!\@p\s+([\w\._]*)!<code>$1</code>!g;
+ $returntext =~ s!\@a\s+([:\w]+)!<b>$1</b>!g;
+ $returntext =~ s![\@\\]b\s+[:\w]!<b>$1</b>!g;
+ $returntext =~ s/};/}/g;
+ $returntext =~ s/::/./g;
+ $returntext =~ s/->/./g;
+
+ $returntext =~ s/\s*$//;
+ return $returntext . "\n" . $indent;
+}
+
+1;