⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qcopimpl.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "qcopimpl.h"#include <qtopia/timeconversion.h>void doqcopusage(){    fprintf( stderr, "Usage: qcop [-l username] channel command [parameters] [-w channel command [timeout]]\n" );}void doqcopsyntax( const QString &where, const QString &what ){    fprintf( stderr, "Syntax error in %s: %s\n", where.latin1(), what.latin1() );    exit(1);}void disableqdebug( QtMsgType type, const char *msg ){    // Ignore messages that are sent via qDebug.   Q_UNUSED( type );   Q_UNUSED( msg );}int doqcopimpl (int argc, char *argv[]){    qInstallMsgHandler( disableqdebug );    if ( argc > 1 ) {	QString opt = argv[1];	if ( opt == "-l" ) {	    if ( argc < 5 ) {		doqcopusage();		exit(1);	    }#ifndef Q_OS_WIN32	    const char *username = argv[2];	    struct passwd *pwd = getpwnam( username );	    if ( !pwd ) {		fprintf( stderr, "Unknown user %s\n", username );		exit(1);	    }	    int uid =  pwd->pw_uid;	    int gid =  pwd->pw_gid;	    if ( initgroups( username, gid ) != 0 ) {		fprintf( stderr, "Could not chg group for user:%s\n", username );		exit(1);	    }	    if ( setuid( uid ) != 0 ) {		fprintf( stderr, "Could not run as user %s\n", username );		exit(1);	    }	    setenv( "LOGNAME", username, 1 );#else	    setenv("LOGNAME", argv[2], 1);#endif	    	    argc -= 2;	    for ( int i = 1; i < argc; i++ ) {		argv[i] = argv[i+2];	    }	}		          }    if ( argc < 3 ) {	doqcopusage();	exit(1);    }    QApplication app( argc, argv );        QString channel = argv[1];    QString command = argv[2];    command.stripWhiteSpace();    int paren = command.find( "(" );    if ( paren <= 0 )	doqcopsyntax( "command", command );    QString params = command.mid( paren + 1 );    if ( params[(int)params.length()-1] != ')' )	doqcopsyntax( "command", command );    params.truncate( params.length()-1 );#ifndef QT_NO_COP    int argIdx = 3;    {	QCopEnvelope env(channel.latin1(), command.latin1());	QStringList paramList = QStringList::split( ",", params );	QStringList::Iterator it;	for ( it = paramList.begin(); it != paramList.end(); ++it ) {	    QString arg = argv[argIdx];	    if ( *it == "QString" ) {		env << arg;	    } else if ( *it == "int" ) {		env << arg.toInt();	    } else if ( *it == "QDateTime") {		env << TimeConversion::fromISO8601(QCString(arg));	    } else if ( *it == "bool") {		if (arg.lower() == "false")		    env << (int)false;		else if (arg.lower() == "true")		    env << (int)true;		else		    doqcopsyntax( "parameter value for bool should be either 'true' or 'false'", arg );	    } else {		doqcopsyntax( "parameter type", *it );	    }	    argIdx++;	}	// send env    }    // Check for a "-w" option, which indicates that we should    // wait for a QCop command before exiting.    if ( argIdx < argc && QString(argv[argIdx]) == "-w" ) {	if ( ( argIdx + 3 ) > argc ) {	    doqcopusage();	    exit(1);	}	channel = argv[argIdx + 1];	command = argv[argIdx + 2];	QCopWatcher *watcher = new QCopWatcher( &app, command );	QCopChannel *chan = new QCopChannel( QCString(channel), &app );        QObject::connect	    ( chan, SIGNAL(received(const QCString&,const QByteArray&)),	      watcher, SLOT(received(const QCString&,const QByteArray&)) );        QObject::connect	    ( watcher, SIGNAL(done()), &app, SLOT(quit()) );	if ( ( argIdx + 3 ) < argc ) {	    QTimer::singleShot( QString(argv[argIdx + 3]).toInt(),				watcher, SLOT(timeout()) );	}	return app.exec();    }#endif    QTimer::singleShot( 0, &app, SLOT(quit()) );    return app.exec();}QCopWatcher::QCopWatcher( QObject *parent, const QString& msg )    : QObject( parent ){    this->msg = msg;}QCopWatcher::~QCopWatcher(){}void QCopWatcher::received( const QCString& msg, const QByteArray& data ){    if ( msg != this->msg )	return;    QString command = msg;    QDataStream stream( data, IO_ReadOnly );    int paren = command.find( "(" );    if ( paren <= 0 )	doqcopsyntax( "wait-command", command );    QString params = command.mid( paren + 1 );    if ( params[(int)params.length()-1] != ')' )	doqcopsyntax( "wait-command", command );    params.truncate( params.length()-1 );    QStringList paramList = QStringList::split( ",", params );    QStringList::Iterator it;    for ( it = paramList.begin(); it != paramList.end(); ++it ) {	if ( *it == "QString" ) {	    QString value;	    stream >> value;	    puts( value.latin1() );	} else if ( *it == "int" ) {	    int value;	    stream >> value;	    printf( "%d\n", value );	} else if ( *it == "QDateTime") {	    QDateTime value;	    QString converted;	    stream >> value;	    converted = TimeConversion::toISO8601(value);	    puts( converted.latin1() );	} else if ( *it == "bool") {	    int value;	    stream >> value;	    if ( value )		puts( "true" );	    else		puts( "false" );	} else {	    doqcopsyntax( "parameter type", *it );	}    }    emit done();}void QCopWatcher::timeout(){    QApplication::exit(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -