From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-vi1eur05on2060a.outbound.protection.outlook.com ([2a01:111:f400:7d00::60a] helo=EUR05-VI1-obe.outbound.protection.outlook.com) by metis.ext.pengutronix.de with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mAXJj-0000BN-7P for RAUC@pengutronix.de; Mon, 02 Aug 2021 14:45:17 +0200 From: "Stahl, Michael" Date: Mon, 2 Aug 2021 12:45:12 +0000 Message-ID: References: , In-Reply-To: Content-Language: de-DE MIME-Version: 1.0 Subject: Re: [RAUC] Antwort: D-Bus control Qt List-Id: RAUC Project - Discussion List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: multipart/mixed; boundary="===============1824597611==" Errors-To: rauc-bounces@pengutronix.de Sender: "RAUC" To: "Eugen.Wiens@JUMO.net" Cc: "RAUC@pengutronix.de" --===============1824597611== Content-Language: de-DE Content-Type: multipart/alternative; boundary="_000_AM9PR09MB47563BB4F309DDD51814BF72DBEF9AM9PR09MB4756eurp_" --_000_AM9PR09MB47563BB4F309DDD51814BF72DBEF9AM9PR09MB4756eurp_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi Eugen, thanks for the informations. They were very useful. Some lines are familiar= to me because I tested a lot. But I still need some support. This is the way I request the property: MyProgress parameterProgress; QDBusInterface interface( "de.pengutronix.rauc", "/", "de.pengutronix.rauc.Installer", QDBusConnection::systemBus() ); QVariant property =3D interface.property("Progress"); property.value() >> parameterProgress; No I get a compiler error: no match for operator>>'(opernad types are 'QDBusArgument' and 'MyProgress'= ) I think I do the registration an the installing of the oparators wrong. The registration is done in the constructor of MyProgress: MyProgress ::MyProgress(){ qRegisterMetaType(); qDBusRegisterMetaType(); } The magic statement I place in top of my MyProcess.cpp // this is one of the magic statements Q_DECLARE_METATYPE(MyProgress) But where exactly do you place the operators? Also in the MyProcess.cpp? QDBusArgument &operator<<(QDBusArgument &argument, const MyProgress& parame= terProgress); const QDBusArgument &operator>>(const QDBusArgument &argument, MyProgress& = parameterProgress); QDBusArgument &operator<<(QDBusArgument &argument, const MyProgress& parame= terProgress) { argument.beginStructure(); argument << parameterProgress.m_Progress; argument << parameterProgress.m_Message; argument << parameterProgress.m_Additional; argument.endStructure(); return argument; } const QDBusArgument &operator>>(const QDBusArgument &argument, MyProgress& = parameterProgress) { argument.beginStructure(); argument >> parameterProgress.m_Progress; argument >> parameterProgress.m_Message; argument >> parameterProgress.m_Additional; argument.endStructure(); return argument; } It seems like I am only a few millimeters away from my goal. Thanks ________________________________ Von: Eugen.Wiens@JUMO.net Gesendet: Montag, 2. August 2021 13:41 An: Stahl, Michael Cc: RAUC@pengutronix.de Betreff: Antwort: [RAUC] D-Bus control Qt Hi Michael, "RAUC" schrieb am 02.08.2021 08:15:26: > Von: "Stahl, Michael" > An: "RAUC@pengutronix.de" > Datum: 02.08.2021 08:15 > Betreff: [RAUC] D-Bus control Qt > Gesendet von: "RAUC" > > Is there someone who implemented the DBus Property "Progress" into a > Qt-Application? The problem seems the return value isi (Integer, > String, Integer). > For all other properties with a single return value like "Operation" > or "LastError" the Qt DBus API works fine. > I found an email from 28.Oct 2019 in the mailing list where Bastian > Krause had the same issue. The answer was only that he had to > cunsult the Qt DBus documentation on how a tuple is mapped to Qt types. > > Thats a good hint but after hours of searching the web I didn't find > a solution. The return value for a property is QVariant in Qt. > > Trial 1 -> Read value by iface.property("Progress"): > This is the error message I got when I try to read the progress property: > Cannot construct placeholder type QDBusRawType > > Trial 2 -> Read value by iface.call("Get",...): > Not able to get any information. The arguments of the returned > QDBusMessages are always empty! That is the way we implemented it: On Qt there are some pitfalls and you has to marshaling the data. 1. Create a Data Class #include #include #include class MyProgress { public: [...] int m_Progress; QString m_Message; int m_Additional; }; // this is one of the magic statements Q_DECLARE_METATYPE(MyProgress) QDBusArgument &operator<<(QDBusArgument &argument, const MyProgress& parame= terProgress); const QDBusArgument &operator>>(const QDBusArgument &argument, MyProgress& = parameterProgress); }; You has to register the metatype and implement the operators. In the Constr= uctor you has to add two register Methods qRegisterMetaType(); qDBusRegisterMetaType(); After this tree registrations your Class MyProgress is known by Qt Metatype= System. Now you has to implement operators QDBusArgument &operator<<(QDBusArgument &argument, const MyProgress& parame= terProgress) { argument.beginStructure(); argument << parameterProgress.m_Progress; argument << parameterProgress.m_Message; argument << parameterProgress.m_Additional; argument.endStructure(); return argument; } const QDBusArgument &operator>>(const QDBusArgument &argument, MyProgress& = parameterProgress) { argument.beginStructure(); argument >> parameterProgress.m_Progress; argument >> parameterProgress.m_Message; argument >> parameterProgress.m_Additional; argument.endStructure(); return argument; } Now you are finished with preparing how to use it. In the Qt Slot of the D-= Bus call your can pipe it in your class MyProgress parameterProgress; property.value() >> parameterProgress; This URL help you to map our code to the Qt example https://doc.qt.io/qt-5/= qdbusargument.html I hope it helps > > _______________________________________________ > RAUC mailing list Diese E-Mail kann vertrauliche und/oder rechtlich gesch?tzte Informationen = beinhalten und ist ausschlie?lich f?r die im Verteiler genannten Personen b= estimmt. Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail= sind nicht gestattet. Bitte benachrichtigen Sie uns gegebenenfalls telefon= isch oder mit Antwort-Mail, falls Sie nicht der richtige Adressat dieser E-= Mail sind. Bitte l?schen Sie diese Nachricht und alle Anh?nge dazu unverz?g= lich. Falls nicht ausdr?cklich vermerkt, ist diese E-Mail keine rechtlich b= indende Vereinbarung. Kommanditgesellschaft: JUMO GmbH & Co. KG, Sitz: 36039 Fulda, Amtsgericht F= ulda HRA 302, Pers?nlich haftende Gesellschafterin: M. K. JUCHHEIM GmbH, Si= tz: 36039 Fulda, Amtsgericht Fulda HRB 17, Gesch?ftsf?hrer: Dipl.-Ing. Bern= hard Juchheim, Dipl.-Kfm. Michael Juchheim, Dipl.-Ing. Dimitrios Charisiadi= s Ust.-Id.-Nr.: DE 112411234 --_000_AM9PR09MB47563BB4F309DDD51814BF72DBEF9AM9PR09MB4756eurp_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi Eugen,

thanks for the informations. They were very useful. Some lines are familiar= to me because I tested a lot.
But I still need some support. 

This is the way I request the property:

MyProgress parameterProgress;
QDBusInt= erface interface( "de.pengutronix.rauc",
                    "/",
                    =
"de.pengutronix.rauc.Installer",
                    QDBusConnection::systemBus() =
);
QVariant= property =3D interface.property("Progress");
property.value<=
QDBusArgument>() <=
span style=3D"color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, =
sans-serif; font-size: 12pt;">>> parameterProgress;

No I get a compiler error:
no match for operator>>'(opernad types are 'QDBusArgument' and 'M=
yProgress')

I think I do the registration an the installing of the oparators wrong.=

The registration is done in the constructor of MyProgress:
MyProgress =
::MyProgress(){
    qRegisterMetaType=
<MyProgress>();
    qDBusRegisterMetaType<MyProgress>();
}

The magic statement I place in top of my MyProcess.cpp
// this is one of the magic statements
Q_DECLARE_METATYPE(MyProgress)

But where exactly do you place the operators? Also in the MyProcess.cpp?&nb= sp;
QDBusArgument &operator<<(QDBusArgument &argument, con= st MyProgress& parameterProgress);
const QDBusArgument &operator>>(const QDBusArgument &a= rgument, MyProgress& parameterProgress);
QDBusArgument &operator<<(QDBusArgument &argument, con= st MyProgress& parameterProgress)
{
    argument.beginStructure();
    argument << parameterProgress.m_Progress;=
    argument << parameterProgress.m_Message;<= /tt>
    argument << parameterProgress.m_Additional;
    argument.endStructure();
    return argument;

}
const QDBusArgument &operator>>(const QDBusArgument &a= rgument, MyProgress& parameterProgress)
{
    argument.beginStructure();
    argument >> parameterProgress.m_Progress;=
    argument >> parameterProgress.m_Message;<= /tt>
    argument >> parameterProgress.m_Additional;
    argument.endStructure();
    return argument;

}

It seems like I am only a few millimeters away from my goal.

Thanks


Von: Eugen.Wiens@JUMO.net &= lt;Eugen.Wiens@JUMO.net>
Gesendet: Montag, 2. August 2021 13:41
An: Stahl, Michael <mstahl@moba.de>
Cc: RAUC@pengutronix.de <RAUC@pengutronix.de>
Betreff: Antwort: [RAUC] D-Bus control Qt
 
Hi Michael,

"RAUC" <rauc-bounces@pengutronix.de> s= chrieb am 02.08.2021 08:15:26:

> Von: "Stahl, Michael" <mstahl@moba.de>

> An: "RAUC@pengutronix.de" <RAUC@peng= utronix.de>
> Datum: 02.08.2021 08:15
> Betreff: [RAUC] D-Bus control Qt
> Gesendet von: "RAUC" <rauc-bounces@p= engutronix.de>
>
> Is there someone who implemented the DBus Property "Progress"= ; into a
> Qt-Application? The problem seems the return value isi (Integer,
> String, Integer).

> For all other properties with a single return val= ue like "Operation"
> or "LastError" the Qt DBus API works fine.

> I found an email from 28.Oct 2019 in the mailing = list where Bastian
> Krause had the same issue. The answer was only that he had to
> cunsult the Qt DBus documentation on how a tuple is mapped to Qt types= .

>
> Thats a good hint but after hours of searching the web I didn't find > a solution. The return value for a property is QVariant in Qt.
=

>
> Trial 1 -> Read value by iface.property("Progress"):

> This is the error message I got when I try to rea= d the progress property:
> Cannot construct placeholder type QDBusRawType
>
> Trial 2 -> Read value by iface.call("Get",...):

> Not able to get any information. The arguments of= the returned
> QDBusMessages are always empty!

That is the way we implemented it:

On Qt there are some pitfalls and you has to marshalin= g the data.

1. Create a Data Class

#include <QObject>
#include <QDBusArgument>
#include <QString>

class MyProgress
{
public:
[...]
    int m_Progress;
    QString m_Message;
    int m_Additional;
};

// this is one of the magic statements Q_DECLARE_METATYPE(MyProgress)
QDBusArgument &operator<<(QDBusArgument &= ;argument, const MyProgress& parameterProgress);
const QDBusArgument &operator>>(const QDBusA= rgument &argument, MyProgress& parameterProgress);
};

You has to register the metatype and implement the ope= rators. In the Constructor you has to add two register Methods

qRegisterMetaType<MyProgress>();
qDBusRegisterMetaType<MyProgress>();=

After this tree registrations your Class MyProgress is= known by Qt Metatype System. Now you has to implement operators

QDBusArgument &operator<<(QDBusArgument &= ;argument, const MyProgress& parameterProgress)
{
    argument.beginStructure();     argument << parameterProgress.m_Pr= ogress;
    argument << parameterProgress.m_Me= ssage;
    argument << parameterProgress.m_Ad= ditional;
    argument.endStructure();
    return argument;
}
const QDBusArgument &operator>>(const QDBusA= rgument &argument, MyProgress& parameterProgress)
{
    argument.beginStructure();     argument >> parameterProgress.m_Pr= ogress;
    argument >> parameterProgress.m_Me= ssage;
    argument >> parameterProgress.m_Ad= ditional;
    argument.endStructure();
    return argument;
}

Now you are finished with preparing how to use it. In = the Qt Slot of the D-Bus call your can pipe it in your class
MyProgress parameterProgress;
property.value<QDBusArgument>() >> paramet= erProgress;


This URL help you to map our code to the Qt example https://doc.qt.io/qt-5/qdbusargument.html

I hope it helps


>
> _______________________________________________
> RAUC mailing list

Diese E-Mail kann vertrauliche und/= oder rechtlich gesch?tzte Informationen beinhalten und ist ausschlie?lich f= ?r die im Verteiler genannten Personen bestimmt. Das unerlaubte Kopieren so= wie die unbefugte Weitergabe dieser Mail sind nicht gestattet. Bitte benachrichtigen Sie uns gegebenenfalls te= lefonisch oder mit Antwort-Mail, falls Sie nicht der richtige Adressat dies= er E-Mail sind. Bitte l?schen Sie diese Nachricht und alle Anh?nge dazu unv= erz?glich. Falls nicht ausdr?cklich vermerkt, ist diese E-Mail keine rechtlich bindende Vereinbarung.

Kommanditgesellschaft: JUMO GmbH & Co. KG, Sitz: 36039 Fulda, Amtsgeric= ht Fulda HRA 302, Pers?nlich haftende Gesellschafterin: M. K. JUCHHEIM GmbH= , Sitz: 36039 Fulda, Amtsgericht Fulda HRB 17, Gesch?ftsf?hrer: Dipl.-Ing. = Bernhard Juchheim, Dipl.-Kfm. Michael Juchheim, Dipl.-Ing. Dimitrios Charisiadis
Ust.-Id.-Nr.: DE 112411234

--_000_AM9PR09MB47563BB4F309DDD51814BF72DBEF9AM9PR09MB4756eurp_-- --===============1824597611== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ RAUC mailing list --===============1824597611==--