Qt for HarmonyOS/qtohosextras doc/Want FDs Receiver Example - main.cpp
< Qt for HarmonyOS / qtohosextras doc
Want FDs Receiver Example - main.cpp
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QApplication>
#include <QLabel>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QWidget>
#include <QtOhosExtras>
#include <cerrno>
#include <cstring>
#include <sys/stat.h>
namespace {
class FdReceiverWindow : public QWidget
{
public:
explicit FdReceiverWindow(QWidget *parent = nullptr);
void handleWant(const QtOhosExtras::QOhosWant &want);
private:
void appendLog(const QString &message);
QLabel *m_hintLabel;
QTextEdit *m_logEdit;
};
FdReceiverWindow::FdReceiverWindow(QWidget *parent)
: QWidget(parent)
, m_hintLabel(new QLabel(QStringLiteral("check: compare fd_info dev/ino in logs"), this))
, m_logEdit(new QTextEdit(this))
{
setWindowTitle(QStringLiteral("Want FD Receiver"));
auto *layout = new QVBoxLayout(this);
m_hintLabel->setWordWrap(true);
layout->addWidget(m_hintLabel);
m_logEdit->setReadOnly(true);
layout->addWidget(m_logEdit);
}
void FdReceiverWindow::appendLog(const QString &message)
{
m_logEdit->append(message);
}
void FdReceiverWindow::handleWant(const QtOhosExtras::QOhosWant &want)
{
appendLog(QStringLiteral("recv: want"));
if (want.fds.isEmpty()) {
appendLog(QStringLiteral("recv: status=no_fds"));
return;
}
const int fdCount = want.fds.size();
appendLog(QStringLiteral("recv: status=processed fds=%1").arg(fdCount));
for (auto it = want.fds.cbegin(); it != want.fds.cend(); ++it) {
const QString fdKey = it.key();
const int fd = it.value();
struct stat statInfo;
const int fstatResult = ::fstat(fd, &statInfo);
const int fstatErrno = errno;
if (fstatResult == 0) {
appendLog(
QStringLiteral("fd_info: key=%1 fd=%2 dev=%3 ino=%4")
.arg(fdKey)
.arg(fd)
.arg(static_cast<qulonglong>(statInfo.st_dev))
.arg(static_cast<qulonglong>(statInfo.st_ino)));
} else {
appendLog(
QStringLiteral("fd_stat: key=%1 result=error errno=%2 message=%3")
.arg(fdKey)
.arg(fstatErrno)
.arg(QString::fromLocal8Bit(strerror(fstatErrno))));
}
}
}
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
FdReceiverWindow window;
window.show();
auto abilityContext = QtOhosExtras::QOhosAbilityContext::getDefaultInstance();
QObject::connect(
abilityContext.get(),
&QtOhosExtras::QOhosAbilityContext::newWantInfoReceived,
&window,
[&window](const QSharedPointer<QtOhosExtras::QOhosWantInfo> &wantInfo) {
window.handleWant(wantInfo->want());
});
auto launchWantInfo = QtOhosExtras::QOhosAppContext::getAppLaunchWantInfo();
if (!launchWantInfo.isNull()) {
window.handleWant(launchWantInfo->want());
}
return app.exec();
}