2 * Worldvisions Weaver Software:
3 * Copyright (C) 2004-2006 Net Integration Technologies, Inc.
5 * Ugly routines that call directly into DBus internals for marshalling and
6 * demarshalling DBusMessage objects into data buffers.
8 * We separate this into a separate file mostly so we don't mix DBus
9 * internal header files with other WvStreams header files.
12 #define DBUS_COMPILATION
13 //#undef PACKAGE_BUGREPORT
15 //#undef PACKAGE_STRING
16 //#undef PACKAGE_TARNAME
17 //#undef PACKAGE_VERSION
19 #include <dbus/dbus.h>
20 #include <dbus-upstream/dbus/dbus-marshal-header.h>
21 #include <dbus-upstream/dbus/dbus-internals.h>
22 #include <dbus-upstream/dbus/dbus-string.h>
23 #include <dbus-upstream/dbus/dbus-message-private.h>
25 int wvdbus_marshal(DBusMessage
*msg
, char **cbuf
, size_t *len
)
27 static uint32_t global_serial
= 1000;
30 if (!_dbus_string_init (&tmp
))
33 if (!dbus_message_get_serial(msg
))
34 _dbus_message_set_serial(msg
, ++global_serial
);
36 _dbus_message_lock(msg
);
37 _dbus_string_copy(&msg
->header
.data
, 0, &tmp
, 0);
38 *len
= _dbus_string_get_length(&tmp
);
39 _dbus_string_copy(&msg
->body
, 0, &tmp
, *len
);
40 *len
= _dbus_string_get_length(&tmp
);
42 _dbus_string_steal_data(&tmp
, cbuf
);
43 _dbus_string_free(&tmp
);
48 size_t wvdbus_message_length(const void *buf
, size_t len
)
50 if (!buf
|| len
< DBUS_MINIMUM_HEADER_SIZE
)
51 return DBUS_MINIMUM_HEADER_SIZE
;
53 // doesn't copy - no need to free
55 _dbus_string_init_const_len(&buftmp
, (const char *)buf
, len
);
57 int byte_order
, fields_array_len
, header_len
, body_len
;
58 DBusValidity validity
= DBUS_VALID
;
60 = _dbus_header_have_message_untrusted(DBUS_MAXIMUM_MESSAGE_LENGTH
,
61 &validity
, &byte_order
,
67 if (have_message
|| validity
== DBUS_VALID
)
68 return header_len
+ body_len
;
74 DBusMessage
*wvdbus_demarshal(const void *buf
, size_t len
, size_t *used
)
76 DBusMessageLoader
*loader
;
86 size_t real_len
= wvdbus_message_length(buf
, len
);
87 if (real_len
== 0) // invalid message data
89 *used
= len
; // clear invalid crap - the best we can do
92 else if (real_len
> len
) // not enough data
98 loader
= _dbus_message_loader_new();
102 _dbus_message_loader_get_buffer(loader
, &lbuf
);
103 _dbus_string_append_len(lbuf
, (const char *)buf
, real_len
);
104 _dbus_message_loader_return_buffer(loader
, lbuf
, real_len
);
106 if (!_dbus_message_loader_queue_messages(loader
))
109 if (_dbus_message_loader_get_is_corrupted(loader
))
112 msg
= _dbus_message_loader_pop_message(loader
);
116 _dbus_message_loader_unref(loader
);
121 _dbus_message_loader_unref(loader
);
122 *used
= real_len
? real_len
: len
;