--KsGdsel6WgEHnImy Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hiya Waldo / David / -core, Here's a cleaned up (removed the excluseSelf stuff) patch to add a easier way to call dcop signals. These changes are needed for my first patchs to keditbookmarks so i'd really like to get these in soon as its holding me back from working on the bookmarks stuff. If there are no objections, can I commit this friday? thanks, Alex n.b: to keep the patch readable i've left out the yacc.cc and scanner.cc files, so "make parser" needs to be run in dcopidl before compiling with the patch. -- Eidetica kelletta@eidetica.com Kruislaan 400 tel +31 20 888 4090 fax 4001 NL 1098 SM Amsterdam Home machine: myp.ath.cx http://www.eidetica.com/ Alexander Kellett (Lypanov) vim: tw=70 cindent! --KsGdsel6WgEHnImy Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="k_dcop_signals.patch" 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; } --KsGdsel6WgEHnImy--