[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-core-devel
Subject: [PATCH] k_dcop_signals (with clean patch)
From: Alexander Kellett <kelletta () eidetica ! com>
Date: 2001-09-30 22:42:49
[Download RAW message or body]
A few cleanups and the addition of "excludeself" to dcopidl, and
an optional option excludeself to emitDCOPsignal to match the nice
API in dcopsignals.*
ciao,
Alex
--
Eidetica kelletta@eidetica.com
Kruislaan 400 tel +31 20 888 4090 fax 4001
NL 1098 SM Amsterdam
http://www.eidetica.com/ Alexander Kellett
vim: tw=70 cindent!
["kdelibs-dcop.cvsdiff.patch" (text/plain)]
? more
Index: dcopclient.cpp
===================================================================
RCS file: /home/kde/kdelibs/dcop/dcopclient.cpp,v
retrieving revision 1.115
diff -u -3 -p -r1.115 dcopclient.cpp
--- dcopclient.cpp 2001/07/16 19:15:02 1.115
+++ dcopclient.cpp 2001/09/30 22:39:30
@@ -1576,16 +1576,16 @@ DCOPClient::endTransaction( DCOPClientTr
}
void
-DCOPClient::emitDCOPSignal( const QCString &object, const QCString &signal, const \
QByteArray &data) +DCOPClient::emitDCOPSignal( const QCString &object, const QCString \
&signal, const QByteArray &data, bool excludeSelf) {
// We hack the sending object name into the signal name
- send("DCOPServer", "emit", object+"#"+normalizeFunctionSignature(signal), data);
+ send("DCOPServer", "emit", object+"#"+normalizeFunctionSignature(signal), data, \
excludeSelf); }
void
-DCOPClient::emitDCOPSignal( const QCString &signal, const QByteArray &data)
+DCOPClient::emitDCOPSignal( const QCString &signal, const QByteArray &data, bool \
excludeSelf) {
- emitDCOPSignal(0, signal, data);
+ emitDCOPSignal(0, signal, data, excludeSelf);
}
bool
Index: dcopclient.h
===================================================================
RCS file: /home/kde/kdelibs/dcop/dcopclient.h,v
retrieving revision 1.59
diff -u -3 -p -r1.59 dcopclient.h
--- dcopclient.h 2001/07/17 21:06:15 1.59
+++ dcopclient.h 2001/09/30 22:39:31
@@ -275,12 +275,14 @@ class DCOPClient : public QObject
/**
* Emit @p signal as DCOP signal from object @p object with @p data as
* arguments
+ * @param excludeSelf if true application that sends will not recieve the signal
*/
void emitDCOPSignal( const QCString &object, const QCString &signal,
- const QByteArray &data);
+ const QByteArray &data, bool excludeSelf = false);
/* For backwards compatibility */
- void emitDCOPSignal( const QCString &signal, const QByteArray &data);
+ void emitDCOPSignal( const QCString &signal, const QByteArray &data,
+ bool excludeSelf = false);
/**
* Connect to a DCOP signal
Index: dcopobject.h
===================================================================
RCS file: /home/kde/kdelibs/dcop/dcopobject.h,v
retrieving revision 1.32
diff -u -3 -p -r1.32 dcopobject.h
--- dcopobject.h 2001/01/28 23:37:30 1.32
+++ dcopobject.h 2001/09/30 22:39:31
@@ -42,6 +42,8 @@ public: \
private:
#define k_dcop public
+#define k_dcop_signals public
+#define excludeself
#define ASYNC void
/**
Index: dcopidl/dcopidl_test.h
===================================================================
RCS file: /home/kde/kdelibs/dcop/dcopidl/dcopidl_test.h,v
retrieving revision 1.10
diff -u -3 -p -r1.10 dcopidl_test.h
--- dcopidl/dcopidl_test.h 2001/04/11 18:35:17 1.10
+++ dcopidl/dcopidl_test.h 2001/09/30 22:39:31
@@ -44,7 +44,12 @@ k_dcop:
virtual DCOPRef getPage( int num );
int getPageOfObj( int obj );
void setCell( const int& point = 3 );
+ void setCell( const int& point = QString::null );
QValueList<DCOPRef> getWindows();
+
+k_dcop_signals:
+ static void blah_signal();
+ static int blah_signal() excludeself;
private:
Test3 *doc();
Index: dcopidl/scanner.ll
===================================================================
RCS file: /home/kde/kdelibs/dcop/dcopidl/scanner.ll,v
retrieving revision 1.25
diff -u -3 -p -r1.25 scanner.ll
--- dcopidl/scanner.ll 2001/04/25 18:24:02 1.25
+++ dcopidl/scanner.ll 2001/09/30 22:39:31
@@ -210,6 +210,7 @@ class return T_CLASS;
struct return T_STRUCT;
operator return T_FUNOPERATOR;
virtual return T_VIRTUAL;
+excludeself return T_EXCLUDESELF;
public return T_PUBLIC;
inline return T_INLINE;
static return T_STATIC;
@@ -230,6 +231,7 @@ false return T_FALSE;
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.40
diff -u -3 -p -r1.40 yacc.yy
--- dcopidl/yacc.yy 2001/05/03 11:59:46 1.40
+++ dcopidl/yacc.yy 2001/09/30 22:39:31
@@ -39,6 +39,7 @@ extern int idl_line_no;
extern int function_mode;
static int dcop_area = 0;
+static int dcop_signal_area = 0;
static QString in_namespace( "" );
@@ -81,6 +82,7 @@ void yyerror( const char *s )
%token T_TRIPE_DOT
%token T_PRIVATE
%token T_VIRTUAL
+%token T_EXCLUDESELF
%token T_CONST
%token T_INLINE
%token T_FRIEND
@@ -116,6 +118,7 @@ void yyerror( const char *s )
%token T_CHAR
%token T_DCOP
%token T_DCOP_AREA
+%token T_DCOP_SIGNAL_AREA
%token T_SIGNED
%token T_UNSIGNED
%token T_LONG
@@ -141,6 +144,7 @@ void yyerror( const char *s )
%type <_str> int_type
%type <_int> const_qualifier
%type <_int> virtual_qualifier
+%type <_int> excludeself_qualifier
%type <_str> Identifier
%type <_int> dcoptag
@@ -242,10 +246,12 @@ nodcop_area_begin
: 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
@@ -254,6 +260,12 @@ dcop_area_begin
dcop_area = 1;
}
+dcop_signal_area_begin
+ : T_DCOP_SIGNAL_AREA T_COLON
+ {
+ dcop_signal_area = 1;
+ }
+
Identifier
: T_IDENTIFIER {
$$ = $1;
@@ -330,6 +342,10 @@ body
{
$$ = $2;
}
+ | dcop_signal_area_begin body
+ {
+ $$ = $2;
+ }
| dcop_area_begin body
{
$$ = $2;
@@ -606,6 +622,10 @@ default_value
}
;
+excludeself_qualifier
+ : /* empty */ { $$ = 0; }
+ | T_EXCLUDESELF { $$ = 1; }
+
virtual_qualifier
: /* empty */ { $$ = 0; }
| T_VIRTUAL { $$ = 1; }
@@ -614,27 +634,34 @@ operator
: T_MISCOPERATOR | T_GREATER | T_LESS | T_EQUAL ;
function_header
- : type Identifier T_LEFT_PARANTHESIS params T_RIGHT_PARANTHESIS const_qualifier
+ : type Identifier T_LEFT_PARANTHESIS params T_RIGHT_PARANTHESIS const_qualifier \
excludeself_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";
+ if ($7) attr = " excludeself=\"true\"";
+ } else {
+ tagname = "FUNC";
+ }
+ *tmp = tmp->arg( QString("%1%2").arg(tagname).arg(attr) );
+ *tmp = tmp->arg( QString("%1").arg(tagname) );
$$ = tmp;
} else
$$ = new QString("");
@@ -665,39 +692,56 @@ init_list
function
: function_header function_body
{
+ if (dcop_signal_area)
+ yyerror("functions in k_dcop_signal sections must be static.");
$$ = $1;
}
| T_VIRTUAL function_header T_EQUAL T_NULL function_body
{
+ if (dcop_signal_area)
+ yyerror("functions in k_dcop_signal sections must be static.");
$$ = $2;
}
| T_VIRTUAL function_header function_body
{
+ if (dcop_signal_area)
+ yyerror("functions in k_dcop_signal sections must be static.");
$$ = $2;
}
| Identifier T_LEFT_PARANTHESIS params T_RIGHT_PARANTHESIS function_body
{
+ if (dcop_signal_area)
+ yyerror("functions in k_dcop_signal sections must be static.");
/* The constructor */
assert(!dcop_area);
$$ = new QString("");
}
| Identifier T_LEFT_PARANTHESIS params T_RIGHT_PARANTHESIS T_COLON init_list \
function_body {
+ if (dcop_signal_area)
+ yyerror("functions in k_dcop_signal sections must be static.");
/* The constructor */
assert(!dcop_area);
$$ = new QString("");
}
| virtual_qualifier T_TILDE Identifier T_LEFT_PARANTHESIS T_RIGHT_PARANTHESIS \
function_body {
+ if (dcop_signal_area)
+ yyerror("functions in k_dcop_signal sections must be static.");
/* The destructor */
assert(!dcop_area);
$$ = new QString("");
}
| 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) {
+ yyerror("static is not allowed in dcop area!");
+ $$ = new QString();
+ } else {
+ $$ = $2;
+ }
+ }
}
function_begin : T_LEFT_CURLY_BRACKET
Index: dcopidl2cpp/main.cpp
===================================================================
RCS file: /home/kde/kdelibs/dcop/dcopidl2cpp/main.cpp,v
retrieving revision 1.16
diff -u -3 -p -r1.16 main.cpp
--- dcopidl2cpp/main.cpp 2000/07/20 17:06:28 1.16
+++ dcopidl2cpp/main.cpp 2001/09/30 22:39:31
@@ -111,7 +111,7 @@ int main( int argc, char** argv )
pos = header.findRev('/');
if ( pos != -1 )
header = header.mid( pos+1 );
- generateStubImpl( idl, header, base + "_stub." + suffix, de );
+ generateStubImpl( idl, header, base+".h", base + "_stub." + suffix, de );
}
return 0;
Index: dcopidl2cpp/main.h
===================================================================
RCS file: /home/kde/kdelibs/dcop/dcopidl2cpp/main.h,v
retrieving revision 1.2
diff -u -3 -p -r1.2 main.h
--- dcopidl2cpp/main.h 2000/07/16 01:43:48 1.2
+++ dcopidl2cpp/main.h 2001/09/30 22:39:31
@@ -36,5 +36,5 @@ void generateStub( const QString& idl, c
/**
* 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 \
);
Index: dcopidl2cpp/stubimpl.cpp
===================================================================
RCS file: /home/kde/kdelibs/dcop/dcopidl2cpp/stubimpl.cpp,v
retrieving revision 1.11
diff -u -3 -p -r1.11 stubimpl.cpp
--- dcopidl2cpp/stubimpl.cpp 2000/12/04 12:40:53 1.11
+++ dcopidl2cpp/stubimpl.cpp 2001/09/30 22:39:31
@@ -55,7 +55,7 @@ int isIntType( const QString& t)
/**
* 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 ) {
QFile impl( filename );
if ( !impl.open( IO_WriteOnly ) )
@@ -72,16 +72,21 @@ void generateStubImpl( const QString& id
str << "*****************************************************************************/" \
<< endl; str << endl;
- str << "#include \"" << header << "\"" << endl;
+ str << "#include \"" << header << "\"" << endl;
str << "#include <dcopclient.h>" << endl << endl;
str << "#include <kdatastream.h>" << endl << endl;
+ // if signal
+ str << "#include <kapp.h>" << endl << endl;
+ str << "#include \"" << headerBase << "\"" << endl << endl;
+
QDomElement e = de.firstChild().toElement();
for( ; !e.isNull(); e = e.nextSibling().toElement() ) {
if ( e.tagName() == "CLASS" ) {
QDomElement n = e.firstChild().toElement();
ASSERT( n.tagName() == "NAME" );
- QString className = n.firstChild().toText().data() + "_stub";
+ QString classNameBase = n.firstChild().toText().data();
+ QString className = classNameBase + "_stub";
// find dcop parent ( rightmost super class )
QString DCOPParent;
@@ -135,7 +140,8 @@ void generateStubImpl( const QString& id
// Write marshalling code
s = e.firstChild().toElement();
for( ; !s.isNull(); s = s.nextSibling().toElement() ) {
- if ( s.tagName() == "FUNC" ) {
+ if ( s.tagName() == "FUNC" || s.tagName() == "SIGNAL" ) {
+ bool signal = (s.tagName() == "SIGNAL");
QDomElement r = s.firstChild().toElement();
ASSERT( r.tagName() == "TYPE" );
QString result = r.firstChild().toText().data();
@@ -153,7 +159,7 @@ void generateStubImpl( const QString& id
r = r.nextSibling().toElement();
ASSERT ( r.tagName() == "NAME" );
QString funcName = r.firstChild().toText().data();
- str << className << "::" << funcName << "(";
+ str << ( signal ? classNameBase : className ) << "::" << funcName << "(";
QStringList args;
QStringList argtypes;
@@ -183,6 +189,8 @@ void generateStubImpl( const QString& id
str << " ";
str << ")";
+ QString excludeself = s.attribute("excludeself","false");
+
if ( s.hasAttribute("qual") )
str << " " << s.attribute("qual");
str << endl;
@@ -199,12 +207,18 @@ void generateStubImpl( const QString& id
funcName += *it;
}
funcName += ")";
+
+ if ( async || signal ) {
+
+ if ( signal && (result != "void") )
+ qFatal("Sorry DCOP signals can not return values.");
- if ( async ) {
- str << " if ( !dcopClient() ) {"<< endl;
- str << "\tsetStatus( CallFailed );" << endl;
- str << "\treturn;" << endl;
- str << " }" << endl;
+ if (!signal) {
+ str << " if ( !dcopClient() ) {"<< endl;
+ str << "\tsetStatus( CallFailed );" << endl;
+ str << "\treturn;" << endl;
+ str << " }" << endl;
+ }
str << " QByteArray data;" << endl;
if ( !args.isEmpty() ) {
@@ -213,10 +227,15 @@ void generateStubImpl( const QString& id
str << " arg << " << *args_count << ";" << endl;
}
}
- str << " dcopClient()->send( app(), obj(), \"" << funcName << "\", data );" << \
endl;
- str << " setStatus( CallSucceeded );" << endl;
+ if (signal)
+ str << " kapp->dcopClient()->emitDCOPSignal( \"" << \
funcName << "\", data," << excludeself << " );" << endl; + \
else { + str << " dcopClient()->send( app(), obj(), \"" \
<< funcName << "\", data );" << endl; + str << " \
setStatus( CallSucceeded );" << endl; + }
+
} else {
-
+
if ( result != "void" ) {
str << " " << result << " result";
if (isIntType( result ))
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic