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