00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <qbuffer.h>
00025 #include <qvariant.h>
00026 #include <qcolor.h>
00027 #include <qimage.h>
00028 #include "../kdatastream.h"
00029 #include "../dcopclient.h"
00030 #include "../dcopref.h"
00031 #include <stdlib.h>
00032 #include <stdio.h>
00033 #include <ctype.h>
00034
00035 #include "marshall.cpp"
00036
00037 static DCOPClient* dcop = 0;
00038 static bool bAppIdOnly = 0;
00039 static bool bLaunchApp = 0;
00040
00041 bool findObject( const char* app, const char* obj, const char* func, QCStringList args )
00042 {
00043 QString f = func;
00044 int left = f.find( '(' );
00045 int right = f.find( ')' );
00046
00047 if ( right < left )
00048 {
00049 qWarning( "parentheses do not match" );
00050 exit(1);
00051 }
00052
00053 if ( !f.isEmpty() && (left < 0) )
00054 f += "()";
00055
00056
00057
00058
00059
00060 QStringList intTypes;
00061 intTypes << "int" << "unsigned" << "long" << "bool" ;
00062
00063 QStringList types;
00064 if ( left >0 && left + 1 < right - 1) {
00065 types = QStringList::split( ',', f.mid( left + 1, right - left - 1) );
00066 for ( QStringList::Iterator it = types.begin(); it != types.end(); ++it ) {
00067 QString lt = (*it).simplifyWhiteSpace();
00068
00069 int s = lt.find(' ');
00070
00071
00072
00073
00074
00075
00076
00077 if ( s > 0 )
00078 {
00079 QStringList partl = QStringList::split(' ' , lt);
00080
00081
00082
00083
00084
00085
00086
00087 s=1;
00088
00089 while (s < (int)partl.count() && intTypes.contains(partl[s]))
00090 {
00091 s++;
00092 }
00093
00094 if (s<(int)partl.count()-1)
00095 {
00096 qWarning("The argument `%s' seems syntactically wrong.",
00097 lt.latin1());
00098 }
00099 if (s==(int)partl.count()-1)
00100 {
00101 partl.remove(partl.at(s));
00102 }
00103
00104 lt = partl.join(" ");
00105 lt = lt.simplifyWhiteSpace();
00106 }
00107
00108 (*it) = lt;
00109 }
00110 QString fc = f.left( left );
00111 fc += '(';
00112 bool first = true;
00113 for ( QStringList::Iterator it = types.begin(); it != types.end(); ++it ) {
00114 if ( !first )
00115 fc +=",";
00116 first = false;
00117 fc += *it;
00118 }
00119 fc += ')';
00120 f = fc;
00121 }
00122
00123 if ( types.count() != args.count() ) {
00124 qWarning( "arguments do not match" );
00125 exit(1);
00126 }
00127
00128 QByteArray data;
00129 QDataStream arg(data, IO_WriteOnly);
00130
00131 uint i = 0;
00132 for ( QStringList::Iterator it = types.begin(); it != types.end(); ++it ) {
00133 marshall(arg, args, i, *it);
00134 }
00135 if ( (uint) i != args.count() ) {
00136 qWarning( "arguments do not match" );
00137 exit(1);
00138 }
00139
00140 QCString foundApp;
00141 QCString foundObj;
00142 if ( dcop->findObject( app, obj, f.latin1(), data, foundApp, foundObj) )
00143 {
00144 if (bAppIdOnly)
00145 puts(foundApp.data());
00146 else
00147 printf("DCOPRef(%s,%s)\n", qStringToC(foundApp), qStringToC(foundObj));
00148 return true;
00149 }
00150 return false;
00151 }
00152
00153 bool launchApp(QString app)
00154 {
00155 int l = app.length();
00156 if (l && (app[l-1] == '*'))
00157 l--;
00158 if (l && (app[l-1] == '-'))
00159 l--;
00160 if (!l) return false;
00161 app.truncate(l);
00162
00163 QStringList URLs;
00164 QByteArray data, replyData;
00165 QCString replyType;
00166 QDataStream arg(data, IO_WriteOnly);
00167 arg << app << URLs;
00168
00169 if ( !dcop->call( "klauncher", "klauncher", "start_service_by_desktop_name(QString,QStringList)",
00170 data, replyType, replyData) ) {
00171 qWarning( "call to klauncher failed.");
00172 return false;
00173 }
00174 QDataStream reply(replyData, IO_ReadOnly);
00175
00176 if ( replyType != "serviceResult" )
00177 {
00178 qWarning( "unexpected result '%s' from klauncher.", replyType.data());
00179 return false;
00180 }
00181 int result;
00182 QCString dcopName;
00183 QString error;
00184 reply >> result >> dcopName >> error;
00185 if (result != 0)
00186 {
00187 qWarning("Error starting '%s': %s", app.local8Bit().data(), error.local8Bit().data());
00188 return false;
00189 }
00190 return true;
00191 }
00192
00193 void usage()
00194 {
00195 fprintf( stderr, "Usage: dcopfind [-l] [-a] application [object [function [arg1] [arg2] [arg3] ... ] ] ] \n" );
00196 exit(0);
00197 }
00198
00199
00200 int main( int argc, char** argv )
00201 {
00202 int argi = 1;
00203
00204 while ((argi < argc) && (argv[argi][0] == '-'))
00205 {
00206 switch ( argv[argi][1] ) {
00207 case 'l':
00208 bLaunchApp = true;
00209 break;
00210 case 'a':
00211 bAppIdOnly = true;
00212 break;
00213 default:
00214 usage();
00215 }
00216 argi++;
00217 }
00218
00219 if (argc <= argi)
00220 usage();
00221
00222 DCOPClient client;
00223 client.attach();
00224 dcop = &client;
00225
00226 QCString app;
00227 QCString objid;
00228 QCString function;
00229 char **args = 0;
00230 if ((argc > argi) && (strncmp(argv[argi], "DCOPRef(", 8)) == 0)
00231 {
00232 char *delim = strchr(argv[argi], ',');
00233 if (!delim)
00234 {
00235 fprintf(stderr, "Error: '%s' is not a valid DCOP reference.\n", argv[argi]);
00236 return 1;
00237 }
00238 *delim = 0;
00239 app = argv[argi++] + 8;
00240 delim++;
00241 delim[strlen(delim)-1] = 0;
00242 objid = delim;
00243 }
00244 else
00245 {
00246 if (argc > argi)
00247 app = argv[argi++];
00248 if (argc > argi)
00249 objid = argv[argi++];
00250 }
00251 if (argc > argi)
00252 function = argv[argi++];
00253
00254 if (argc > argi)
00255 {
00256 args = &argv[argi];
00257 argc = argc-argi;
00258 }
00259 else
00260 {
00261 argc = 0;
00262 }
00263
00264 QCStringList params;
00265 for( int i = 0; i < argc; i++ )
00266 params.append( args[ i ] );
00267 bool ok = findObject( app, objid, function, params );
00268 if (ok)
00269 return 0;
00270 if (bLaunchApp)
00271 {
00272 ok = launchApp(app);
00273 if (!ok)
00274 return 2;
00275 ok = findObject( app, objid, function, params );
00276 }
00277
00278 return 1;
00279 }