Jump to content

Qt for HarmonyOS/qtohosextras doc/Want FDs Receiver Example - main.cpp

From Qt Wiki

< 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();
 }