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