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