dbus_message_set/get_data usage
Brosseau, Vincent
vincent.brosseau at bruker.fr
Thu Dec 12 00:07:40 PST 2013
Thank you for your help, Simon.
Now I understand that I can't attach data to the message in this way... But I'm not sure to understand what are dbus_message_set/get_data used for, exactly (your example with Python doesn't help me, sorry)...
Anyway, I have another question about attaching parameters.
When I use dbus_message_iter_init_append() and then dbus_message_iter_append_basic(), the latter needs a (void *)parameter as the third argument. If I do this :
void attachParameters( ParameterSet param ) // where ParameterSet is a structure
{
DBusMessageIter dbusArg;
...
dbus_message_iter_init_append( myMessage, &dbusArg );
// param contains a field with the number of string values to attach => count
// and an array of string values => value[MAX_COUNT]
for( int a = 0; a < param.count; a++ )
{
dbus_message_iter_append_basic( &dbusArg, DBUS_TYPE_STRING, ¶m.value[a] );
...
}
}
This code leads to a "Segmentation fault" : the parameter param.value[a] can't be append.
But if I modify the code in the loop like this :
const char *arg = param.value[a];
dbus_message_iter_append_basic( &dbusArg, DBUS_TYPE_STRING, &arg );
...
It works. Why ?
-----Message d'origine-----
De : dbus-bounces at lists.freedesktop.org [mailto:dbus-bounces at lists.freedesktop.org] De la part de Simon McVittie
Envoyé : mercredi 11 décembre 2013 19:22
À : dbus at lists.freedesktop.org
Objet : Re: dbus_message_set/get_data usage
On 11/12/13 14:37, Brosseau, Vincent wrote:
> Then I can "attach" any type of data to the message (via a pointer),
> as far as I understand.
This does not attach arbitrary data to the actual D-Bus message, only to the DBusMessage C struct that represents it. For instance, language bindings like dbus-python could use this as a way to link the C DBusMessage to the Python dbus.lowlevel.Message.
When the sender sends a DBusMessage, it serializes it into some bytes and pushes it into the stream. When the recipient receives those bytes, it deserializes it and constructs a new DBusMessage, with its own independent set of data slots. If the recipient was not written using libdbus, it might deserialize the message into some other representation, like a GDBusMessage, instead; the principle is the same but the implementation is different.
If you want to send data in the D-Bus "wire protocol" to be received by the recipient, it has to be represented in the message somehow - for anything not represented in the header, that means "in the message's arguments".
(Think about how/whether your interpretation could possibly work? The pointer is only valid within the sending application's address space; D-Bus doesn't know what your pointer points to, how to serialize it, or whether it can even be serialized.)
Regards,
S
_______________________________________________
dbus mailing list
dbus at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dbus
More information about the dbus
mailing list