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 + -
显示快捷键?