Warning, /sdk/kompare/tests/diff/unifiedm.diff is written in an unsupported language. File is not indexed.
0001 diff -aur dcop/client/dcop.cpp dcop2/client/dcop.cpp
0002 --- dcop/client/dcop.cpp Wed Jan 30 22:38:07 2002
0003 +++ dcop2/client/dcop.cpp Wed Jan 30 22:37:04 2002
0004 @@ -20,19 +20,47 @@
0005
0006 ******************************************************************/
0007
0008 -#include <qvariant.h>
0009 +#include <ctype.h>
0010 +#include <stdio.h>
0011 +#include <stdlib.h>
0012 +
0013 #include <qcolor.h>
0014 -#include "../kdatastream.h"
0015 +#include <qdir.h>
0016 +#include <qfile.h>
0017 +#include <qfileinfo.h>
0018 +#include <qmap.h>
0019 +#include <qstringlist.h>
0020 +#include <qtextstream.h>
0021 +#include <qvariant.h>
0022 +
0023 +// putenv() is not available on all platforms, so make sure the emulation
0024 +// wrapper is available in those cases by loading config.h!
0025 +#include <config.h>
0026 +
0027 #include "../dcopclient.h"
0028 #include "../dcopref.h"
0029 -#include <stdlib.h>
0030 -#include <stdio.h>
0031 -#include <ctype.h>
0032 +#include "../kdatastream.h"
0033
0034 #include "marshall.cpp"
0035
0036 +typedef QMap<QString, QString> UserList;
0037 +
0038 static DCOPClient* dcop = 0;
0039
0040 +static QTextStream cout( stdout, IO_WriteOnly );
0041 +static QTextStream cerr( stderr, IO_WriteOnly );
0042 +
0043 +/**
0044 + * Session to send call to
0045 + * DefaultSession - current session. Current KDE session when called without
0046 + * --user or --all-users option. Otherwise this value ignores
0047 + * all users with more than one active session.
0048 + * AllSessions - Send to all sessions found. requires --user or --all-users.
0049 + * QuerySessions - Don't call DCOP, return a list of available sessions.
0050 + * CustomSession - Use the specified session
0051 + */
0052 +enum Session { DefaultSession = 0, AllSessions, QuerySessions, CustomSession };
0053 +
0054 bool startsWith(const QCString &id, const char *str, int n)
0055 {
0056 return !n || (strncmp(id.data(), str, n) == 0);
0057 @@ -118,9 +146,8 @@
0058 }
0059 }
0060
0061 -void callFunction( const char* app, const char* obj, const char* func, int argc, char** args )
0062 +void callFunction( const char* app, const char* obj, const char* func, const QCStringList args )
0063 {
0064 -
0065 QString f = func; // Qt is better with unicode strings, so use one.
0066 int left = f.find( '(' );
0067 int right = f.find( ')' );
0068 @@ -136,7 +163,7 @@
0069 bool ok = false;
0070 QCStringList funcs = dcop->remoteFunctions( app, obj, &ok );
0071 QCString realfunc;
0072 - if ( !ok && argc == 0 )
0073 + if ( !ok && args.isEmpty() )
0074 goto doit;
0075 if ( !ok )
0076 {
0077 @@ -153,15 +180,16 @@
0078
0079 if ( l > 0 && (*it).mid( s, l - s ) == func ) {
0080 realfunc = (*it).mid( s );
0081 - int a = (*it).contains(',');
0082 - if ( ( a == 0 && argc == 0) || ( a > 0 && a + 1 == argc ) )
0083 + uint a = (*it).contains(',');
0084 + if ( ( a == 0 && args.isEmpty() ) || ( a > 0 && a + 1 == args.count() ) )
0085 break;
0086 }
0087 }
0088 if ( realfunc.isEmpty() )
0089 {
0090 qWarning("no such function");
0091 - exit(1);
0092 +// exit(1);
0093 + return;
0094 }
0095 f = realfunc;
0096 left = f.find( '(' );
0097 @@ -243,11 +271,12 @@
0098 QCString replyType;
0099 QDataStream arg(data, IO_WriteOnly);
0100
0101 - int i = 0;
0102 - for ( QStringList::Iterator it = types.begin(); it != types.end(); ++it ) {
0103 - marshall(arg, argc, args, i, *it);
0104 - }
0105 - if ( i != argc ) {
0106 + uint i = 0;
0107 + for( QStringList::Iterator it = types.begin(); it != types.end(); ++it )
0108 + marshall( arg, args, i, *it );
0109 +
0110 + if ( i != args.count() )
0111 + {
0112 qWarning( "arguments do not match" );
0113 exit(1);
0114 }
0115 @@ -266,78 +295,479 @@
0116 }
0117 }
0118
0119 +/**
0120 + * Show command-line help and exit
0121 + */
0122 +void showHelp( int exitCode = 0 )
0123 +{
0124 + cout << "Usage: dcop [options] [application [object [function [arg1] [arg2] ... ] ] ]" << endl
0125 + << "" << endl
0126 + << "Console DCOP client" << endl
0127 + << "" << endl
0128 + << "Generic options:" << endl
0129 + << " --help Show help about options" << endl
0130 + << "" << endl
0131 + << "Options:" << endl
0132 + << " --pipe Call DCOP for each line read from stdin" << endl
0133 + << " --user <user> Connect to the given user's DCOP server. This option will" << endl
0134 + << " ignore the values of the environment vars $DCOPSERVER and" << endl
0135 + << " $ICEAUTHORITY, even if they are set." << endl
0136 + << " If the user has more than one open session, you must also" << endl
0137 + << " use one of the --list-sessions, --session or --als-sessions" << endl
0138 + << " command-line options." << endl
0139 + << " --all-users Send the same DCOP call to all users with a running DCOP" << endl
0140 + << " server. Only failed calls to existing DCOP servers will"
0141 + << " generate an error message. If no DCOP server is available" << endl
0142 + << " at all, no error will be generated." << endl;
0143 +
0144 + exit( exitCode );
0145 +}
0146
0147 -
0148 -int main( int argc, char** argv )
0149 +/**
0150 + * Return a list of all users and their home directories.
0151 + * Returns an empty list if /etc/passwd cannot be read for some reason.
0152 + */
0153 +static UserList userList()
0154 {
0155 + UserList result;
0156 +
0157 + QFile f( "/etc/passwd" );
0158 +
0159 + if( !f.open( IO_ReadOnly ) )
0160 + {
0161 + cerr << "Can't open /etc/passwd for reading!" << endl;
0162 + return result;
0163 + }
0164
0165 - if ( argc > 1 && argv[1][0] == '-' ) {
0166 - fprintf( stderr, "Usage: dcop [ application [object [function [arg1] [arg2] [arg3] ... ] ] ] \n" );
0167 - exit(0);
0168 + QStringList l( QStringList::split( '\n', f.readAll() ) );
0169 +
0170 + for( QStringList::ConstIterator it( l.begin() ); it != l.end(); ++it )
0171 + {
0172 + QStringList userInfo( QStringList::split( ':', *it, true ) );
0173 + result[ userInfo[ 0 ] ] = userInfo[ 5 ];
0174 }
0175
0176 - DCOPClient client;
0177 - client.attach();
0178 - dcop = &client;
0179 + return result;
0180 +}
0181 +
0182 +/**
0183 + * Return a list of available DCOP sessions for the specified user
0184 + * An empty list means no sessions are available, or an error occurred.
0185 + */
0186 +QStringList dcopSessionList( const QString &user, const QString &home )
0187 +{
0188 + if( home.isEmpty() )
0189 + {
0190 + cerr << "WARNING: Cannot determine home directory for user "
0191 + << user << "!" << endl
0192 + << "Please check permissions or set the $DCOPSERVER variable manually before" << endl
0193 + << "calling dcop." << endl;
0194 + return QStringList();
0195 + }
0196 +
0197 + QStringList result;
0198 + QFileInfo dirInfo( home );
0199 + if( !dirInfo.exists() || !dirInfo.isReadable() )
0200 + return result;
0201 +
0202 + QDir d( home );
0203 + d.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks );
0204 + d.setNameFilter( ".DCOPserver*" );
0205 +
0206 + const QFileInfoList *list = d.entryInfoList();
0207 + if( !list )
0208 + return result;
0209 +
0210 + QFileInfoListIterator it( *list );
0211 + QFileInfo *fi;
0212 +
0213 + while ( ( fi = it.current() ) != 0 )
0214 + {
0215 + if( fi->isReadable() )
0216 + result.append( fi->fileName() );
0217 + ++it;
0218 + }
0219 + return result;
0220 +}
0221
0222 +/**
0223 + * Do the actual DCOP call
0224 + */
0225 +void runDCOP( QCStringList args, UserList users, Session session,
0226 + const QString sessionName, bool readStdin )
0227 +{
0228 QCString app;
0229 QCString objid;
0230 QCString function;
0231 - char **args = 0;
0232 - if ((argc > 1) && (strncmp(argv[1], "DCOPRef(", 8)) == 0)
0233 + QCStringList params;
0234 + DCOPClient *client = 0L;
0235 + if ( !args.isEmpty() && args[ 0 ].find( "DCOPRef(" ) == 0 )
0236 {
0237 - char *delim = strchr(argv[1], ',');
0238 - if (!delim)
0239 - {
0240 - fprintf(stderr, "Error: '%s' is not a valid DCOP reference.\n", argv[1]);
0241 - return 1;
0242 - }
0243 - *delim = 0;
0244 - app = argv[1] + 8;
0245 - delim++;
0246 - delim[strlen(delim)-1] = 0;
0247 - objid = delim;
0248 - if (argc > 2)
0249 - function = argv[2];
0250 - if (argc > 3)
0251 - args = &argv[3];
0252 - argc++;
0253 + // WARNING: This part (until the closing '}') could very
0254 + // well be broken now. As I don't know how to trigger and test
0255 + // dcoprefs this code is *not* tested. It compiles and it looks
0256 + // ok to me, but that's all I can say - Martijn (2001/12/24)
0257 + int delimPos = args[ 0 ].findRev( ',' );
0258 + if( delimPos == -1 )
0259 + {
0260 + cerr << "Error: '" << args[ 0 ]
0261 + << "' is not a valid DCOP reference." << endl;
0262 + exit( -1 );
0263 + }
0264 + args[ 0 ][ delimPos ] = 0;
0265 + app = args[ 0 ].mid( 8 );
0266 + delimPos++;
0267 + args[ 0 ][ args[ 0 ].length() - 1 ] = 0;
0268 + objid = args[ 0 ].mid( delimPos );
0269 + if( args.count() > 1 )
0270 + function = args[ 1 ];
0271 + if( args.count() > 2 )
0272 + {
0273 + params = args;
0274 + params.remove( params.begin() );
0275 + params.remove( params.begin() );
0276 + }
0277 }
0278 else
0279 {
0280 - if (argc > 1)
0281 - app = argv[1];
0282 - if (argc > 2)
0283 - objid = argv[2];
0284 - if (argc > 3)
0285 - function = argv[3];
0286 - if (argc > 4)
0287 - args = &argv[4];
0288 - }
0289 -
0290 - switch ( argc ) {
0291 - case 0:
0292 - case 1:
0293 - queryApplications("");
0294 - break;
0295 - case 2:
0296 - if (endsWith(app, '*'))
0297 - queryApplications(app);
0298 - else
0299 - queryObjects( app, "" );
0300 - break;
0301 - case 3:
0302 - if (endsWith(objid, '*'))
0303 - queryObjects(app, objid);
0304 - else
0305 - queryFunctions( app, objid );
0306 - break;
0307 - case 4:
0308 - default:
0309 - callFunction( app, objid, function, argc - 4, args );
0310 - break;
0311 + if( !args.isEmpty() )
0312 + app = args[ 0 ];
0313 + if( args.count() > 1 )
0314 + objid = args[ 1 ];
0315 + if( args.count() > 2 )
0316 + function = args[ 2 ];
0317 + if( args.count() > 3)
0318 + {
0319 + params = args;
0320 + params.remove( params.begin() );
0321 + params.remove( params.begin() );
0322 + params.remove( params.begin() );
0323 + }
0324 + }
0325 +
0326 + bool firstRun = true;
0327 + UserList::Iterator it;
0328 + QStringList sessions;
0329 + bool presetDCOPServer = false;
0330 +// char *dcopStr = 0L;
0331 + QString dcopServer;
0332 +
0333 + for( it = users.begin(); it != users.end() || firstRun; it++ )
0334 + {
0335 + firstRun = false;
0336 +
0337 + //cout << "Iterating '" << it.key() << "'" << endl;
0338 +
0339 + if( session == QuerySessions )
0340 + {
0341 + QStringList sessions = dcopSessionList( it.key(), it.data() );
0342 + if( sessions.isEmpty() )
0343 + {
0344 + cout << "No active sessions";
0345 + if( !( *it ).isEmpty() )
0346 + cout << " for user " << *it;
0347 + cout << endl;
0348 + }
0349 + else
0350 + {
0351 + cout << "Active sessions ";
0352 + if( !( *it ).isEmpty() )
0353 + cout << "for user " << *it << " ";
0354 + cout << ":" << endl;
0355 +
0356 + QStringList::Iterator sIt;
0357 + for( sIt = sessions.begin(); sIt != sessions.end(); sIt++ )
0358 + cout << " " << *sIt << endl;
0359 +
0360 + cout << endl;
0361 + }
0362 + continue;
0363 + }
0364 +
0365 + if( getenv( "DCOPSERVER" ) )
0366 + {
0367 + sessions.append( getenv( "DCOPSERVER" ) );
0368 + presetDCOPServer = true;
0369 + }
0370 +
0371 + if( users.count() > 1 || ( users.count() == 1 &&
0372 + ( getenv( "DCOPSERVER" ) == 0 /*&& getenv( "DISPLAY" ) == 0*/ ) ) )
0373 + {
0374 + sessions = dcopSessionList( it.key(), it.data() );
0375 + if( sessions.isEmpty() )
0376 + {
0377 + if( users.count() > 1 )
0378 + continue;
0379 + else
0380 + {
0381 + cerr << "ERROR: No active KDE sessions!" << endl
0382 + << "If you are sure there is one, please set the $DCOPSERVER variable manually" << endl
0383 + << "before calling dcop." << endl;
0384 + exit( -1 );
0385 + }
0386 + }
0387 + else if( sessions.count() > 1 && session != AllSessions )
0388 + {
0389 + cerr << "ERROR: Multiple available KDE sessions!" << endl
0390 + << "Please specify the correct session to use with --session or use the" << endl
0391 + << "--all-sessions option to broadcast to all sessions." << endl;
0392 + exit( -1 );
0393 + }
0394 + }
0395
0396 + if( users.count() > 1 || ( users.count() == 1 &&
0397 + ( getenv( "ICEAUTHORITY" ) == 0 || getenv( "DISPLAY" ) == 0 ) ) )
0398 + {
0399 + // Check for ICE authority file and if the file can be read by us
0400 + QString home = it.data();
0401 + QString iceFile = it.data() + "/.ICEauthority";
0402 + QFileInfo fi( iceFile );
0403 + if( iceFile.isEmpty() )
0404 + {
0405 + cerr << "WARNING: Cannot determine home directory for user "
0406 + << it.key() << "!" << endl
0407 + << "Please check permissions or set the $ICEAUTHORITY variable manually before" << endl
0408 + << "calling dcop." << endl;
0409 + }
0410 + else if( fi.exists() )
0411 + {
0412 + if( fi.isReadable() )
0413 + {
0414 + char *envStr = strdup( ( "ICEAUTHORITY=" + iceFile ).ascii() );
0415 + putenv( envStr );
0416 + //cerr << "ice: " << envStr << endl;
0417 + }
0418 + else
0419 + {
0420 + cerr << "WARNING: ICE authority file " << iceFile
0421 + << "is not readable by you!" << endl
0422 + << "Please check permissions or set the $ICEAUTHORITY variable manually before" << endl
0423 + << "calling dcop." << endl;
0424 + }
0425 + }
0426 + else
0427 + {
0428 + if( users.count() > 1 )
0429 + continue;
0430 + else
0431 + {
0432 + cerr << "WARNING: Cannot find ICE authority file "
0433 + << iceFile << "!" << endl
0434 + << "Please check permissions or set the $ICEAUTHORITY"
0435 + << " variable manually before" << endl
0436 + << "calling dcop." << endl;
0437 + }
0438 + }
0439 + }
0440 +
0441 + // Main loop
0442 + // If users is an empty list we're calling for the currently logged
0443 + // in user. In this case we don't have a session, but still want
0444 + // to iterate the loop once.
0445 + QStringList::Iterator sIt = sessions.begin();
0446 + for( ; sIt != sessions.end() || users.isEmpty(); sIt++ )
0447 + {
0448 + if( !presetDCOPServer && !users.isEmpty() )
0449 + {
0450 + QString dcopFile = it.data() + "/" + *sIt;
0451 + QFile f( dcopFile );
0452 + if( !f.open( IO_ReadOnly ) )
0453 + {
0454 + cerr << "Can't open " << dcopFile << " for reading!" << endl;
0455 + exit( -1 );
0456 + }
0457 +
0458 + QStringList l( QStringList::split( '\n', f.readAll() ) );
0459 + dcopServer = l.first();
0460 +
0461 + if( dcopServer.isEmpty() )
0462 + {
0463 + cerr << "WARNING: Unable to determine DCOP server for session "
0464 + << *sIt << "!" << endl
0465 + << "Please check permissions or set the $DCOPSERVER variable manually before" << endl
0466 + << "calling dcop." << endl;
0467 + exit( -1 );
0468 + }
0469 + }
0470 +
0471 + delete client;
0472 + client = new DCOPClient;
0473 + if( !dcopServer.isEmpty() )
0474 + client->setServerAddress( dcopServer.ascii() );
0475 + bool success = client->attach();
0476 + if( !success )
0477 + {
0478 + cerr << "ERROR: Couldn't attach to DCOP server!" << endl;
0479 + continue;
0480 + }
0481 + dcop = client;
0482 +
0483 + switch ( args.count() )
0484 + {
0485 + case 0:
0486 + queryApplications("");
0487 + break;
0488 + case 1:
0489 + if (endsWith(app, '*'))
0490 + queryApplications(app);
0491 + else
0492 + queryObjects( app, "" );
0493 + break;
0494 + case 2:
0495 + if (endsWith(objid, '*'))
0496 + queryObjects(app, objid);
0497 + else
0498 + queryFunctions( app, objid );
0499 + break;
0500 + case 3:
0501 + default:
0502 + if( readStdin )
0503 + {
0504 + QCStringList::Iterator replaceArg = args.end();
0505 +
0506 + QCStringList::Iterator it;
0507 + for( it = args.begin(); it != args.end(); it++ )
0508 + if( *it == "%1" )
0509 + replaceArg = it;
0510 +
0511 + // Read from stdin until EOF and call function for each line read
0512 + char *buf = new char[ 1000 ];
0513 + while ( !feof( stdin ) )
0514 + {
0515 + fgets( buf, 1000, stdin );
0516 +
0517 + if( replaceArg != args.end() )
0518 + *replaceArg = buf;
0519 +
0520 + callFunction( app, objid, function, params );
0521 + }
0522 + }
0523 + else
0524 + {
0525 + // Just call function
0526 +// cout << "call " << app << ", " << objid << ", " << function << ", (params)" << endl;
0527 + callFunction( app, objid, function, params );
0528 + }
0529 + break;
0530 + }
0531 + // Another sIt++ would make the loop infinite...
0532 + if( users.isEmpty() )
0533 + break;
0534 + }
0535 +
0536 + // Another it++ would make the loop infinite...
0537 + if( it == users.end() )
0538 + break;
0539 }
0540 +}
0541 +
0542 +
0543 +int main( int argc, char** argv )
0544 +{
0545 + bool readStdin = false;
0546 + int numOptions = 0;
0547 + QString user;
0548 + Session session = DefaultSession;
0549 + QString sessionName;
0550 +
0551 + // Scan for command-line options first
0552 + for( int pos = 1 ; pos <= argc - 1 ; pos++ )
0553 + {
0554 + if( strcmp( argv[ pos ], "--help" ) == 0 )
0555 + showHelp( 0 );
0556 + else if( strcmp( argv[ pos ], "--pipe" ) == 0 )
0557 + {
0558 + readStdin = true;
0559 + numOptions++;
0560 + }
0561 + else if( strcmp( argv[ pos ], "--user" ) == 0 )
0562 + {
0563 + if( pos <= argc - 2 )
0564 + {
0565 + user = QString::fromLocal8Bit( argv[ pos + 1] );
0566 + numOptions +=2;
0567 + pos++;
0568 + }
0569 + else
0570 + {
0571 + cerr << "Missing username for '--user' option!" << endl << endl;
0572 + showHelp( -1 );
0573 + }
0574 + }
0575 + else if( strcmp( argv[ pos ], "--all-users" ) == 0 )
0576 + {
0577 + user = "*";
0578 + numOptions ++;
0579 + }
0580 + else if( strcmp( argv[ pos ], "--list-sessions" ) == 0 )
0581 + {
0582 + session = QuerySessions;
0583 + numOptions ++;
0584 + }
0585 + else if( strcmp( argv[ pos ], "--all-sessions" ) == 0 )
0586 + {
0587 + session = AllSessions;
0588 + numOptions ++;
0589 + }
0590 + else if( argv[ pos ][ 0 ] == '-' )
0591 + {
0592 + cerr << "Unknown command-line option '" << argv[ pos ]
0593 + << "'." << endl << endl;
0594 + showHelp( -1 );
0595 + }
0596 + else
0597 + break; // End of options
0598 + }
0599 +
0600 + argc -= numOptions;
0601 +
0602 + QCStringList args;
0603 + for( int i = numOptions; i < argc + numOptions - 1; i++ )
0604 + args.append( argv[ i + 1 ] );
0605 +
0606 + if( readStdin && args.count() < 3 )
0607 + {
0608 + cerr << "--pipe option only supported for function calls!" << endl << endl;
0609 + showHelp( -1 );
0610 + }
0611 +
0612 + if( user == "*" && args.count() < 3 && session != QuerySessions )
0613 + {
0614 + cerr << "ERROR: The --all-users option is only supported for function calls!" << endl << endl;
0615 + showHelp( -1 );
0616 + }
0617 +
0618 + if( session == QuerySessions && !args.isEmpty() )
0619 + {
0620 + cerr << "ERROR: The --list-sessions option cannot be used for actual DCOP calls!" << endl << endl;
0621 + showHelp( -1 );
0622 + }
0623 +
0624 + if( session == QuerySessions && user.isEmpty() )
0625 + {
0626 + cerr << "ERROR: The --list-sessions option can only be used with the --user or" << endl
0627 + << "--all-users options!" << endl << endl;
0628 + showHelp( -1 );
0629 + }
0630 +
0631 + if( session != DefaultSession && session != QuerySessions &&
0632 + args.count() < 3 )
0633 + {
0634 + cerr << "ERROR: The --session and --all-sessions options are only supported for function" << endl
0635 + << "calls!" << endl << endl;
0636 + showHelp( -1 );
0637 + }
0638 +
0639 + UserList users;
0640 + if( user == "*" )
0641 + users = userList();
0642 + else if( !user.isEmpty() )
0643 + users[ user ] = userList()[ user ];
0644 +
0645 + runDCOP( args, users, session, sessionName, readStdin );
0646
0647 return 0;
0648 }
0649 +
0650 +// vim: set ts=8 sts=4 sw=4 noet:
0651 +
0652 diff -aur dcop/client/dcopfind.cpp dcop2/client/dcopfind.cpp
0653 --- dcop/client/dcopfind.cpp Wed Jan 30 22:38:07 2002
0654 +++ dcop2/client/dcopfind.cpp Wed Jan 30 22:37:04 2002
0655 @@ -36,7 +36,7 @@
0656 static bool bAppIdOnly = 0;
0657 static bool bLaunchApp = 0;
0658
0659 -bool findObject( const char* app, const char* obj, const char* func, int argc, char** args )
0660 +bool findObject( const char* app, const char* obj, const char* func, QCStringList args )
0661 {
0662 QString f = func; // Qt is better with unicode strings, so use one.
0663 int left = f.find( '(' );
0664 @@ -118,7 +118,7 @@
0665 f = fc;
0666 }
0667
0668 - if ( (int) types.count() != argc ) {
0669 + if ( types.count() != args.count() ) {
0670 qWarning( "arguments do not match" );
0671 exit(1);
0672 }
0673 @@ -128,9 +128,9 @@
0674
0675 int i = 0;
0676 for ( QStringList::Iterator it = types.begin(); it != types.end(); ++it ) {
0677 - marshall(arg, argc, args, i, *it);
0678 + marshall(arg, args, i, *it);
0679 }
0680 - if ( (int) i != argc ) {
0681 + if ( (uint) i != args.count() ) {
0682 qWarning( "arguments do not match" );
0683 exit(1);
0684 }
0685 @@ -221,7 +221,11 @@
0686 argc = 0;
0687 }
0688
0689 - findObject( app, objid, function, argc, args );
0690 + QCStringList params;
0691 + for( int i = 0; i < argc; i++ )
0692 + params.append( args[ i ] );
0693 +
0694 + findObject( app, objid, function, params );
0695
0696 return 0;
0697 }
0698 diff -aur dcop/client/marshall.cpp dcop2/client/marshall.cpp
0699 --- dcop/client/marshall.cpp Wed Jan 30 22:38:07 2002
0700 +++ dcop2/client/marshall.cpp Wed Jan 30 22:37:04 2002
0701 @@ -242,108 +242,110 @@
0702
0703 }
0704
0705 -void marshall(QDataStream &arg, int argc, char **argv, int &i, QString type)
0706 +void marshall( QDataStream &arg, QCStringList args, uint &i, QString type )
0707 {
0708 - if (type == "QStringList")
0709 - type = "QValueList<QString>";
0710 - if (type == "QCStringList")
0711 - type = "QValueList<QCString>";
0712 - if (i >= argc)
0713 - {
0714 - qWarning("Not enough arguments.");
0715 - exit(1);
0716 - }
0717 - QString s = QString::fromLocal8Bit(argv[i]);
0718 -
0719 - if ( type == "int" )
0720 - arg << s.toInt();
0721 - else if ( type == "uint" )
0722 - arg << s.toUInt();
0723 - else if ( type == "unsigned" )
0724 - arg << s.toUInt();
0725 - else if ( type == "unsigned int" )
0726 - arg << s.toUInt();
0727 - else if ( type == "long" )
0728 - arg << s.toLong();
0729 - else if ( type == "long int" )
0730 - arg << s.toLong();
0731 - else if ( type == "unsigned long" )
0732 - arg << s.toULong();
0733 - else if ( type == "unsigned long int" )
0734 - arg << s.toULong();
0735 - else if ( type == "float" )
0736 - arg << s.toFloat();
0737 - else if ( type == "double" )
0738 - arg << s.toDouble();
0739 - else if ( type == "bool" )
0740 - arg << mkBool( s );
0741 - else if ( type == "QString" )
0742 - arg << s;
0743 - else if ( type == "QCString" )
0744 - arg << QCString( argv[i] );
0745 - else if ( type == "QColor" )
0746 - arg << mkColor( s );
0747 - else if ( type == "QPoint" )
0748 - arg << mkPoint( s );
0749 - else if ( type == "QSize" )
0750 - arg << mkSize( s );
0751 - else if ( type == "QRect" )
0752 - arg << mkRect( s );
0753 - else if ( type == "QVariant" ) {
0754 - if ( s == "true" || s == "false" )
0755 - arg << QVariant( mkBool( s ), 42 );
0756 - else if ( s.left( 4 ) == "int(" )
0757 - arg << QVariant( s.mid(4, s.length()-5).toInt() );
0758 - else if ( s.left( 7 ) == "QPoint(" )
0759 - arg << QVariant( mkPoint( s.mid(7, s.length()-8) ) );
0760 - else if ( s.left( 6 ) == "QSize(" )
0761 - arg << QVariant( mkSize( s.mid(6, s.length()-7) ) );
0762 - else if ( s.left( 6 ) == "QRect(" )
0763 - arg << QVariant( mkRect( s.mid(6, s.length()-7) ) );
0764 - else if ( s.left( 7 ) == "QColor(" )
0765 - arg << QVariant( mkColor( s.mid(7, s.length()-8) ) );
0766 - else
0767 - arg << QVariant( s );
0768 - } else if ( type.startsWith("QValueList<")) {
0769 - type = type.mid(11, type.length() - 12);
0770 - QStringList list;
0771 - QString delim = s;
0772 - if (delim == "[")
0773 - delim = "]";
0774 - if (delim == "(")
0775 - delim = ")";
0776 - i++;
0777 - QByteArray dummy_data;
0778 - QDataStream dummy_arg(dummy_data, IO_WriteOnly);
0779 + if (type == "QStringList")
0780 + type = "QValueList<QString>";
0781 + if (type == "QCStringList")
0782 + type = "QValueList<QCString>";
0783 + if( i > args.count() )
0784 + {
0785 + qWarning("Not enough arguments.");
0786 + exit(1);
0787 + }
0788 + QString s = QString::fromLocal8Bit( args[ i ] );
0789
0790 - int j = i;
0791 - int count = 0;
0792 - // Parse list to get the count
0793 - while (true) {
0794 - if (j >= argc)
0795 - {
0796 - qWarning("List end-delimiter '%s' not found.", delim.latin1());
0797 - exit(1);
0798 - }
0799 - if (argv[j] == delim) break;
0800 - marshall(dummy_arg, argc, argv, j, type);
0801 - count++;
0802 - }
0803 - arg << (Q_UINT32) count;
0804 - // Parse the list for real
0805 - while (true) {
0806 - if (i >= argc)
0807 - {
0808 - qWarning("List end-delimiter '%s' not found.", delim.latin1());
0809 - exit(1);
0810 - }
0811 - if (argv[i] == delim) break;
0812 - marshall(arg, argc, argv, i, type);
0813 - }
0814 - } else {
0815 - qWarning( "cannot handle datatype '%s'", type.latin1() );
0816 - exit(1);
0817 - }
0818 + if ( type == "int" )
0819 + arg << s.toInt();
0820 + else if ( type == "uint" )
0821 + arg << s.toUInt();
0822 + else if ( type == "unsigned" )
0823 + arg << s.toUInt();
0824 + else if ( type == "unsigned int" )
0825 + arg << s.toUInt();
0826 + else if ( type == "long" )
0827 + arg << s.toLong();
0828 + else if ( type == "long int" )
0829 + arg << s.toLong();
0830 + else if ( type == "unsigned long" )
0831 + arg << s.toULong();
0832 + else if ( type == "unsigned long int" )
0833 + arg << s.toULong();
0834 + else if ( type == "float" )
0835 + arg << s.toFloat();
0836 + else if ( type == "double" )
0837 + arg << s.toDouble();
0838 + else if ( type == "bool" )
0839 + arg << mkBool( s );
0840 + else if ( type == "QString" )
0841 + arg << s;
0842 + else if ( type == "QCString" )
0843 + arg << QCString( args[ i ] );
0844 + else if ( type == "QColor" )
0845 + arg << mkColor( s );
0846 + else if ( type == "QPoint" )
0847 + arg << mkPoint( s );
0848 + else if ( type == "QSize" )
0849 + arg << mkSize( s );
0850 + else if ( type == "QRect" )
0851 + arg << mkRect( s );
0852 + else if ( type == "QVariant" ) {
0853 + if ( s == "true" || s == "false" )
0854 + arg << QVariant( mkBool( s ), 42 );
0855 + else if ( s.left( 4 ) == "int(" )
0856 + arg << QVariant( s.mid(4, s.length()-5).toInt() );
0857 + else if ( s.left( 7 ) == "QPoint(" )
0858 + arg << QVariant( mkPoint( s.mid(7, s.length()-8) ) );
0859 + else if ( s.left( 6 ) == "QSize(" )
0860 + arg << QVariant( mkSize( s.mid(6, s.length()-7) ) );
0861 + else if ( s.left( 6 ) == "QRect(" )
0862 + arg << QVariant( mkRect( s.mid(6, s.length()-7) ) );
0863 + else if ( s.left( 7 ) == "QColor(" )
0864 + arg << QVariant( mkColor( s.mid(7, s.length()-8) ) );
0865 + else
0866 + arg << QVariant( s );
0867 + } else if ( type.startsWith("QValueList<")) {
0868 + type = type.mid(11, type.length() - 12);
0869 + QStringList list;
0870 + QString delim = s;
0871 + if (delim == "[")
0872 + delim = "]";
0873 + if (delim == "(")
0874 + delim = ")";
0875 i++;
0876 + QByteArray dummy_data;
0877 + QDataStream dummy_arg(dummy_data, IO_WriteOnly);
0878 +
0879 + uint j = i;
0880 + uint count = 0;
0881 + // Parse list to get the count
0882 + while (true) {
0883 + if( j > args.count() )
0884 + {
0885 + qWarning("List end-delimiter '%s' not found.", delim.latin1());
0886 + exit(1);
0887 + }
0888 + if( QString::fromLocal8Bit( args[ j ] ) == delim )
0889 + break;
0890 + marshall( dummy_arg, args, j, type );
0891 + count++;
0892 + }
0893 + arg << (Q_UINT32) count;
0894 + // Parse the list for real
0895 + while (true) {
0896 + if( i > args.count() )
0897 + {
0898 + qWarning("List end-delimiter '%s' not found.", delim.latin1());
0899 + exit(1);
0900 + }
0901 + if( QString::fromLocal8Bit( args[ i ] ) == delim )
0902 + break;
0903 + marshall( arg, args, i, type );
0904 + }
0905 + } else {
0906 + qWarning( "cannot handle datatype '%s'", type.latin1() );
0907 + exit(1);
0908 + }
0909 + i++;
0910 }
0911