3 votes

Définition de types personnalisés Enum pour l'introspection de Qt D-Bus

Je travaille avec QDBUS dont le type personnalisé est Enum. Après avoir cherché sur Google, j'ai trouvé le lien ci-dessous qui explique le marshalling des types personnalisés QDBUS.

http://techbase.kde.org/Development/Tutorials/D-Bus/CustomTypes#Adventurous_serialization_of_enumerations

Cela n'explique pas l'annotation à spécifier dans le xml d'interospection QTDBUS pour générer un proxy en utilisant qdbusxml2cpp.

Comment ajouter des annotations Enum dans le xml d'interospection QTDBUS ?

S'il vous plaît, si possible, expliquez avec un exemple de code.

1voto

MeJ Points 335

J'ai trouvé une solution à mon problème :

Créez d'abord un nouveau fichier d'en-tête appelé enums.h ce qui ressemble à :

#ifndef ENUMS_H
#define ENUMS_H

#include <QtDBus>
#include "enumDBus.h"

enum Color {
    RED = 0,
    BLUE,
    GREEN
};

Q_DECLARE_METATYPE(Color)

#endif  /* ENUMS_H */

Note de la ligne suivante #include "enumDBus.h" vous pouvez trouver ce fichier d'en-tête ici !

Ainsi, après avoir déclaré l'enum, vous pouvez déclarer une méthode qui prend l'enum comme argument, dans cet exemple, j'ai déclaré la méthode suivante en calculatrice.h :

void setColor(Color color);

L'implémentation de cette méthode :

void Calculator::setColor(Color c)
{
    switch (c) {
    case BLUE: std::cout << "Color: blue" << std::endl;
        break;
    case GREEN: std::cout << "Color: green" << std::endl;
        break;
    case RED: std::cout << "Color: reed" << std::endl;
        break;
    default:
        std::cout << "Color: FAIL!" << std::endl;
    }
}

Maintenant, nous allons générer la description de l'interface (xml), utilisez la commande suivante

qdbuscpp2xml -M -s calculator.h -o com.meJ.system.CalculatorInterface.xml

La génération des méthodes qui contiennent des types personnalisés ne fonctionne pas correctement, nous devons donc faire quelques ajustements :

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="com.meJ.system.CalculatorInterface">
    <method name="setColor">
        <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="Color"/>
        <arg type="(i)" direction="in" name="c"/>
    </method>
  </interface>
</node>

Avec ce fichier xml, nous pouvons simplement créer nos classes d'adaptateurs et d'interfaces.

Dans notre main.cpp (sur le client et le serveur !) nous devons enregistrer notre type personnalisé :

int main(int argc, char** argv)
{
    qRegisterMetaType<Color>("Color");
    qDBusRegisterMetaType<Color>();
}

Côté client

Inclure les fichiers générés calculatorInterface.h et enums.h dans votre main.cpp.

Maintenant, vous pouvez simplement appeler votre méthode :

int main(int argc, char** argv)
{
    qRegisterMetaType<Color>("Color");
    qDBusRegisterMetaType<Color>();

    QDBusConnection dbus = QDBusConnection::sessionBus();

    com::meJ::system::CalculatorInterface *calculator = new com::meJ::system::CalculatorInterface("com.meJ.system", "/Calc", dbus);
    if (calculator->isValid() == false) {
        cerr << "ERROR: " << qPrintable(calculator->lastError().message()) << endl;
        exit(1);
    }

    Color c = GREEN;
    calculator->setColor(c);
    std::cout << qPrintable(calculator->lastError().message()) << std::endl;

    exit(0);
}

Si tout a fonctionné, vous devriez voir la sortie suivante sur votre programme serveur :

~# Color: green

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X