Index: dcopobject.h =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopobject.h,v retrieving revision 1.37 diff -u -r1.37 dcopobject.h --- dcopobject.h 2001/10/26 23:31:11 1.37 +++ dcopobject.h 2001/10/30 11:25:47 @@ -42,6 +42,7 @@ QCStringList interfaces(); \ private: +#define k_dcop_signals public #define k_dcop public #define ASYNC void Index: dcopsignals.cpp =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopsignals.cpp,v retrieving revision 1.7 diff -u -r1.7 dcopsignals.cpp --- dcopsignals.cpp 2001/09/12 14:13:18 1.7 +++ dcopsignals.cpp 2001/10/30 11:25:47 @@ -32,7 +32,7 @@ /** * Client "conn" emits the signal "fun" with "data" as arguments. * - * If "excludeSelf" is true, signal is never send to "conn" itself. + * If "excludeSelf" is true, signal is never sent to "conn" itself. */ void DCOPSignals::emitSignal( DCOPConnection *conn, const QCString &_fun, const QByteArray &data, bool excludeSelf) Index: dcopidl/dcopidl_test.h =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopidl/dcopidl_test.h,v retrieving revision 1.12 diff -u -r1.12 dcopidl_test.h --- dcopidl/dcopidl_test.h 2001/10/23 08:55:54 1.12 +++ dcopidl/dcopidl_test.h 2001/10/30 11:25:47 @@ -45,7 +45,11 @@ virtual int getNumPages(); virtual DCOPRef getPage( int num ); int getPageOfObj( int obj ); + void setCell( const int& point = QString::null ); void setCell( const int& point = 3 ); + +k_dcop_signals: + static void blah_signal(); QValueList getWindows(); private: Index: dcopidl/scanner.ll =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopidl/scanner.ll,v retrieving revision 1.26 diff -u -r1.26 scanner.ll --- dcopidl/scanner.ll 2001/10/04 12:27:16 1.26 +++ dcopidl/scanner.ll 2001/10/30 11:25:48 @@ -231,6 +231,7 @@ TRUE return T_TRUE; FALSE return T_FALSE; "k_dcop" return T_DCOP_AREA; +"k_dcop_signals" return T_DCOP_SIGNAL_AREA; typedef return T_TYPEDEF; K_DCOP return T_DCOP; Q_OBJECT ; Index: dcopidl/yacc.yy =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopidl/yacc.yy,v retrieving revision 1.44 diff -u -r1.44 yacc.yy --- dcopidl/yacc.yy 2001/10/28 18:09:39 1.44 +++ dcopidl/yacc.yy 2001/10/30 11:25:48 @@ -39,6 +39,7 @@ extern int function_mode; static int dcop_area = 0; +static int dcop_signal_area = 0; static QString in_namespace( "" ); @@ -116,6 +117,7 @@ %token T_CHAR %token T_DCOP %token T_DCOP_AREA +%token T_DCOP_SIGNAL_AREA %token T_SIGNED %token T_UNSIGNED %token T_LONG @@ -243,10 +245,12 @@ : nodcop_area sigslot T_COLON { dcop_area = 0; + dcop_signal_area = 0; } | sigslot T_COLON { dcop_area = 0; + dcop_signal_area = 0; } dcop_area_begin @@ -255,6 +259,12 @@ dcop_area = 1; } +dcop_signal_area_begin + : T_DCOP_SIGNAL_AREA T_COLON + { + dcop_signal_area = 1; + } + Identifier : T_IDENTIFIER { $$ = $1; @@ -333,6 +343,10 @@ { $$ = new QString( *($1) + *($2) ); } + | dcop_signal_area_begin body + { + $$ = $2; + } | enum body { $$ = $2; @@ -624,25 +638,31 @@ function_header : type Identifier T_LEFT_PARANTHESIS params T_RIGHT_PARANTHESIS const_qualifier { - if (dcop_area) { + if (dcop_area || dcop_signal_area) { QString* tmp = 0; - if ( $6 ) - tmp = new QString( - " \n" - " %2\n" - " %1" - "%3\n" - " \n"); - else - tmp = new QString( - " \n" - " %2\n" - " %1" - "%3\n" - " \n"); + tmp = new QString( + " <%4>\n" + " %2\n" + " %1" + "%3\n" + " \n"); *tmp = tmp->arg( *($2) ); *tmp = tmp->arg( *($1) ); - *tmp = tmp->arg( *($4) ); + if ($6) { + *tmp = tmp->arg( *($4) + " qual=\"const\">" ); + } else { + *tmp = tmp->arg( *($4) ); + } + + QString tagname = ""; + QString attr = ""; + if (dcop_signal_area) { + tagname = "SIGNAL"; + } else { + tagname = "FUNC"; + } + *tmp = tmp->arg( QString("%1%2").arg(tagname).arg(attr) ); + *tmp = tmp->arg( QString("%1").arg(tagname) ); $$ = tmp; } else $$ = new QString(""); @@ -703,10 +723,15 @@ } | T_STATIC function_header function_body { - if (dcop_area) - yyerror("static is not allowed in dcop area!"); - $$ = new QString(); - } + if (dcop_area) { + if (dcop_signal_area) + $$ = $2; + else + yyerror("static is not allowed in dcop area!"); + } else { + $$ = new QString(); + } + } function_begin : T_LEFT_CURLY_BRACKET { Index: dcopidl2cpp/Makefile.am =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopidl2cpp/Makefile.am,v retrieving revision 1.12 diff -u -r1.12 Makefile.am --- dcopidl2cpp/Makefile.am 2000/08/07 20:14:44 1.12 +++ dcopidl2cpp/Makefile.am 2001/10/30 11:25:48 @@ -11,4 +11,3 @@ dcopidl2cpp_LDADD = $(LIB_QT) dcopidl2cpp_LDFLAGS = $(KDE_RPATH) - Index: dcopidl2cpp/main.cpp =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopidl2cpp/main.cpp,v retrieving revision 1.17 diff -u -r1.17 main.cpp --- dcopidl2cpp/main.cpp 2001/08/31 07:16:18 1.17 +++ dcopidl2cpp/main.cpp 2001/10/30 11:25:48 @@ -106,12 +106,14 @@ generateSkel( idl, base + "_skel." + suffix, de ); if ( generate_stub ) { - QString header = base + "_stub.h"; - generateStub( idl, header, de ); + QString header = base; + generateStub( idl, header + "_stub.h", de, false ); + generateStub( idl, header + "_signals.h", de, true ); pos = header.findRev('/'); if ( pos != -1 ) header = header.mid( pos+1 ); - generateStubImpl( idl, header, base + "_stub." + suffix, de ); + generateStubImpl( idl, header + "_stub.h", base+".h", base + "_stub." + suffix, de, false ); + generateStubImpl( idl, header + "_signals.h", base+".h", base + "_signals." + suffix, de, true ); } return 0; Index: dcopidl2cpp/main.h =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopidl2cpp/main.h,v retrieving revision 1.2 diff -u -r1.2 main.h --- dcopidl2cpp/main.h 2000/07/16 01:43:48 1.2 +++ dcopidl2cpp/main.h 2001/10/30 11:25:48 @@ -31,10 +31,10 @@ /** * Writes the stubs header */ -void generateStub( const QString& idl, const QString& filename, QDomElement de ); +void generateStub( const QString& idl, const QString& filename, QDomElement de, bool signals ); /** * Writes the stub implementation */ -void generateStubImpl( const QString& idl, const QString& header, const QString& filename, QDomElement de ); +void generateStubImpl( const QString& idl, const QString& header, const QString& headerBase, const QString& filename, QDomElement de, bool signals ); Index: dcopidl2cpp/stub.cpp =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopidl2cpp/stub.cpp,v retrieving revision 1.6 diff -u -r1.6 stub.cpp --- dcopidl2cpp/stub.cpp 2001/10/10 21:27:42 1.6 +++ dcopidl2cpp/stub.cpp 2001/10/30 11:25:48 @@ -36,7 +36,7 @@ /** * Writes the stubs header */ -void generateStub( const QString& idl, const QString& filename, QDomElement de ) +void generateStub( const QString& idl, const QString& filename, QDomElement de, bool signals ) { QFile stub( filename ); if ( !stub.open( IO_WriteOnly ) ) @@ -58,8 +58,9 @@ if ( pos != -1 ) ifdefstring = ifdefstring.left( pos ); - str << "#ifndef __" << ifdefstring << "_STUB__" << endl; - str << "#define __" << ifdefstring << "_STUB__" << endl << endl; + QString ifdefsuffix = signals ? "_SIGNALS__" : "_STUB__"; + str << "#ifndef __" << ifdefstring << ifdefsuffix << endl; + str << "#define __" << ifdefstring << ifdefsuffix << endl << endl; str << "#include " << endl; @@ -84,7 +85,8 @@ QDomElement n = e.firstChild().toElement(); Q_ASSERT( n.tagName() == "NAME" ); - QString className = n.firstChild().toText().data() + "_stub"; + QString className = n.firstChild().toText().data() + + ( signals ? "_signals" : "_stub" ); // find dcop parent ( rightmost super class ) QString DCOPParent; @@ -116,27 +118,32 @@ str << "class " << className; // Parent : inherited interface stub or dcopstub - if ( !DCOPParent.isEmpty() && DCOPParent != "DCOPObject" ) { - str << " : "; - str << "virtual public " << DCOPParent << "_stub"; - } else { - str << " : virtual public DCOPStub"; - } + if (!signals) { + if ( !DCOPParent.isEmpty() && DCOPParent != "DCOPObject" ) { + str << " : "; + str << "virtual public " << DCOPParent << "_stub"; + } else { + str << " : virtual public DCOPStub"; + } + } str << endl; str << "{" << endl; str << "public:" << endl; - // Constructors - str << " " << className << "( const QCString& app, const QCString& id );" << endl; - str << " " << className << "( DCOPClient* client, const QCString& app, const QCString& id );" << endl; + if (!signals) { + // Constructors + str << " " << className << "( const QCString& app, const QCString& id );" << endl; + str << " " << className << "( DCOPClient* client, const QCString& app, const QCString& id );" << endl; + } s = e.firstChild().toElement(); for( ; !s.isNull(); s = s.nextSibling().toElement() ) { - if ( s.tagName() == "FUNC" ) { + if ( (!signals && s.tagName() == "FUNC") + || (signals && s.tagName() == "SIGNAL") ) { QDomElement r = s.firstChild().toElement(); Q_ASSERT( r.tagName() == "TYPE" ); - str << " virtual "; + str << (signals ? " static " : " virtual "); if ( r.hasAttribute( "qleft" ) ) str << r.attribute("qleft") << " "; str << r.firstChild().toText().data(); Index: dcopidl2cpp/stubimpl.cpp =================================================================== RCS file: /home/kde/kdelibs/dcop/dcopidl2cpp/stubimpl.cpp,v retrieving revision 1.13 diff -u -r1.13 stubimpl.cpp --- dcopidl2cpp/stubimpl.cpp 2001/08/31 07:16:18 1.13 +++ dcopidl2cpp/stubimpl.cpp 2001/10/30 11:25:48 @@ -56,7 +56,7 @@ /** * Writes the stub implementation */ -void generateStubImpl( const QString& idl, const QString& header, const QString& filename, QDomElement de ) +void generateStubImpl( const QString& idl, const QString& header, const QString& headerBase, const QString& filename, QDomElement de, bool signals ) { QFile impl( filename ); if ( !impl.open( IO_WriteOnly ) ) @@ -73,16 +73,22 @@ str << "*****************************************************************************/" << endl; str << endl; - str << "#include \"" << header << "\"" << endl; + str << "#include \"" << header << "\"" << endl; str << "#include " << endl << endl; - str << "#include " << endl << endl; + str << "#include " << endl; + if (signals) { + str << "#include " << endl << endl; + } + QDomElement e = de.firstChild().toElement(); for( ; !e.isNull(); e = e.nextSibling().toElement() ) { if ( e.tagName() == "CLASS" ) { QDomElement n = e.firstChild().toElement(); Q_ASSERT( n.tagName() == "NAME" ); - QString className = n.firstChild().toText().data() + "_stub"; + QString classNameBase = n.firstChild().toText().data(); + QString className_stub = classNameBase + "_stub"; + QString className_signals = classNameBase + "_signals"; // find dcop parent ( rightmost super class ) QString DCOPParent; @@ -92,16 +98,16 @@ DCOPParent = s.firstChild().toText().data(); } - QString classNameFull = className; // class name with possible namespaces prepended + QString classNameFull = className_stub; // class name with possible namespaces prepended // namespaces will be removed from className now int namespace_count = 0; - QString namespace_tmp = className; + QString namespace_tmp = className_stub; str << endl; for(;;) { int pos = namespace_tmp.find( "::" ); if( pos < 0 ) { - className = namespace_tmp; + className_stub = namespace_tmp; break; } str << "namespace " << namespace_tmp.left( pos ) << " {" << endl; @@ -110,33 +116,37 @@ } str << endl; - - // Write constructors - str << className << "::" << className << "( const QCString& app, const QCString& obj )" << endl; - str << " : "; - - if ( DCOPParent.isEmpty() || DCOPParent == "DCOPObject" ) - str << "DCOPStub( app, obj )" << endl; - else - str << DCOPParent << "( app, obj )" << endl; - str << "{" << endl; - str << "}" << endl << endl; + if (!signals) { + // Write constructors + str << className_stub << "::" << className_stub << "( const QCString& app, const QCString& obj )" << endl; + str << " : "; + + if ( DCOPParent.isEmpty() || DCOPParent == "DCOPObject" ) + str << "DCOPStub( app, obj )" << endl; + else + str << DCOPParent << "( app, obj )" << endl; + + str << "{" << endl; + str << "}" << endl << endl; + + str << className_stub << "::" << className_stub << "( DCOPClient* client, const QCString& app, const QCString& obj )" << endl; + str << " : "; + + if ( DCOPParent.isEmpty() || DCOPParent == "DCOPObject" ) + str << "DCOPStub( client, app, obj )" << endl; + else + str << DCOPParent << "( client, app, obj )" << endl; - str << className << "::" << className << "( DCOPClient* client, const QCString& app, const QCString& obj )" << endl; - str << " : "; - - if ( DCOPParent.isEmpty() || DCOPParent == "DCOPObject" ) - str << "DCOPStub( client, app, obj )" << endl; - else - str << DCOPParent << "( client, app, obj )" << endl; + str << "{" << endl; + str << "}" << endl << endl; + } - str << "{" << endl; - str << "}" << endl << endl; // Write marshalling code s = e.firstChild().toElement(); for( ; !s.isNull(); s = s.nextSibling().toElement() ) { - if ( s.tagName() == "FUNC" ) { + if ( (!signals && s.tagName() == "FUNC") + || (signals && s.tagName() == "SIGNAL") ) { QDomElement r = s.firstChild().toElement(); Q_ASSERT( r.tagName() == "TYPE" ); QString result = r.firstChild().toText().data(); @@ -154,7 +164,7 @@ r = r.nextSibling().toElement(); Q_ASSERT ( r.tagName() == "NAME" ); QString funcName = r.firstChild().toText().data(); - str << className << "::" << funcName << "("; + str << ( signals ? className_signals : className_stub ) << "::" << funcName << "("; QStringList args; QStringList argtypes; @@ -184,6 +194,8 @@ str << " "; str << ")"; + bool excludeself = s.attribute("excludeself","false") == "true"; + if ( s.hasAttribute("qual") ) str << " " << s.attribute("qual"); str << endl; @@ -201,12 +213,18 @@ } funcName += ")"; - if ( async ) { - str << " if ( !dcopClient() ) {"<< endl; - str << "\tsetStatus( CallFailed );" << endl; - str << "\treturn;" << endl; - str << " }" << endl; + if ( async || signals ) { + + if ( signals && (result != "void") ) + qFatal("Sorry DCOP signals can not return values."); + if (!signals) { + str << " if ( !dcopClient() ) {"<< endl; + str << "\tsetStatus( CallFailed );" << endl; + str << "\treturn;" << endl; + str << " }" << endl; + } + str << " QByteArray data;" << endl; if ( !args.isEmpty() ) { str << " QDataStream arg( data, IO_WriteOnly );" << endl; @@ -214,10 +232,19 @@ str << " arg << " << *args_count << ";" << endl; } } - str << " dcopClient()->send( app(), obj(), \"" << funcName << "\", data );" << endl; - str << " setStatus( CallSucceeded );" << endl; + + if (signals) { + QString flags = "DCOPClient::EmitDefault"; + flags += ( excludeself ? " || DCOPClient::ExcludeSelf" : "" ); + str << " kapp->dcopClient()->emitDCOPSignal( \"" << funcName << "\", data, " + << flags << " );" << endl; + } else { + str << " dcopClient()->send( app(), obj(), \"" << funcName << "\", data );" << endl; + str << " setStatus( CallSucceeded );" << endl; + } + } else { - + if ( result != "void" ) { str << " " << result << " result"; if (isIntType( result )) @@ -255,9 +282,9 @@ } else { str << "\tsetStatus( CallSucceeded );" << endl; } - str << " } else { " << endl; - str << "\tcallFailed();" << endl; - str << " }" << endl; + str << " } else { " << endl; + str << "\tcallFailed();" << endl; + str << " }" << endl; if ( result != "void" ) str << " return result;" << endl; }