[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    Re: [PyQt] QtDBus: Unable to convert Array of Object Paths
From:       Phil Thompson <phil () riverbankcomputing ! com>
Date:       2011-11-30 16:37:59
Message-ID: 26fc0ac4d7500dfe17f43d5f590bd8cb () localhost
[Download RAW message or body]

On Sun, 27 Nov 2011 12:58:27 +0000, Chris Mayo
<cjmayo@users.sourceforge.net> wrote:
> On 27/11/11 12:51, Phil Thompson wrote:
>> On Sun, 27 Nov 2011 12:47:09 +0000, Chris Mayo
>> <cjmayo@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
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic