2

QtDBUSAPIを介してカスタムc++クラスを送信したいと思います。protocコンパイラを使用して.protoファイルからクラスを作成し、QtCreatorのプロジェクトに追加しました。ここで、dbusAPIを介してカスタムクラスをQVariantとして送信できることを確認したいと思います。私は受信者と送信者のプログラムを持っており、Dbusが機能するように簡単なテスト文字列を送信できます。メタタイプとして追加した後、プロトコルバッファクラスを送信するのに問題があります。

私のテスト.protoファイルにはintのみが含まれています。

message MyData {
  required int32 name = 1;
  required int32 id = 2;
  optional int32 email = 3;
}

私が追加したプロトコルバッファクラスヘッダーファイルに:

#include <QMetaType>
#include <QDBusMetaType>
...
friend QDBusArgument &operator<<(QDBusArgument &argument, const MyData &dataToWrite);
friend const QDBusArgument &operator>>(const QDBusArgument &argument, MyData &dataToWrite);
...
Q_DECLARE_METATYPE(MyData )

そして、私が追加したプロトコルバッファクラスの実装ファイルに:

#include <QDebug>
...
#include <QMetaType>
#include <QDBusMetaType>

// Marshall the MyData data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const MyData &dataToWrite)
{

    qDebug() << "OPERATOR<<";

    argument.beginStructure();

    // Break out the various properties of dataToWrite protocol buffer
    int name = dataToWrite.name();
    int id = dataToWrite.id();
    int email = dataToWrite.email();
    qDebug() << name;
    qDebug() << id;
    qDebug() << email;

    argument << name;
    argument << id;
    argument << email;
    argument.endStructure();
    return argument;

}

// Retrieve the MyData data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, MyData &dataToWrite)
{

    qDebug() << "OPERATOR>>";

    argument.beginStructure();

    // Break out the various properties of dataToWrite protocol buffer
    int name = dataToWrite.name();
    int id = dataToWrite.id();
    int email = dataToWrite.email();
    qDebug() << name;
    qDebug() << id;
    qDebug() << email;

    argument >> name;
    argument >> id;
    argument >> email;
    argument.endStructure();
    return argument;

}

メインは単純に次のようになります。

QCoreApplication a(argc, argv);

    dbussender* client = new dbussender("com.one.two.three.nvram", "/dbusReadWriteNvRam", QDBusConnection::sessionBus(), 0);

    // Create a protocol buffer class and provide its properties with values
    MyData dataToWrite;
    dataToWrite.set_name(2);
    dataToWrite.set_id(3);
    dataToWrite.set_email(4);

    QString command3 = "Contacting Protobuf Receiver and calling WRITENVRAM...";
    QString response3 = client->writeNVRam(dataToWrite);

    std::cout << "Command:   " << command3.toStdString() << std::endl;
    std::cout << "Response:   " << response3.toStdString() << std::endl;

私のdbussenderクラスは、次のようにリモート関数を呼び出します。

inline QDBusPendingReply<QString> writeNVRam(MyData dataToWrite)
    {

        qDebug() << "Sending " << dataToWrite.name();
        qDebug() << "Sending " << dataToWrite.id();
        qDebug() << "Sending " << dataToWrite.email();

        QList<QVariant> argumentList;
        argumentList << QVariant::fromValue<MyData>(dataToWrite);
        return asyncCallWithArgumentList(QLatin1String("writeNVRam"), argumentList);
    }

最終的に私の受信機プログラムでは、この関数が呼び出されますが、常に0を返します。

// Write NVRAM
QString dbusReadWriteNvRam::writeNVRam(MyData dataToWrite) {

    qDebug() << "WRITE NVRAM COMMAND CALLED";

    qDebug() << "Unpacking: " << dataToWrite.name();
    qDebug() << "Unpacking: " << dataToWrite.id();
    qDebug() << "Unpacking: " << dataToWrite.email();

    return "HELLO CLASS";

}

Senderプログラムの出力は次のとおりです。

Sending  2 
Sending  3 
Sending  4 
OPERATOR<< 
0 
0 
0 
OPERATOR<< 
2 
3 
4 
Command:   Contacting Protobuf Receiver and calling WRITENVRAM...
Response:   HELLO CLASS

そして、Receiverプログラムの出力は次のとおりです。

OPERATOR<< 
0 
0 
0 
OPERATOR>> 
0 
0 
0 
WRITE NVRAM COMMAND CALLED 
Unpacking:  0 
Unpacking:  0 
Unpacking:  0

マーシャリング関数が2回呼び出されているように見えるのはなぜですか?そして、どうして2番目の呼び出しにはプロトコルバッファの3つのプロパティの有効な値2、3、4が含まれているように見えますが、最初の呼び出しはすべて0です。受信者はすべて0を認識しているように見え、有効な値を持つプロトコルバッファオブジェクトを受信することはありません。

マーシャリングコードに何か問題がありますか?他に何が起こっている可能性がありますか?

4

1 に答える 1

1

これを機能させるには、次のような演算子を実装します。

// PROTOBUF-MODIFICATION-DBUS
// Marshall the companyData data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const companyData &dataToWrite)
{

    argument.beginStructure();

    // Break out the various properties of dataToWrite protocol buffer
    int name = dataToWrite.name();
    int id = dataToWrite.id();
    int email = dataToWrite.email();
    argument << name;
    argument << id;
    argument << email;
    argument.endStructure();
    return argument;

}

// PROTOBUF-MODIFICATION-DBUS
// Retrieve the companyData data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, companyData &dataToWrite)
{

    int name, id, email;

    argument.beginStructure();
    argument >> name;
    argument >> id;
    argument >> email;
    argument.endStructure();
    dataToWrite.set_name(name);
    dataToWrite.set_id(id);
    dataToWrite.set_email(email);
    return argument;

}
于 2012-10-15T17:03:35.353 に答える