On Sun, 27 Nov 2011 12:58:27 +0000, Chris Mayo <cjm...@users.sourceforge.net> wrote: > On 27/11/11 12:51, Phil Thompson wrote: >> On Sun, 27 Nov 2011 12:47:09 +0000, Chris Mayo >> <cjm...@users.sourceforge.net> wrote: >>> With PyQt-x11-gpl-snapshot-4.9-e8284ed41e49, >>> sip-4.13.1-snapshot-3b44dc2f0efd and: >>> >>> bus = QtDBus.QDBusConnection.systemBus() >>> iface = QtDBus.QDBusInterface('org.freedesktop.UDisks', >>> '/org/freedesktop/UDisks', 'org.freedesktop.UDisks', bus) >>> >>> print(iface.call('EnumerateDeviceFiles').arguments()) >>> print(iface.call('EnumerateDevices').arguments()) >>> >>> >>> the end of the output is: >>> >>> 0000:00:1f.2-scsi-5:0:0:0-part2', '/dev/fd0']] >>> Traceback (most recent call last): >>> File "./objectpath.py", line 10, in<module> >>> print(iface.call('EnumerateDevices').arguments()) >>> TypeError: unable to convert a C++ 'QDBusArgument' instance to a Python >>> object >>> >>> >>> EnumerateDeviceFiles returns an Array of Strings, but EnumerateDevices >>> returns an Array of Object Paths >>> >> http://hal.freedesktop.org/docs/udisks/UDisks.html#UDisks.EnumerateDevices >>> >>> Python 3.2.2, Qt 4.7.4, udisks 1.0.4, dbus 1.4.16 on amd64 Linux >> >> Can you send me a complete test case? >> >> Thanks, >> Phil > > That was it! Nearly anyway, in full: > > #!/usr/bin/python > > from PyQt4 import QtDBus > > bus = QtDBus.QDBusConnection.systemBus() > iface = QtDBus.QDBusInterface('org.freedesktop.UDisks', > '/org/freedesktop/UDisks', 'org.freedesktop.UDisks', bus) > > print(iface.call('EnumerateDeviceFiles').arguments()) > print(iface.call('EnumerateDevices').arguments())
Tonight's snapshot will fix this. However there needs to be some discussion about the best way to (de)marshall arguments. I propose that marshalling of composite types uses QDBusArgument (as you do in C++). However I propose that demarshalling is done automatically, because... 1. It is Pythonic. 2. The QDBusArgument API will need changing in Python if it is to support both marshalling and demarshalling. There remains a question of how far to demarshall automatically. At the moment your example will return a Python list of QDBusObjectPath instances. As QDBusObjectPath is just a thin wrapper around QString should this be removed and just the string returned? The same would apply to QDBusSignature and QDBusVariant. Is it important to be able to distinguish between a return value that is a simple string and one that is an object path? As far as marshalling with QDBusArgument is concerned, I'm inclined to ignore the shift operators and to implement explicit writeInt32(), writeUInt32() etc methods - as happens with QDataStream. Thoughts? Phil _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt