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