Re: NetworkManager D-Bus Interface in C++ and Qt
- From: Chris Hessing <chris hessing cloudpath net>
- To: networkmanager-list gnome org
- Subject: Re: NetworkManager D-Bus Interface in C++ and Qt
- Date: Thu, 12 Nov 2009 16:55:31 -0700
Hello, I want to add NetworkManager D-Bus Interface to my project
(http://gitorious.org/yeos).
I saw the official specification
(http://projects.gnome.org/NetworkManager/developers/spec.html) and I
made tests, but I can't use the NetworkManager D-Bus Interface in my
project.
I have the NetworkManager libs installed on Ubuntu 9.04 Jaunty, and I am
working in C++ with the Qt libraries.
I saw the code of nm-applet and KNetworkManager but they need other
extra libraries.
Can you put me a code example of how use the NetworkManager D-Bus
Interface in C++ with Qt libraries?
Thanks for your attention,
Luis Iv?n Cuende
Luis -
Depending on what you want to do, it can be really easy, or really
painful. A good place to start is the qdbusxml2cpp tool that is
included with Qt when it is built with support for DBus. Using that
tool, you can generate a lot of the code you need by using the
introspection files that are included in the network manager source
code. Once those classes are generated, they are easy to use. DBus
events show up as Qt signals. DBus calls are method calls. All the
DBus work happens behind the scenes.
However, you will probably run in to some issues right off the bat with
a lot of the introspection files in NetworkManager. The qdbusxml2cpp
program is pretty simple minded when it comes to the signatures that it
supports. As soon as you hit a signature of any complexity the tool
will error out. If you don't need the method that has the complex
signature, you can comment it out, and run the tool again.
For the more complex ones, you are going to have to put the code
together yourself. Fortunately, making the DBus calls isn't terribly
difficult. Building the queries and parsing the responses is a
different story.
Unfortunately, it seems to be difficult to find any useful information
on the net about how to do what you want to do. I managed to figure
some of it out with a significant amount of trial and error.
Here is a bit of code that gets a list of devices from Network Manager
using Qt. (The hard way.) I have removed most of the error checking
to make the code a little easier to follow -- hope this helps :
QStringList *NetworkManager::getDevices()
{
QStringList *myList = NULL;
QDBusConnection bus = QDBusConnection::systemBus();
QDBusInterface dbus_interface("org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager",
"org.freedesktop.NetworkManager", bus);
QDBusMessage reply = dbus_interface.call("GetDevices");
// Make sure that result contains a reply.
if (reply.type() == QDBusMessage::ReplyMessage)
{
// If it is the reply we expect, it should be a QDBusArgument
if (reply.arguments().at(0).canConvert<QDBusArgument>())
{
// That contains an Array of QStrings holding our Device list.
QDBusArgument myArg =
reply.arguments().at(0).value<QDBusArgument>();
if (myArg.currentType() == QDBusArgument::ArrayType)
{
myArg.beginArray();
// Get memory for our resulting string list.
myList = new QStringList();
myList->clear(); // It should already be
clear, but just to be safe.
while (!myArg.atEnd())
{
QString myElement = qdbus_cast<QString>(myArg);
myList->append(myElement);
}
myArg.endArray();
}
}
}
return myList;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]