00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <testdcop.h>
00027 #include <qtimer.h>
00028
00029 DCOPClientTransaction *countDownAction = 0;
00030 int countDownCount = 0;
00031
00032 DCOPClientTransaction *countDownAction2 = 0;
00033 int countDownCount2 = 0;
00034
00035 bool MyDCOPObject::process(const QCString &fun, const QByteArray &data,
00036 QCString& replyType, QByteArray &replyData)
00037 {
00038 qDebug("in MyDCOPObject::process, fun = %s", fun.data());
00039
00040
00041 if (fun == "aFunction(QString,int)") {
00042 QDataStream args(data, IO_ReadOnly);
00043 QString arg1;
00044 int arg2;
00045 args >> arg1 >> arg2;
00046 function(arg1, arg2);
00047 replyType = "void";
00048 return true;
00049 }
00050 if (fun == "canLaunchRockets(QRect)") {
00051 QDataStream args(data, IO_ReadOnly);
00052 QRect arg1;
00053 args >> arg1;
00054
00055 printf("Rect x = %d, y = %d, w = %d, h = %d\n", arg1.x(), arg1.y(), arg1.width(), arg1.height());
00056
00057 replyType = "QRect";
00058 QDataStream reply( replyData, IO_WriteOnly );
00059 QRect r(10,20,100,200);
00060 reply << r;
00061 return true;
00062 }
00063 if (fun == "isAliveSlot(int)") {
00064
00065 qDebug("isAliveSlot(int)");
00066 bool connectResult = kapp->dcopClient()->disconnectDCOPSignal("", objId(), "", objId(), "" );
00067 qDebug("disconnectDCOPSignal returns %s", connectResult ? "true" : "false");
00068 return true;
00069 }
00070 if (fun == "countDown()") {
00071 qDebug("countDown() countDownAction = %p", countDownAction);
00072 if (countDownAction2)
00073 {
00074 replyType = "QString";
00075 QDataStream reply( replyData, IO_WriteOnly );
00076 reply << QString("Hey");
00077 return true;
00078 }
00079
00080 if (countDownAction == 0)
00081 {
00082 countDownCount = 10;
00083 countDownAction = kapp->dcopClient()->beginTransaction();
00084 QTimer::singleShot(1000, this, SLOT(slotTimeout()));
00085 }
00086 else
00087 {
00088 countDownCount2 = 10;
00089 countDownAction2 = kapp->dcopClient()->beginTransaction();
00090 QTimer::singleShot(1000, this, SLOT(slotTimeout2()));
00091 }
00092 return true;
00093 }
00094
00095 return DCOPObject::process(fun, data, replyType, replyData);
00096 }
00097
00098 void MyDCOPObject::slotTimeout()
00099 {
00100 qDebug("MyDCOPObject::slotTimeout() %d", countDownCount);
00101 countDownCount--;
00102 if (countDownCount == 0)
00103 {
00104 QCString replyType = "QString";
00105 QByteArray replyData;
00106 QDataStream reply( replyData, IO_WriteOnly );
00107 reply << QString("Hello World");
00108 kapp->dcopClient()->endTransaction(countDownAction, replyType, replyData);
00109 countDownAction = 0;
00110 }
00111 else
00112 {
00113 QTimer::singleShot(1000, this, SLOT(slotTimeout()));
00114 }
00115 }
00116
00117 void MyDCOPObject::slotTimeout2()
00118 {
00119 qDebug("MyDCOPObject::slotTimeout2() %d", countDownCount2);
00120 countDownCount2--;
00121 if (countDownCount2 == 0)
00122 {
00123 QCString replyType = "QString";
00124 QByteArray replyData;
00125 QDataStream reply( replyData, IO_WriteOnly );
00126 reply << QString("Hello World");
00127 kapp->dcopClient()->endTransaction(countDownAction2, replyType, replyData);
00128 countDownAction2 = 0;
00129 }
00130 else
00131 {
00132 QTimer::singleShot(1000, this, SLOT(slotTimeout2()));
00133 }
00134 }
00135
00136 QCStringList MyDCOPObject::functions()
00137 {
00138 QCStringList result = DCOPObject::functions();
00139 result << "QRect canLaunchRockets(QRect)";
00140 return result;
00141 }
00142
00143 TestObject::TestObject(const QCString& app)
00144 : m_app(app)
00145 {
00146 QTimer::singleShot(2500, this, SLOT(slotTimeout()));
00147 }
00148
00149 void TestObject::slotTimeout()
00150 {
00151 QCString replyType;
00152 QByteArray data, reply;
00153 qWarning("#3 Calling countDown");
00154
00155 if (!kapp->dcopClient()->call(m_app, "object1", "countDown()", data, replyType, reply))
00156 qDebug("#3 I couldn't call countDown");
00157 else
00158 qDebug("#3 countDown() return type was '%s'", replyType.data() );
00159
00160 }
00161
00162 void TestObject::slotCallBack(int callId, const QCString &replyType, const QByteArray &replyData)
00163 {
00164 qWarning("Call Back! callId = %d", callId);
00165 qWarning("Type = %s", replyType.data());
00166
00167 QDataStream args(replyData, IO_ReadOnly);
00168 QString arg1;
00169 args >> arg1;
00170
00171 qWarning("Value = %s", arg1.latin1());
00172 }
00173
00174 int main(int argc, char **argv)
00175 {
00176 KApplication app(argc, argv, "testdcop");
00177
00178 QCString replyType;
00179 QByteArray data, reply;
00180 DCOPClient *client; client = app.dcopClient();
00181
00182 if (argc == 2)
00183 {
00184 QCString app = argv[1];
00185 TestObject obj(app);
00186 qWarning("#1 Calling countDown");
00187 int result = kapp->dcopClient()->callAsync(app, "object1", "countDown()", data, &obj, SLOT(slotCallBack(int, const QCString&, const QByteArray&)));
00188 qDebug("#1 countDown() call id = %d", result);
00189 qWarning("#2 Calling countDown");
00190 result = kapp->dcopClient()->callAsync(app, "object1", "countDown()", data, &obj, SLOT(slotCallBack(int, const QCString&, const QByteArray&)));
00191 qDebug("#2 countDown() call id = %d", result);
00192 kapp->exec();
00193
00194 return 0;
00195 }
00196
00197
00198
00199 client->registerAs( app.name(), false );
00200 qDebug("I registered as '%s'", client->appId().data() );
00201
00202 if ( client->isApplicationRegistered( app.name() ) )
00203 qDebug("indeed, we are registered!");
00204
00205 QDataStream dataStream( data, IO_WriteOnly );
00206 dataStream << (int) 43;
00207 client->emitDCOPSignal("alive(int,QCString)", data);
00208
00209 MyDCOPObject *obj1 = new MyDCOPObject("object1");
00210
00211 bool connectResult = client->connectDCOPSignal("", "alive(int , QCString)", "object1", "isAliveSlot(int)", false);
00212 qDebug("connectDCOPSignal returns %s", connectResult ? "true" : "false");
00213
00214 QDataStream ds(data, IO_WriteOnly);
00215 ds << QString("fourty-two") << 42;
00216 if (!client->call(app.name(), "object1", "aFunction(QString,int)", data, replyType, reply))
00217 qDebug("I couldn't call myself");
00218 else
00219 qDebug("return type was '%s'", replyType.data() );
00220
00221 client->send(app.name(), "object1", "aFunction(QString,int)", data );
00222
00223 int n = client->registeredApplications().count();
00224 qDebug("number of attached applications = %d", n );
00225
00226 QObject::connect( client, SIGNAL( applicationRegistered( const QCString&)),
00227 obj1, SLOT( registered( const QCString& )));
00228
00229 QObject::connect( client, SIGNAL( applicationRemoved( const QCString&)),
00230 obj1, SLOT( unregistered( const QCString& )));
00231
00232
00233 client->setNotifications( true );
00234
00235 QCString foundApp;
00236 QCString foundObj;
00237
00238
00239
00240
00241
00242
00243
00244
00245 bool boolResult = client->findObject( "konqueror*", "", "", data, foundApp, foundObj);
00246 qDebug("findObject: result = %s, %s, %s\n", boolResult ? "true" : "false",
00247 foundApp.data(), foundObj.data());
00248
00249
00250 boolResult = client->findObject( "", "ksycoca", "", data, foundApp, foundObj);
00251 qDebug("findObject: result = %s, %s, %s\n", boolResult ? "true" : "false",
00252 foundApp.data(), foundObj.data());
00253
00254
00255 boolResult = client->findObject( "testdcop", "ksycoca", "", data, foundApp, foundObj);
00256 qDebug("findObject: result = %s, %s, %s\n", boolResult ? "true" : "false",
00257 foundApp.data(), foundObj.data());
00258
00259 DCOPClient *client2 = new DCOPClient();
00260 client2->registerAs(app.name(), false);
00261 qDebug("I2 registered as '%s'", client2->appId().data() );
00262
00263 qDebug("Sending to object1");
00264 client2->send(app.name(), "object1", "aFunction(QString,int)", data );
00265
00266 qDebug("Calling object1");
00267 if (!client2->call(app.name(), "object1", "aFunction(QString,int)", data, replyType, reply))
00268 qDebug("I couldn't call myself");
00269 else
00270 qDebug("return type was '%s'", replyType.data() );
00271
00272 qDebug("Calling countDown() in object1");
00273 if (!client2->call(app.name(), "object1", "countDown()", data, replyType, reply))
00274 qDebug("I couldn't call myself");
00275 else
00276 qDebug("return type was '%s'", replyType.data() );
00277
00278
00279 boolResult = client2->findObject( "testdcop", "object1", "", data, foundApp, foundObj);
00280 qDebug("findObject: result = %s, %s, %s\n", boolResult ? "true" : "false",
00281 foundApp.data(), foundObj.data());
00282
00283
00284 return app.exec();
00285
00286 client->detach();
00287 }
00288
00289 #include "testdcop.moc"