complexpingpong example: Modernize the code

Use C++ IO streams and qWarning() instead of (f)printf() for console IO.
Make user-visible strings translatable. Use invokeMethod() instead
of QTimer.

Fixes: QTBUG-111366
Pick-to: 6.5
Change-Id: I6990b964c2097267e04cd361b9cd8fc0a22a0135
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Ievgenii Meshcheriakov 2023-03-28 12:22:39 +02:00
parent 21a6c86979
commit 7b9e7f8002
4 changed files with 42 additions and 40 deletions

View File

@ -5,54 +5,58 @@
#include "complexping.h"
#include <QCoreApplication>
#include <QDBusInterface>
#include <QDBusReply>
#include <QDBusServiceWatcher>
#include <QFile>
#include <QDebug>
#include <QProcess>
#include <stdio.h>
#include <iostream>
#include <string>
void Ping::start(const QString &name)
{
if (name != SERVICE_NAME)
return;
// open stdin for reading
qstdin.open(stdin, QIODevice::ReadOnly);
auto connection = QDBusConnection::sessionBus();
// find our remote
iface = new QDBusInterface(SERVICE_NAME, "/", "org.example.QtDBus.ComplexPong.Pong",
QDBusConnection::sessionBus(), this);
auto iface = new QDBusInterface(SERVICE_NAME, "/", "org.example.QtDBus.ComplexPong.Pong",
connection, this);
if (!iface->isValid()) {
fprintf(stderr, "%s\n",
qPrintable(QDBusConnection::sessionBus().lastError().message()));
qWarning().noquote() << connection.lastError().message();
QCoreApplication::instance()->quit();
}
connect(iface, SIGNAL(aboutToQuit()), QCoreApplication::instance(), SLOT(quit()));
while (true) {
printf("Ask your question: ");
std::string s;
while (true) {
std::cout << qPrintable(tr("Ask your question: ")) << std::flush;
std::getline(std::cin, s);
auto line = QString::fromStdString(s).trimmed();
QString line = QString::fromLocal8Bit(qstdin.readLine()).trimmed();
if (line.isEmpty()) {
iface->call("quit");
return;
} else if (line == "value") {
QVariant reply = iface->property("value");
if (!reply.isNull())
printf("value = %s\n", qPrintable(reply.toString()));
std::cout << "value = " << qPrintable(reply.toString()) << std::endl;
} else if (line.startsWith("value=")) {
iface->setProperty("value", line.mid(6));
} else {
QDBusReply<QDBusVariant> reply = iface->call("query", line);
if (reply.isValid())
printf("Reply was: %s\n", qPrintable(reply.value().variant().toString()));
if (reply.isValid()) {
std::cout << qPrintable(tr("Reply was: %1").arg(reply.value().variant().toString()))
<< std::endl;
}
}
if (iface->lastError().isValid())
fprintf(stderr, "Call failed: %s\n", qPrintable(iface->lastError().message()));
qWarning().noquote() << tr("Call failed: %1").arg(iface->lastError().message());
}
}
@ -61,9 +65,11 @@ int main(int argc, char **argv)
QCoreApplication app(argc, argv);
if (!QDBusConnection::sessionBus().isConnected()) {
fprintf(stderr, "Cannot connect to the D-Bus session bus.\n"
qWarning().noquote() << QCoreApplication::translate(
"complexping",
"Cannot connect to the D-Bus session bus.\n"
"To start it, run:\n"
"\teval `dbus-launch --auto-syntax`\n");
"\teval `dbus-launch --auto-syntax`");
return 1;
}

View File

@ -5,17 +5,12 @@
#define COMPLEXPING_H
#include <QtCore/QObject>
#include <QtCore/QFile>
#include <QtDBus/QDBusInterface>
class Ping: public QObject
class Ping : public QObject
{
Q_OBJECT
public slots:
void start(const QString &);
public:
QFile qstdin;
QDBusInterface *iface;
void start(const QString &name);
};
#endif

View File

@ -7,12 +7,8 @@
#include <QCoreApplication>
#include <QDBusConnection>
#include <QDBusError>
#include <QTimer>
#include <QDebug>
#include <stdio.h>
#include <stdlib.h>
// the property
QString Pong::value() const
{
return m_value;
@ -25,7 +21,8 @@ void Pong::setValue(const QString &newValue)
void Pong::quit()
{
QTimer::singleShot(0, QCoreApplication::instance(), &QCoreApplication::quit);
QMetaObject::invokeMethod(QCoreApplication::instance(), &QCoreApplication::quit,
Qt::QueuedConnection);
}
QDBusVariant Pong::query(const QString &query)
@ -54,12 +51,13 @@ int main(int argc, char **argv)
Pong *pong = new Pong(&obj);
QObject::connect(&app, &QCoreApplication::aboutToQuit, pong, &Pong::aboutToQuit);
pong->setProperty("value", "initial value");
QDBusConnection::sessionBus().registerObject("/", &obj);
if (!QDBusConnection::sessionBus().registerService(SERVICE_NAME)) {
fprintf(stderr, "%s\n",
qPrintable(QDBusConnection::sessionBus().lastError().message()));
exit(1);
auto connection = QDBusConnection::sessionBus();
connection.registerObject("/", &obj);
if (!connection.registerService(SERVICE_NAME)) {
qWarning().noquote() << connection.lastError().message();
return 1;
}
app.exec();

View File

@ -8,23 +8,26 @@
#include <QtDBus/QDBusAbstractAdaptor>
#include <QtDBus/QDBusVariant>
class Pong: public QDBusAbstractAdaptor
class Pong : public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.example.QtDBus.ComplexPong.Pong")
Q_PROPERTY(QString value READ value WRITE setValue)
public:
QString m_value;
QString value() const;
void setValue(const QString &newValue);
Pong(QObject *obj) : QDBusAbstractAdaptor(obj)
{ }
Pong(QObject *obj) : QDBusAbstractAdaptor(obj) { }
signals:
void aboutToQuit();
public slots:
QDBusVariant query(const QString &query);
Q_NOREPLY void quit();
private:
QString m_value;
};
#endif