qdbus.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 446 行 · 第 1/2 页

CPP
446
字号
    QVariantList params;    if (!args.isEmpty()) {        const QMetaObject *mo = iface.metaObject();        QByteArray match = member.toLatin1();        match += '(';        int midx = -1;        for (int i = mo->methodOffset(); i < mo->methodCount(); ++i) {            QMetaMethod mm = mo->method(i);            QByteArray signature = mm.signature();            if (signature.startsWith(match)) {                midx = i;                break;            }         }        if (midx == -1) {            fprintf(stderr, "Cannot find '%s.%s' in object %s at %s\n",                    qPrintable(interface), qPrintable(member), qPrintable(path),                    qPrintable(service));            exit(1);        }        QMetaMethod mm = mo->method(midx);        QList<QByteArray> types = mm.parameterTypes();        for (int i = 0; i < types.count(); ++i) {            if (types.at(i).endsWith('&')) {                // reference (and not a reference to const): output argument                // we're done with the inputs                while (types.count() > i)                    types.removeLast();                break;            }        }        for (int i = 0; !args.isEmpty() && i < types.count(); ++i) {            int id = QVariant::nameToType(types.at(i));            if (id == QVariant::UserType)                id = QMetaType::type(types.at(i));            Q_ASSERT(id);            QVariant p;            QString argument;            if ((id == QVariant::List || id == QVariant::StringList)                 && args.at(0) == QLatin1String("("))                p = readList(args);            else                p = argument = args.takeFirst();            if (id == int(QMetaType::UChar)) {                // special case: QVariant::convert doesn't convert to/from                // UChar because it can't decide if it's a character or a number                p = qVariantFromValue<uchar>(p.toUInt());            } else if (id < int(QMetaType::User) && id != int(QVariant::Map)) {                p.convert(QVariant::Type(id));                if (p.type() == QVariant::Invalid) {                    fprintf(stderr, "Could not convert '%s' to type '%s'.\n",                            qPrintable(argument), types.at(i).constData());                    exit(1);                }            } else if (id == qMetaTypeId<QDBusVariant>()) {                QDBusVariant tmp(p);                p = qVariantFromValue(tmp);            } else if (id == qMetaTypeId<QDBusObjectPath>()) {                QDBusObjectPath path(argument);                if (path.path().isNull()) {                    fprintf(stderr, "Cannot pass argument '%s' because it is not a valid object path.\n",                            qPrintable(argument));                    exit(1);                }                p = qVariantFromValue(path);            } else if (id == qMetaTypeId<QDBusSignature>()) {                QDBusSignature sig(argument);                if (sig.signature().isNull()) {                    fprintf(stderr, "Cannot pass argument '%s' because it is not a valid signature.\n",                            qPrintable(argument));                    exit(1);                }                p = qVariantFromValue(sig);            } else {                fprintf(stderr, "Sorry, can't pass arg of type '%s'.\n",                        types.at(i).constData());                exit(1);            }            params += p;        }        if (params.count() != types.count() || !args.isEmpty()) {            fprintf(stderr, "Invalid number of parameters\n");            exit(1);        }    }    QDBusMessage reply = iface.callWithArgumentList(QDBus::Block, member, params);    if (reply.type() == QDBusMessage::ErrorMessage) {        QDBusError err = reply;        printf("Error: %s\n%s\n", qPrintable(err.name()), qPrintable(err.message()));        exit(2);    } else if (reply.type() != QDBusMessage::ReplyMessage) {        fprintf(stderr, "Invalid reply type %d\n", int(reply.type()));        exit(1);    }    foreach (QVariant v, reply.arguments())        printArg(v);    exit(0);}static bool globServices(QDBusConnectionInterface *bus, const QString &glob){    QRegExp pattern(glob, Qt::CaseSensitive, QRegExp::Wildcard);    if (!pattern.isValid())        return false;    QStringList names = bus->registeredServiceNames();    names.sort();    foreach (const QString &name, names)        if (pattern.exactMatch(name))            printf("%s\n", qPrintable(name));    return true;}static void printAllServices(QDBusConnectionInterface *bus){    const QStringList services = bus->registeredServiceNames();    QMap<QString, QStringList> servicesWithAliases;    foreach (QString serviceName, services) {        QDBusReply<QString> reply = bus->serviceOwner(serviceName);        QString owner = reply;        if (owner.isEmpty())            owner = serviceName;        servicesWithAliases[owner].append(serviceName);    }    for (QMap<QString,QStringList>::const_iterator it = servicesWithAliases.constBegin();         it != servicesWithAliases.constEnd(); ++it) {        QStringList names = it.value();        names.sort();        printf("%s\n", qPrintable(names.join(QLatin1String("\n "))));    }}int main(int argc, char **argv){    QCoreApplication app(argc, argv);    QStringList args = app.arguments();    args.takeFirst();    if (args.value(0) == QLatin1String("--system")) {        connection = QDBusConnection::systemBus();        args.takeFirst();    } else {        connection = QDBusConnection::sessionBus();    }    if (!connection.isConnected()) {        fprintf(stderr, "Could not connect to D-Bus server: %s: %s\n",                qPrintable(connection.lastError().name()),                qPrintable(connection.lastError().message()));        return 1;    }    QDBusConnectionInterface *bus = connection.interface();    if (args.isEmpty()) {        printAllServices(bus);        exit(0);    }    QString service = args.takeFirst();    if (!QDBusUtil::isValidBusName(service)) {        if (service.contains(QLatin1Char('*'))) {            if (globServices(bus, service))                return 0;        }        fprintf(stderr, "Service '%s' is not a valid name.\n", qPrintable(service));        exit(1);    }    if (!bus->isServiceRegistered(service)) {        fprintf(stderr, "Service '%s' does not exist.\n", qPrintable(service));        exit(1);    }    if (args.isEmpty()) {        printf("/\n");        listObjects(service, QString());        exit(0);    }    QString path = args.takeFirst();    if (!QDBusUtil::isValidObjectPath(path)) {        fprintf(stderr, "Path '%s' is not a valid path name.\n", qPrintable(path));        exit(1);    }    if (args.isEmpty()) {        listAllInterfaces(service, path);        exit(0);    }    QString interface = args.takeFirst();    QString member;    int pos = interface.lastIndexOf(QLatin1Char('.'));    if (pos == -1) {        member = interface;        interface.clear();    } else {        member = interface.mid(pos + 1);        interface.truncate(pos);    }    if (!interface.isEmpty() && !QDBusUtil::isValidInterfaceName(interface)) {        fprintf(stderr, "Interface '%s' is not a valid interface name.\n", qPrintable(interface));        exit(1);    }    if (!QDBusUtil::isValidMemberName(member)) {        fprintf(stderr, "Method name '%s' is not a valid member name.\n", qPrintable(member));        exit(1);    }    placeCall(service, path, interface, member, args);}

⌨️ 快捷键说明

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