[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    [PATCH] (Please review) k_dcop_signals patch
From:       Alexander Kellett <kelletta () eidetica ! com>
Date:       2001-10-30 12:46:58
[Download RAW message or body]

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!

["k_dcop_signals.patch" (text/plain)]

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<DCOPRef> 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(
-				"    <FUNC qual=\"const\">\n"
-				"        %2\n"
-				"        <NAME>%1</NAME>"
-				"%3\n"
-				"     </FUNC>\n");
-		else
-			tmp = new QString(
-				"    <FUNC>\n"
-				"        %2\n"
-				"        <NAME>%1</NAME>"
-				"%3\n"
-				"     </FUNC>\n");
+                tmp = new QString(
+                        "    <%4>\n"
+                        "        %2\n"
+                        "        <NAME>%1</NAME>"
+                        "%3\n"
+                        "     </%5>\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 <dcopstub.h>" << 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 <dcopclient.h>" << endl << endl;
-    str << "#include <kdatastream.h>" << endl << endl;
+    str << "#include <kdatastream.h>" << endl;
 
+    if (signals) {
+       str << "#include <kapp.h>" << 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;
 		    }



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic