Announcing the merge of the kdelibs4-dbus branch

Thiago Macieira thiago at kde.org
Tue May 30 13:50:30 BST 2006


Thiago Macieira wrote:
>I'll prepare an email with the porting highlights. But, right now, you
> can refer to the wiki
>(http://wiki.kde.org/tiki-index.php?page=Porting%20KDELibs%20to%20D-Bus)
>for porting instructions.

Ok, as promised, the highlights needed for porting:

1) you need the CVS version of D-BUS library. The one that your 
distribution installed, even if it's 0.61, probably won't be enough to 
compile QtDBus. Apparently the D-BUS developers forgot to install one 
header (dbus-signature.h) for a long time and no one noticed.

There's also the issue that a bug in the dbus-daemon program prevented 
calls with interface="" from being delivered. So if you want to use KDE 
programs that make calls with empty interface names, you need to upgrade 
your dbus daemon to the CVS version as well.

2) you need the Subversion or CVS version of QtDBus. It's official home is 
now in trunk/kdesupport in our Subversion server, with CMake as its 
primary build system. I merged all changes yesterday to the 
freedesktop.org CVS, so what you compile with --enable-qt in the dbus CVS 
will be the same code as our Subversion repository.

3) QtDBus has lot of debugging enabled by default. So you see every 
message sent or received being dumped to your stdout. If you want a quiet 
build, you need to add -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM to the 
preprocessor flags.

4) There is no Windows port of libdbus-1 yet -- at least, nothing that I 
have seen. Ralf can be more specific about this, but unless the port is 
made working by tomorrow, KDE on Win32 will stop building tomorrow.

5) QtDBus finds libdbus-1 through pkg-config and KDE finds QtDBus through 
pkg-config as well. The QtDBus .pc file contains dependency info on Qt, 
so Qt must be found using pkg-config as well. Make sure your 
PKG_CONFIG_PATH contains $QTDIR/lib then, as well as wherever you 
installed D-BUS and QtDBus to.

The buildsystem guys can probably change my FindQtDBus.cmake script if 
they want to, in order to find the library in another way.

6) Every module has to add to their top-level CMakeLists.txt:
	add_definitions( ${QDBUS_DEFINITIONS} )

7) The proper way of including the QtDBus classes is through:
	#include <dbus/qdbus.h>
This is the D-BUS way of doing things. Now that we're separating from the 
core and moving to kdesupport, I'll probably provide a more Qt-way of 
including (i.e., #include <QtDBus/QDBusInterface> etc.)

8) The code generator program equivalent to dcopidl2cpp is called 
dbusidl2cpp, but that's a misnomer: it does not read IDL code. It reads 
XML and outputs C++. The program could use some improvement in its usage, 
but basically, it boils down to:
	dcopidl2cpp -m -a myclassadaptor -p myclassinterface org.kde.MyClass.xml

This will generate files called myclassadaptor.cpp, myclassadaptor.h, 
myclassinterface.cpp and myclassinterface.h (the -m option is used to add 
a #include "xxxx.moc" to the bottom of the .cpp files). The Adaptor files 
are meant to be changed by the developer, so they should be checked in to 
Subversion. The interface ones are not.

Since I have no working CMake macro to generate the interface files during 
compilation, I and the others have been committing the interface files to 
Subversion as well. The qt-dbus/examples directory contains one attempt 
at such macro, but if you watch closely, you'll notice that the interface 
file is unnecessarily built at every "make".

9) The .xml file should either be written by hand or, as an alternative, 
you can use the dbuscpp2xml tool. This tool parses a .h that contains one 
or more QObject-derived classes and prints a XML representation of the 
class' signals, slots and properties.

In fact, you may notice that if you run the XML through dbusidl2cpp again, 
the Adaptor class that is generated is quite similar to the original 
class.

I thought of writing a real IDL parser at this point, but I figured that I 
could use one parser I know everyone to have installed already: moc. So 
that's why it reads C++ code.

The GUI tool to build interfaces is in qt-dbus/builder, but it's not 
complete yet. It loads interfaces, but it doesn't let you modify any yet.

10) For an interface called org.kde.Phonon.MixerIface (one example I found 
in Phonon), the dbusidl2cpp will generate the following class names:

MixerIfaceAdaptor - the adaptor
OrgKdePhononMixerIfaceInterface - the interface
org::kde::Phonon::MixerIface - typedef to OrgKdePhononMixerIfaceInterface

none of those classes are exported or meant to be exported.

So don't name your interfaces with something ending in Iface. It just 
makes the name uglier. (It's my fault for choosing that name for a Phonon 
existing class)

Most of the methods in the interface class are inline, except for the 
constructor and the destructor. As I noted on the wiki, interfaces are 
QObjects, so they are way more expensive to create than DCOPRef. If you 
can and if you make repeated calls to the same remote object, cache the 
pointer in your class. If you cannot do that, then at least use a 
non-empty interface name when creating a QDBusInterfacePtr.

11) All applications should properly set the organizationDomain and 
applicationName properties in QCoreApplication. We should modify 
KApplication and KAboutData to contain that information.

12) Interface contents cannot change during the session of one 
application. This means you cannot have one application exporting 
org.kde.Interface with one set of functions and another application 
exporting the same interface with another set of functions.

Interfaces are a contract that you make with 3rd party applications. 
Therefore, interfaces are subject to "binary compatibility" guidelines 
once released: you may not remove methods/signals/properties from 
interfaces, you may not change the signature of existing methods/signals 
or the type of properties. In special, if your interface is meant to 
interoperate with other bindings (Java bindings, Python bindings, glib 
bindings), you should not create overloads either.

However, I think we should clearly mark which interfaces are public (i.e., 
script-writers and other, external applications can use) and which ones 
are meant for our own, internal use. For the latter ones, we could "break 
binary compatibility" as often as we'd like.

-- 
Thiago Macieira  -  thiago (AT) macieira.info - thiago (AT) kde.org
  thiago.macieira (AT) trolltech.com     Trolltech AS
    GPG: 0x6EF45358                   |  Sandakerveien 116,
    E067 918B B660 DBD1 105C          |  NO-0402
    966C 33F5 F005 6EF4 5358          |  Oslo, Norway
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 191 bytes
Desc: not available
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20060530/5f97c5a9/attachment.sig>


More information about the kde-core-devel mailing list