Warning, /sdk/kompare/tests/cvsdiff/rcsm.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 -n -r1.26 dcop.cpp 0006 d23 1 0007 a23 4 0008 #include <ctype.h> 0009 #include <stdio.h> 0010 #include <stdlib.h> 0011 0012 d25 1 0013 a25 12 0014 #include <qdir.h> 0015 #include <qfile.h> 0016 #include <qfileinfo.h> 0017 #include <qmap.h> 0018 #include <qstringlist.h> 0019 #include <qtextstream.h> 0020 #include <qvariant.h> 0021 0022 // putenv() is not available on all platforms, so make sure the emulation 0023 // wrapper is available in those cases by loading config.h! 0024 #include <config.h> 0025 0026 d28 3 0027 a30 1 0028 #include "../kdatastream.h" 0029 a33 2 0030 typedef QMap<QString, QString> UserList; 0031 0032 a35 14 0033 static QTextStream cout( stdout, IO_WriteOnly ); 0034 static QTextStream cerr( stderr, IO_WriteOnly ); 0035 0036 /** 0037 * Session to send call to 0038 * DefaultSession - current session. Current KDE session when called without 0039 * --user or --all-users option. Otherwise this value ignores 0040 * all users with more than one active session. 0041 * AllSessions - Send to all sessions found. requires --user or --all-users. 0042 * QuerySessions - Don't call DCOP, return a list of available sessions. 0043 * CustomSession - Use the specified session 0044 */ 0045 enum Session { DefaultSession = 0, AllSessions, QuerySessions, CustomSession }; 0046 0047 d121 1 0048 a121 1 0049 void callFunction( const char* app, const char* obj, const char* func, const QCStringList args ) 0050 d123 1 0051 d139 1 0052 a139 1 0053 if ( !ok && args.isEmpty() ) 0054 d156 2 0055 a157 2 0056 uint a = (*it).contains(','); 0057 if ( ( a == 0 && args.isEmpty() ) || ( a > 0 && a + 1 == args.count() ) ) 0058 d164 1 0059 a164 2 0060 // exit(1); 0061 return; 0062 d246 5 0063 a250 6 0064 uint i = 0; 0065 for( QStringList::Iterator it = types.begin(); it != types.end(); ++it ) 0066 marshall( arg, args, i, *it ); 0067 0068 if ( i != args.count() ) 0069 { 0070 a268 27 0071 /** 0072 * Show command-line help and exit 0073 */ 0074 void showHelp( int exitCode = 0 ) 0075 { 0076 cout << "Usage: dcop [options] [application [object [function [arg1] [arg2] ... ] ] ]" << endl 0077 << "" << endl 0078 << "Console DCOP client" << endl 0079 << "" << endl 0080 << "Generic options:" << endl 0081 << " --help Show help about options" << endl 0082 << "" << endl 0083 << "Options:" << endl 0084 << " --pipe Call DCOP for each line read from stdin" << endl 0085 << " --user <user> Connect to the given user's DCOP server. This option will" << endl 0086 << " ignore the values of the environment vars $DCOPSERVER and" << endl 0087 << " $ICEAUTHORITY, even if they are set." << endl 0088 << " If the user has more than one open session, you must also" << endl 0089 << " use one of the --list-sessions, --session or --als-sessions" << endl 0090 << " command-line options." << endl 0091 << " --all-users Send the same DCOP call to all users with a running DCOP" << endl 0092 << " server. Only failed calls to existing DCOP servers will" 0093 << " generate an error message. If no DCOP server is available" << endl 0094 << " at all, no error will be generated." << endl; 0095 0096 exit( exitCode ); 0097 } 0098 d270 2 0099 a271 5 0100 /** 0101 * Return a list of all users and their home directories. 0102 * Returns an empty list if /etc/passwd cannot be read for some reason. 0103 */ 0104 static UserList userList() 0105 a272 9 0106 UserList result; 0107 0108 QFile f( "/etc/passwd" ); 0109 0110 if( !f.open( IO_ReadOnly ) ) 0111 { 0112 cerr << "Can't open /etc/passwd for reading!" << endl; 0113 return result; 0114 } 0115 d274 3 0116 a276 6 0117 QStringList l( QStringList::split( '\n', f.readAll() ) ); 0118 0119 for( QStringList::ConstIterator it( l.begin() ); it != l.end(); ++it ) 0120 { 0121 QStringList userInfo( QStringList::split( ':', *it, true ) ); 0122 result[ userInfo[ 0 ] ] = userInfo[ 5 ]; 0123 d279 3 0124 a281 42 0125 return result; 0126 } 0127 0128 /** 0129 * Return a list of available DCOP sessions for the specified user 0130 * An empty list means no sessions are available, or an error occurred. 0131 */ 0132 QStringList dcopSessionList( const QString &user, const QString &home ) 0133 { 0134 if( home.isEmpty() ) 0135 { 0136 cerr << "WARNING: Cannot determine home directory for user " 0137 << user << "!" << endl 0138 << "Please check permissions or set the $DCOPSERVER variable manually before" << endl 0139 << "calling dcop." << endl; 0140 return QStringList(); 0141 } 0142 0143 QStringList result; 0144 QFileInfo dirInfo( home ); 0145 if( !dirInfo.exists() || !dirInfo.isReadable() ) 0146 return result; 0147 0148 QDir d( home ); 0149 d.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks ); 0150 d.setNameFilter( ".DCOPserver*" ); 0151 0152 const QFileInfoList *list = d.entryInfoList(); 0153 if( !list ) 0154 return result; 0155 0156 QFileInfoListIterator it( *list ); 0157 QFileInfo *fi; 0158 0159 while ( ( fi = it.current() ) != 0 ) 0160 { 0161 if( fi->isReadable() ) 0162 result.append( fi->fileName() ); 0163 ++it; 0164 } 0165 return result; 0166 } 0167 a282 6 0168 /** 0169 * Do the actual DCOP call 0170 */ 0171 void runDCOP( QCStringList args, UserList users, Session session, 0172 const QString sessionName, bool readStdin ) 0173 { 0174 d286 2 0175 a287 3 0176 QCStringList params; 0177 DCOPClient *client = 0L; 0178 if ( !args.isEmpty() && args[ 0 ].find( "DCOPRef(" ) == 0 ) 0179 d289 16 0180 a304 24 0181 // WARNING: This part (until the closing '}') could very 0182 // well be broken now. As I don't know how to trigger and test 0183 // dcoprefs this code is *not* tested. It compiles and it looks 0184 // ok to me, but that's all I can say - Martijn (2001/12/24) 0185 int delimPos = args[ 0 ].findRev( ',' ); 0186 if( delimPos == -1 ) 0187 { 0188 cerr << "Error: '" << args[ 0 ] 0189 << "' is not a valid DCOP reference." << endl; 0190 exit( -1 ); 0191 } 0192 args[ 0 ][ delimPos ] = 0; 0193 app = args[ 0 ].mid( 8 ); 0194 delimPos++; 0195 args[ 0 ][ args[ 0 ].length() - 1 ] = 0; 0196 objid = args[ 0 ].mid( delimPos ); 0197 if( args.count() > 1 ) 0198 function = args[ 1 ]; 0199 if( args.count() > 2 ) 0200 { 0201 params = args; 0202 params.remove( params.begin() ); 0203 params.remove( params.begin() ); 0204 } 0205 d308 31 0206 a338 84 0207 if( !args.isEmpty() ) 0208 app = args[ 0 ]; 0209 if( args.count() > 1 ) 0210 objid = args[ 1 ]; 0211 if( args.count() > 2 ) 0212 function = args[ 2 ]; 0213 if( args.count() > 3) 0214 { 0215 params = args; 0216 params.remove( params.begin() ); 0217 params.remove( params.begin() ); 0218 params.remove( params.begin() ); 0219 } 0220 } 0221 0222 bool firstRun = true; 0223 UserList::Iterator it; 0224 QStringList sessions; 0225 bool presetDCOPServer = false; 0226 // char *dcopStr = 0L; 0227 QString dcopServer; 0228 0229 for( it = users.begin(); it != users.end() || firstRun; it++ ) 0230 { 0231 firstRun = false; 0232 0233 //cout << "Iterating '" << it.key() << "'" << endl; 0234 0235 if( session == QuerySessions ) 0236 { 0237 QStringList sessions = dcopSessionList( it.key(), it.data() ); 0238 if( sessions.isEmpty() ) 0239 { 0240 cout << "No active sessions"; 0241 if( !( *it ).isEmpty() ) 0242 cout << " for user " << *it; 0243 cout << endl; 0244 } 0245 else 0246 { 0247 cout << "Active sessions "; 0248 if( !( *it ).isEmpty() ) 0249 cout << "for user " << *it << " "; 0250 cout << ":" << endl; 0251 0252 QStringList::Iterator sIt; 0253 for( sIt = sessions.begin(); sIt != sessions.end(); sIt++ ) 0254 cout << " " << *sIt << endl; 0255 0256 cout << endl; 0257 } 0258 continue; 0259 } 0260 0261 if( getenv( "DCOPSERVER" ) ) 0262 { 0263 sessions.append( getenv( "DCOPSERVER" ) ); 0264 presetDCOPServer = true; 0265 } 0266 0267 if( users.count() > 1 || ( users.count() == 1 && 0268 ( getenv( "DCOPSERVER" ) == 0 /*&& getenv( "DISPLAY" ) == 0*/ ) ) ) 0269 { 0270 sessions = dcopSessionList( it.key(), it.data() ); 0271 if( sessions.isEmpty() ) 0272 { 0273 if( users.count() > 1 ) 0274 continue; 0275 else 0276 { 0277 cerr << "ERROR: No active KDE sessions!" << endl 0278 << "If you are sure there is one, please set the $DCOPSERVER variable manually" << endl 0279 << "before calling dcop." << endl; 0280 exit( -1 ); 0281 } 0282 } 0283 else if( sessions.count() > 1 && session != AllSessions ) 0284 { 0285 cerr << "ERROR: Multiple available KDE sessions!" << endl 0286 << "Please specify the correct session to use with --session or use the" << endl 0287 << "--all-sessions option to broadcast to all sessions." << endl; 0288 exit( -1 ); 0289 } 0290 } 0291 a339 143 0292 if( users.count() > 1 || ( users.count() == 1 && 0293 ( getenv( "ICEAUTHORITY" ) == 0 || getenv( "DISPLAY" ) == 0 ) ) ) 0294 { 0295 // Check for ICE authority file and if the file can be read by us 0296 QString home = it.data(); 0297 QString iceFile = it.data() + "/.ICEauthority"; 0298 QFileInfo fi( iceFile ); 0299 if( iceFile.isEmpty() ) 0300 { 0301 cerr << "WARNING: Cannot determine home directory for user " 0302 << it.key() << "!" << endl 0303 << "Please check permissions or set the $ICEAUTHORITY variable manually before" << endl 0304 << "calling dcop." << endl; 0305 } 0306 else if( fi.exists() ) 0307 { 0308 if( fi.isReadable() ) 0309 { 0310 char *envStr = strdup( ( "ICEAUTHORITY=" + iceFile ).ascii() ); 0311 putenv( envStr ); 0312 //cerr << "ice: " << envStr << endl; 0313 } 0314 else 0315 { 0316 cerr << "WARNING: ICE authority file " << iceFile 0317 << "is not readable by you!" << endl 0318 << "Please check permissions or set the $ICEAUTHORITY variable manually before" << endl 0319 << "calling dcop." << endl; 0320 } 0321 } 0322 else 0323 { 0324 if( users.count() > 1 ) 0325 continue; 0326 else 0327 { 0328 cerr << "WARNING: Cannot find ICE authority file " 0329 << iceFile << "!" << endl 0330 << "Please check permissions or set the $ICEAUTHORITY" 0331 << " variable manually before" << endl 0332 << "calling dcop." << endl; 0333 } 0334 } 0335 } 0336 0337 // Main loop 0338 // If users is an empty list we're calling for the currently logged 0339 // in user. In this case we don't have a session, but still want 0340 // to iterate the loop once. 0341 QStringList::Iterator sIt = sessions.begin(); 0342 for( ; sIt != sessions.end() || users.isEmpty(); sIt++ ) 0343 { 0344 if( !presetDCOPServer && !users.isEmpty() ) 0345 { 0346 QString dcopFile = it.data() + "/" + *sIt; 0347 QFile f( dcopFile ); 0348 if( !f.open( IO_ReadOnly ) ) 0349 { 0350 cerr << "Can't open " << dcopFile << " for reading!" << endl; 0351 exit( -1 ); 0352 } 0353 0354 QStringList l( QStringList::split( '\n', f.readAll() ) ); 0355 dcopServer = l.first(); 0356 0357 if( dcopServer.isEmpty() ) 0358 { 0359 cerr << "WARNING: Unable to determine DCOP server for session " 0360 << *sIt << "!" << endl 0361 << "Please check permissions or set the $DCOPSERVER variable manually before" << endl 0362 << "calling dcop." << endl; 0363 exit( -1 ); 0364 } 0365 } 0366 0367 delete client; 0368 client = new DCOPClient; 0369 if( !dcopServer.isEmpty() ) 0370 client->setServerAddress( dcopServer.ascii() ); 0371 bool success = client->attach(); 0372 if( !success ) 0373 { 0374 cerr << "ERROR: Couldn't attach to DCOP server!" << endl; 0375 continue; 0376 } 0377 dcop = client; 0378 0379 switch ( args.count() ) 0380 { 0381 case 0: 0382 queryApplications(""); 0383 break; 0384 case 1: 0385 if (endsWith(app, '*')) 0386 queryApplications(app); 0387 else 0388 queryObjects( app, "" ); 0389 break; 0390 case 2: 0391 if (endsWith(objid, '*')) 0392 queryObjects(app, objid); 0393 else 0394 queryFunctions( app, objid ); 0395 break; 0396 case 3: 0397 default: 0398 if( readStdin ) 0399 { 0400 QCStringList::Iterator replaceArg = args.end(); 0401 0402 QCStringList::Iterator it; 0403 for( it = args.begin(); it != args.end(); it++ ) 0404 if( *it == "%1" ) 0405 replaceArg = it; 0406 0407 // Read from stdin until EOF and call function for each line read 0408 char *buf = new char[ 1000 ]; 0409 while ( !feof( stdin ) ) 0410 { 0411 fgets( buf, 1000, stdin ); 0412 0413 if( replaceArg != args.end() ) 0414 *replaceArg = buf; 0415 0416 callFunction( app, objid, function, params ); 0417 } 0418 } 0419 else 0420 { 0421 // Just call function 0422 // cout << "call " << app << ", " << objid << ", " << function << ", (params)" << endl; 0423 callFunction( app, objid, function, params ); 0424 } 0425 break; 0426 } 0427 // Another sIt++ would make the loop infinite... 0428 if( users.isEmpty() ) 0429 break; 0430 } 0431 0432 // Another it++ would make the loop infinite... 0433 if( it == users.end() ) 0434 break; 0435 a340 106 0436 } 0437 0438 0439 int main( int argc, char** argv ) 0440 { 0441 bool readStdin = false; 0442 int numOptions = 0; 0443 QString user; 0444 Session session = DefaultSession; 0445 QString sessionName; 0446 0447 // Scan for command-line options first 0448 for( int pos = 1 ; pos <= argc - 1 ; pos++ ) 0449 { 0450 if( strcmp( argv[ pos ], "--help" ) == 0 ) 0451 showHelp( 0 ); 0452 else if( strcmp( argv[ pos ], "--pipe" ) == 0 ) 0453 { 0454 readStdin = true; 0455 numOptions++; 0456 } 0457 else if( strcmp( argv[ pos ], "--user" ) == 0 ) 0458 { 0459 if( pos <= argc - 2 ) 0460 { 0461 user = QString::fromLocal8Bit( argv[ pos + 1] ); 0462 numOptions +=2; 0463 pos++; 0464 } 0465 else 0466 { 0467 cerr << "Missing username for '--user' option!" << endl << endl; 0468 showHelp( -1 ); 0469 } 0470 } 0471 else if( strcmp( argv[ pos ], "--all-users" ) == 0 ) 0472 { 0473 user = "*"; 0474 numOptions ++; 0475 } 0476 else if( strcmp( argv[ pos ], "--list-sessions" ) == 0 ) 0477 { 0478 session = QuerySessions; 0479 numOptions ++; 0480 } 0481 else if( strcmp( argv[ pos ], "--all-sessions" ) == 0 ) 0482 { 0483 session = AllSessions; 0484 numOptions ++; 0485 } 0486 else if( argv[ pos ][ 0 ] == '-' ) 0487 { 0488 cerr << "Unknown command-line option '" << argv[ pos ] 0489 << "'." << endl << endl; 0490 showHelp( -1 ); 0491 } 0492 else 0493 break; // End of options 0494 } 0495 0496 argc -= numOptions; 0497 0498 QCStringList args; 0499 for( int i = numOptions; i < argc + numOptions - 1; i++ ) 0500 args.append( argv[ i + 1 ] ); 0501 0502 if( readStdin && args.count() < 3 ) 0503 { 0504 cerr << "--pipe option only supported for function calls!" << endl << endl; 0505 showHelp( -1 ); 0506 } 0507 0508 if( user == "*" && args.count() < 3 && session != QuerySessions ) 0509 { 0510 cerr << "ERROR: The --all-users option is only supported for function calls!" << endl << endl; 0511 showHelp( -1 ); 0512 } 0513 0514 if( session == QuerySessions && !args.isEmpty() ) 0515 { 0516 cerr << "ERROR: The --list-sessions option cannot be used for actual DCOP calls!" << endl << endl; 0517 showHelp( -1 ); 0518 } 0519 0520 if( session == QuerySessions && user.isEmpty() ) 0521 { 0522 cerr << "ERROR: The --list-sessions option can only be used with the --user or" << endl 0523 << "--all-users options!" << endl << endl; 0524 showHelp( -1 ); 0525 } 0526 0527 if( session != DefaultSession && session != QuerySessions && 0528 args.count() < 3 ) 0529 { 0530 cerr << "ERROR: The --session and --all-sessions options are only supported for function" << endl 0531 << "calls!" << endl << endl; 0532 showHelp( -1 ); 0533 } 0534 0535 UserList users; 0536 if( user == "*" ) 0537 users = userList(); 0538 else if( !user.isEmpty() ) 0539 users[ user ] = userList()[ user ]; 0540 0541 runDCOP( args, users, session, sessionName, readStdin ); 0542 a343 3 0543 0544 // vim: set ts=8 sts=4 sw=4 noet: 0545 0546 Index: client/dcopfind.cpp 0547 =================================================================== 0548 RCS file: /home/kde/kdelibs/dcop/client/dcopfind.cpp,v 0549 retrieving revision 1.2 0550 diff -n -r1.2 dcopfind.cpp 0551 d39 1 0552 a39 1 0553 bool findObject( const char* app, const char* obj, const char* func, QCStringList args ) 0554 d121 1 0555 a121 1 0556 if ( types.count() != args.count() ) { 0557 d131 1 0558 a131 1 0559 marshall(arg, args, i, *it); 0560 d133 1 0561 a133 1 0562 if ( (uint) i != args.count() ) { 0563 d224 1 0564 a224 5 0565 QCStringList params; 0566 for( int i = 0; i < argc; i++ ) 0567 params.append( args[ i ] ); 0568 0569 findObject( app, objid, function, params ); 0570 Index: client/marshall.cpp 0571 =================================================================== 0572 RCS file: /home/kde/kdelibs/dcop/client/marshall.cpp,v 0573 retrieving revision 1.3 0574 diff -n -r1.3 marshall.cpp 0575 d245 1 0576 a245 1 0577 void marshall( QDataStream &arg, QCStringList args, uint &i, QString type ) 0578 d247 71 0579 a317 10 0580 if (type == "QStringList") 0581 type = "QValueList<QString>"; 0582 if (type == "QCStringList") 0583 type = "QValueList<QCString>"; 0584 if( i > args.count() ) 0585 { 0586 qWarning("Not enough arguments."); 0587 exit(1); 0588 } 0589 QString s = QString::fromLocal8Bit( args[ i ] ); 0590 d319 28 0591 a346 57 0592 if ( type == "int" ) 0593 arg << s.toInt(); 0594 else if ( type == "uint" ) 0595 arg << s.toUInt(); 0596 else if ( type == "unsigned" ) 0597 arg << s.toUInt(); 0598 else if ( type == "unsigned int" ) 0599 arg << s.toUInt(); 0600 else if ( type == "long" ) 0601 arg << s.toLong(); 0602 else if ( type == "long int" ) 0603 arg << s.toLong(); 0604 else if ( type == "unsigned long" ) 0605 arg << s.toULong(); 0606 else if ( type == "unsigned long int" ) 0607 arg << s.toULong(); 0608 else if ( type == "float" ) 0609 arg << s.toFloat(); 0610 else if ( type == "double" ) 0611 arg << s.toDouble(); 0612 else if ( type == "bool" ) 0613 arg << mkBool( s ); 0614 else if ( type == "QString" ) 0615 arg << s; 0616 else if ( type == "QCString" ) 0617 arg << QCString( args[ i ] ); 0618 else if ( type == "QColor" ) 0619 arg << mkColor( s ); 0620 else if ( type == "QPoint" ) 0621 arg << mkPoint( s ); 0622 else if ( type == "QSize" ) 0623 arg << mkSize( s ); 0624 else if ( type == "QRect" ) 0625 arg << mkRect( s ); 0626 else if ( type == "QVariant" ) { 0627 if ( s == "true" || s == "false" ) 0628 arg << QVariant( mkBool( s ), 42 ); 0629 else if ( s.left( 4 ) == "int(" ) 0630 arg << QVariant( s.mid(4, s.length()-5).toInt() ); 0631 else if ( s.left( 7 ) == "QPoint(" ) 0632 arg << QVariant( mkPoint( s.mid(7, s.length()-8) ) ); 0633 else if ( s.left( 6 ) == "QSize(" ) 0634 arg << QVariant( mkSize( s.mid(6, s.length()-7) ) ); 0635 else if ( s.left( 6 ) == "QRect(" ) 0636 arg << QVariant( mkRect( s.mid(6, s.length()-7) ) ); 0637 else if ( s.left( 7 ) == "QColor(" ) 0638 arg << QVariant( mkColor( s.mid(7, s.length()-8) ) ); 0639 else 0640 arg << QVariant( s ); 0641 } else if ( type.startsWith("QValueList<")) { 0642 type = type.mid(11, type.length() - 12); 0643 QStringList list; 0644 QString delim = s; 0645 if (delim == "[") 0646 delim = "]"; 0647 if (delim == "(") 0648 delim = ")"; 0649 a347 34 0650 QByteArray dummy_data; 0651 QDataStream dummy_arg(dummy_data, IO_WriteOnly); 0652 0653 uint j = i; 0654 uint count = 0; 0655 // Parse list to get the count 0656 while (true) { 0657 if( j > args.count() ) 0658 { 0659 qWarning("List end-delimiter '%s' not found.", delim.latin1()); 0660 exit(1); 0661 } 0662 if( QString::fromLocal8Bit( args[ j ] ) == delim ) 0663 break; 0664 marshall( dummy_arg, args, j, type ); 0665 count++; 0666 } 0667 arg << (Q_UINT32) count; 0668 // Parse the list for real 0669 while (true) { 0670 if( i > args.count() ) 0671 { 0672 qWarning("List end-delimiter '%s' not found.", delim.latin1()); 0673 exit(1); 0674 } 0675 if( QString::fromLocal8Bit( args[ i ] ) == delim ) 0676 break; 0677 marshall( arg, args, i, type ); 0678 } 0679 } else { 0680 qWarning( "cannot handle datatype '%s'", type.latin1() ); 0681 exit(1); 0682 } 0683 i++;