[Patch] Use Qt XML to decode config.xml files
Michael Sprauer
Michael at Sprauer.net
Mon Apr 4 08:21:54 PDT 2011
On Mon, 4 Apr 2011 15:00:28 +0100, Simon McVittie
<simon.mcvittie at collabora.co.uk> wrote:
> On Mon, 04 Apr 2011 at 15:14:54 +0200, Michael Sprauer wrote:
>> I wrote a patch to support QTs XML parsers to decode the config XML
>> in order to be not depended to an aditional external library.
>
> Please open a bug with severity "enhancement"?
>
> I'm not sure that this avoiding a library dependence is sufficient
> reason to
> support this, since it brings a few problems:
>
> * the libxml2 backend is already under-maintained/unmaintained and
> might not
> work; the Expat backend is the only one that's really tested
>
> * since QtXML and QtDBus are released together, using Qt to parse XML
> gives
> us a circular dependency: Qt contains QtDBus needs libdbus which
> needs QtXML
> which is part of Qt
>
> but if you're sure this is needed, perhaps other D-Bus maintainers
> could be
> convinced.
I'll post that "enhancement"...
>
>> Other (related) fixes:
>> Fix to FindQt4.cmake: Find Qt4 properly
>> dbus-bus.c: Applied the patch for windows (makes dbus-win.patch
>> superfluous)
>> dbus-message.c: avoid compiler warning
>
> Please open one or more bugs for these; otherwise they'll get lost. I
> think
> these three should all be considered separately, so, separate bugs
> please.
>
> Some drive-by reviews:
>
>> Subject: [PATCH] Added XML load using Qt4 XML library instead of
>> libxml2 or expat
>> Fix to FindQt4.cmake: Find Qt4 properly
>> dbus-bus.c: Applied patch for windows
>> dbus-message.c: avoid compiler warning
>
> This should be at least four git commits, since it makes at least
> four
> unrelated changes: if you find yourself writing "bullet points" in
> your
> commit message, it's usually a sign that you should have committed
> several
> patches.
OK.
>
>> diff --git a/bus/config-loader-QXml.cpp b/bus/config-loader-QXml.cpp
>> new file mode 100644
>> index 0000000..a520138
>> --- /dev/null
>> +++ b/bus/config-loader-QXml.cpp
>
> This is missing a copyright statement; please use the same license
> and style
> as the rest of the dbus code.
OK.
>
>> @@ -0,0 +1,191 @@
>> +#include "vld.h"
>
> What's vld.h and is it portable?
My mistake. This should be removed. It was an attempt to detect the
memory leaks...
>
>> +extern "C" void free_attributes(char **attribute_names, char
>> **attribute_values, int size)
>> +{
>> + for(int i=0;i<size;i++)
>> + {
>> + if (attribute_names[i] != NULL)
>> + dbus_free((void*)attribute_names[i]);
>
> This isn't anywhere near being in D-Bus indentation/spacing style;
> could you
> clean it up, please?
>
> Since this file is necessarily Qt-specific, I wouldn't necessarily
> object if
> you wanted to format it in kdelibs style
> (<http://techbase.kde.org/Policies/Kdelibs_Coding_Style>) instead of
> in
> D-Bus style.
Done.
>
>> diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
>> index e623e2d..70149e5 100644
>> --- a/cmake/CMakeLists.txt
>> +++ b/cmake/CMakeLists.txt
>> @@ -40,6 +40,10 @@ find_package(LibXml2)
>> find_package(LibExpat)
>> find_package(X11)
>>
>> +SET(QT_DONT_USE_QTGUI true)
>> +SET(QT_USE_QTXML true)
>> +find_package(Qt4 REQUIRED )
>
> This should only require QtXml if using Qt as the XML backend,
> surely?
True. Fixed...
>
>> Fix to FindQt4.cmake: Find Qt4 properly
>
> Do you actually mean "update from some third-party location"? If you
> do,
> please say where you got it from, and ideally also which revision
> number or
> commit ID you're updating to.
>
> Or, if these changes are your own work, please explain in the body of
> the
> commit message what was wrong with the previous code or how you fixed
> it.
That came out of my head. I added QtXmlPatterns and thought of using
it.
And I found the other line somewhere with google, while I was searching
for the correct way to find qt. To source was something like this:
http://quarkplayer.googlecode.com/svn-history/r1387/trunk/cmake/modules/FindQt4.cmake
>
>> diff --git a/dbus/dbus-bus.c b/dbus/dbus-bus.c
>> index 92ec20e..a59afe1 100644
>> --- a/dbus/dbus-bus.c
>> +++ b/dbus/dbus-bus.c
>> @@ -402,8 +402,10 @@
>> _dbus_bus_notify_shared_connection_disconnected_unlocked
>> (DBusConnection *connec
>> {
>> int i;
>>
>> +#if !defined(DBUS_WIN) && !defined(DBUS_WINCE)
>> + // qt example pong says "QMutex::lock: Deadlock detected"
>> _DBUS_LOCK (bus);
>> -
>> +#endif
>
> Either the code in this function should be protected by a lock, or it
> shouldn't; there should be no such thing as "locked, but only if
> you're
> on Windows".
>
> If you don't know why you're getting that warning, please open a bug
> with a
> backtrace from each thread, so we can work out which pair of locks
> are
> deadlocking each other.
>
> That function is called with the DBusConnection's lock held, so I
> suspect that
> the answer is that the dbus-bus lock and the DBusConnection lock can
> be taken
> in either order. That would be a D-Bus bug; you're just hiding the
> warning that
> illustrates that a bug exists.
This did not come out of my head. It seems to be necessary as it is in
the patch file:
http://cgit.freedesktop.org/dbus/dbus/commit/?id=51e88a912a893ffc45298cc0ddca3b556193570f
I just applied the patch. Don't know if this is needed?!
>
>> static DBusConnection *
>> diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c
>> index d053559..11a2eb1 100644
>> --- a/dbus/dbus-message.c
>> +++ b/dbus/dbus-message.c
>> @@ -3839,6 +3839,7 @@
>> _dbus_message_loader_get_unix_fds(DBusMessageLoader *loader,
>> return TRUE;
>> #else
>> _dbus_assert_not_reached("Platform doesn't support unix fd
>> passing");
>> + return FALSE;
>> #endif
>
> This will probably *cause* warnings under gcc, because
> _dbus_assert_not_reached can't return (like abort() or exit()). The
> "return FALSE" can't actually be reached, and gcc knows that via the
> _DBUS_GNUC_NORETURN annotation.
>
> According to some Googling, it seems MSVC++ can support this via
> __declspec(noreturn). Does __declspec(noreturn) have to appear like
> this:
>
> __declspec(noreturn) void exit (int code);
>
> or can it be used like this?
>
> void exit (int code) __declspec(noreturn);
>
> If it can be used after the declaration, we can define
> _DBUS_GNUC_NORETURN
> to __declspec(noreturn) on MSVC++; if it has to be used before, we
> can
> probably still do that, but we'd have to move it to the beginning of
> the
> declaration everywhere it's used.
I'll investigate this.
Thank you for your detailed answer.
Michael
More information about the dbus
mailing list