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