Fix some unrelated unit tests when !HAVE_OPENSSL_POLICY_MAPPING.
[wvstreams.git] / dbus / wvdbusmarshal_c.c
blob7cb231c89a145e404d4cc4bae77cf0ee6db0c678
1 /* -*- Mode: C++ -*-
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.
7 *
8 * We separate this into a separate file mostly so we don't mix DBus
9 * internal header files with other WvStreams header files.
10 */
11 #include <inttypes.h>
12 #define DBUS_COMPILATION
13 //#undef PACKAGE_BUGREPORT
14 //#undef PACKAGE_NAME
15 //#undef PACKAGE_STRING
16 //#undef PACKAGE_TARNAME
17 //#undef PACKAGE_VERSION
18 #undef interface
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;
28 DBusString tmp;
30 if (!_dbus_string_init (&tmp))
31 return 0;
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);
44 return 1;
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
54 DBusString buftmp;
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;
59 int have_message
60 = _dbus_header_have_message_untrusted(DBUS_MAXIMUM_MESSAGE_LENGTH,
61 &validity, &byte_order,
62 &fields_array_len,
63 &header_len,
64 &body_len,
65 &buftmp, 0,
66 len);
67 if (have_message || validity == DBUS_VALID)
68 return header_len + body_len;
69 else
70 return 0; // broken!
74 DBusMessage *wvdbus_demarshal(const void *buf, size_t len, size_t *used)
76 DBusMessageLoader *loader;
77 DBusString *lbuf;
78 DBusMessage *msg;
80 if (!buf)
82 *used = 0;
83 return NULL;
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
90 return NULL;
92 else if (real_len > len) // not enough data
94 *used = 0;
95 return NULL;
98 loader = _dbus_message_loader_new();
99 if (!loader)
100 return NULL;
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))
107 goto fail;
109 if (_dbus_message_loader_get_is_corrupted(loader))
110 goto fail;
112 msg = _dbus_message_loader_pop_message(loader);
113 if (!msg)
114 goto fail;
116 _dbus_message_loader_unref(loader);
117 *used = real_len;
118 return msg;
120 fail:
121 _dbus_message_loader_unref(loader);
122 *used = real_len ? real_len : len;
123 return NULL;