aboutsummaryrefslogtreecommitdiff
path: root/src/lib/common/gnunet_dbus_lib_push.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/common/gnunet_dbus_lib_push.c')
-rw-r--r--src/lib/common/gnunet_dbus_lib_push.c510
1 files changed, 510 insertions, 0 deletions
diff --git a/src/lib/common/gnunet_dbus_lib_push.c b/src/lib/common/gnunet_dbus_lib_push.c
new file mode 100644
index 0000000..1cb455e
--- /dev/null
+++ b/src/lib/common/gnunet_dbus_lib_push.c
@@ -0,0 +1,510 @@
1#include "config.h"
2
3#include <stdbool.h>
4
5#include <gnunet/platform.h>
6#include <gnunet/gnunet_common.h>
7#include <gnunet/gnunet_strings_lib.h>
8
9#include "gnunet_dbus_lib.h"
10#include "gnunet_crypto_dbus_lib.h"
11
12#define LOG(kind, ...) GNUNET_log_from (kind, "dbus-push", __VA_ARGS__)
13
14static void
15push_basic (
16 DBusMessage *message,
17 DBusMessageIter *iter,
18 int type,
19 const void *value)
20{
21 (void)message;
22 bool success = dbus_message_iter_append_basic (iter, type, value);
23 if (! success)
24 {
25 LOG (GNUNET_ERROR_TYPE_ERROR, "Ran out of memory in dbus_message_iter_append_basic\n");
26 GNUNET_abort_ ();
27 }
28}
29
30void
31GNUNET_DBUS_push_byte (
32 DBusMessage *message,
33 DBusMessageIter *iter,
34 const unsigned char *value)
35{
36 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing byte\n");
37 push_basic (message, iter, DBUS_TYPE_BYTE, value);
38}
39
40void
41GNUNET_DBUS_push_boolean (
42 DBusMessage *message,
43 DBusMessageIter *iter,
44 const dbus_bool_t *value)
45{
46 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing boolean\n");
47 push_basic (message, iter, DBUS_TYPE_BOOLEAN, value);
48}
49
50void
51GNUNET_DBUS_push_int16 (
52 DBusMessage *message,
53 DBusMessageIter *iter,
54 const dbus_int16_t *value)
55{
56 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing int16\n");
57 push_basic (message, iter, DBUS_TYPE_INT16, value);
58}
59
60void
61GNUNET_DBUS_push_uint16 (
62 DBusMessage *message,
63 DBusMessageIter *iter,
64 const dbus_uint16_t *value)
65{
66 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing uint16\n");
67 push_basic (message, iter, DBUS_TYPE_UINT16, value);
68}
69
70void
71GNUNET_DBUS_push_int32 (
72 DBusMessage *message,
73 DBusMessageIter *iter,
74 const dbus_int32_t *value)
75{
76 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing int32\n");
77 push_basic (message, iter, DBUS_TYPE_INT32, value);
78}
79
80void
81GNUNET_DBUS_push_uint32 (
82 DBusMessage *message,
83 DBusMessageIter *iter,
84 const dbus_uint32_t *value)
85{
86 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing uint32\n");
87 push_basic (message, iter, DBUS_TYPE_UINT32, value);
88}
89
90void
91GNUNET_DBUS_push_int64 (
92 DBusMessage *message,
93 DBusMessageIter *iter,
94 const dbus_int64_t *value)
95{
96 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing int64\n");
97 push_basic (message, iter, DBUS_TYPE_INT64, value);
98}
99
100void
101GNUNET_DBUS_push_uint64 (
102 DBusMessage *message,
103 DBusMessageIter *iter,
104 const dbus_uint64_t *value)
105{
106 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing uint64\n");
107 push_basic (message, iter, DBUS_TYPE_UINT64, value);
108}
109
110void
111GNUNET_DBUS_push_double (
112 DBusMessage *message,
113 DBusMessageIter *iter,
114 const double *value)
115{
116 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing double\n");
117 push_basic (message, iter, DBUS_TYPE_DOUBLE, value);
118}
119
120void
121GNUNET_DBUS_push_string (
122 DBusMessage *message,
123 DBusMessageIter *iter,
124 const char *const *value)
125{
126 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing string\n");
127 push_basic (message, iter, DBUS_TYPE_STRING, value);
128}
129
130void
131GNUNET_DBUS_push_object_path (
132 DBusMessage *message,
133 DBusMessageIter *iter,
134 const struct GNUNET_DBUS_ObjectPath *path)
135{
136 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing object path\n");
137 char *path_as_string = GNUNET_DBUS_object_path_to_string (path);
138 push_basic (message, iter, DBUS_TYPE_OBJECT_PATH, &path_as_string);
139 GNUNET_free (path_as_string);
140}
141
142void
143GNUNET_DBUS_push_signature (
144 DBusMessage *message,
145 DBusMessageIter *iter,
146 const char *const *value)
147{
148 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing signature\n");
149 push_basic (message, iter, DBUS_TYPE_SIGNATURE, value);
150}
151
152void
153GNUNET_DBUS_push_unix_fd (
154 DBusMessage *message,
155 DBusMessageIter *iter,
156 const int *value)
157{
158 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing unix fd\n");
159 push_basic (message, iter, DBUS_TYPE_UNIX_FD, value);
160}
161
162static void
163push_open_container (
164 DBusMessage *message,
165 DBusMessageIter *iter,
166 DBusMessageIter *iter_sub,
167 int type,
168 const char *signature)
169{
170 (void)message;
171 bool success = dbus_message_iter_open_container (iter, type, signature, iter_sub);
172 if (! success)
173 {
174 LOG (GNUNET_ERROR_TYPE_ERROR, "Ran out of memory in dbus_message_iter_open_container\n");
175 GNUNET_abort_ ();
176 }
177}
178
179void
180GNUNET_DBUS_push_open_array (
181 DBusMessage *message,
182 DBusMessageIter *iter,
183 DBusMessageIter *iter_sub,
184 const char *signature)
185{
186 LOG (GNUNET_ERROR_TYPE_DEBUG, "Opening array\n");
187 push_open_container (message, iter, iter_sub, DBUS_TYPE_ARRAY, signature);
188}
189
190void
191GNUNET_DBUS_push_open_struct (
192 DBusMessage *message,
193 DBusMessageIter *iter,
194 DBusMessageIter *iter_sub)
195{
196 LOG (GNUNET_ERROR_TYPE_DEBUG, "Opening struct\n");
197 push_open_container (message, iter, iter_sub, DBUS_TYPE_STRUCT, NULL);
198}
199
200void
201GNUNET_DBUS_push_open_variant (
202 DBusMessage *message,
203 DBusMessageIter *iter,
204 DBusMessageIter *iter_sub,
205 const char *signature)
206{
207 LOG (GNUNET_ERROR_TYPE_DEBUG, "Opening variant\n");
208 push_open_container (message, iter, iter_sub, DBUS_TYPE_VARIANT, signature);
209}
210
211void
212GNUNET_DBUS_push_open_dict_entry (
213 DBusMessage *message,
214 DBusMessageIter *iter,
215 DBusMessageIter *iter_sub)
216{
217 LOG (GNUNET_ERROR_TYPE_DEBUG, "Opening dict entry\n");
218 push_open_container (message, iter, iter_sub, DBUS_TYPE_DICT_ENTRY, NULL);
219}
220
221static void
222push_close_container (
223 DBusMessage *message,
224 DBusMessageIter *iter,
225 DBusMessageIter *iter_sub)
226{
227 (void)message;
228 bool success = dbus_message_iter_close_container (iter, iter_sub);
229 if (! success)
230 {
231 LOG (GNUNET_ERROR_TYPE_ERROR, "Ran out of memory in dbus_message_iter_close_container\n");
232 GNUNET_abort_ ();
233 }
234}
235
236void
237GNUNET_DBUS_push_close_array (
238 DBusMessage *message,
239 DBusMessageIter *iter,
240 DBusMessageIter *iter_sub)
241{
242 LOG (GNUNET_ERROR_TYPE_DEBUG, "Closing array\n");
243 push_close_container (message, iter, iter_sub);
244}
245
246void
247GNUNET_DBUS_push_close_struct (
248 DBusMessage *message,
249 DBusMessageIter *iter,
250 DBusMessageIter *iter_sub)
251{
252 LOG (GNUNET_ERROR_TYPE_DEBUG, "Closing struct\n");
253 push_close_container (message, iter, iter_sub);
254}
255
256void
257GNUNET_DBUS_push_close_variant (
258 DBusMessage *message,
259 DBusMessageIter *iter,
260 DBusMessageIter *iter_sub)
261{
262 LOG (GNUNET_ERROR_TYPE_DEBUG, "Closing variant\n");
263 push_close_container (message, iter, iter_sub);
264}
265
266void
267GNUNET_DBUS_push_close_dict_entry (
268 DBusMessage *message,
269 DBusMessageIter *iter,
270 DBusMessageIter *iter_sub)
271{
272 LOG (GNUNET_ERROR_TYPE_DEBUG, "Closing dict entry\n");
273 push_close_container (message, iter, iter_sub);
274}
275
276static void
277push_fixed_array (
278 DBusMessage *message,
279 DBusMessageIter *iter,
280 int type,
281 const void *value,
282 size_t value_count)
283{
284 char sig[2] = { (char)type, '\0' };
285 DBusMessageIter iter_sub;
286
287 GNUNET_DBUS_push_open_array (message, iter, &iter_sub, sig);
288 bool success = dbus_message_iter_append_fixed_array (&iter_sub, type, value, (int)value_count);
289 if (! success)
290 {
291 LOG (GNUNET_ERROR_TYPE_ERROR, "Ran out of memory in dbus_message_iter_push_fixed_array\n");
292 GNUNET_abort_ ();
293 }
294 GNUNET_DBUS_push_close_array (message, iter, &iter_sub);
295}
296
297void
298GNUNET_DBUS_push_byte_array (
299 DBusMessage *message,
300 DBusMessageIter *iter,
301 const unsigned char *value,
302 size_t value_count)
303{
304 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing byte array\n");
305 push_fixed_array (message, iter, DBUS_TYPE_BYTE, &value, value_count);
306}
307
308void
309GNUNET_DBUS_push_boolean_array (
310 DBusMessage *message,
311 DBusMessageIter *iter,
312 const dbus_bool_t *value,
313 size_t value_count)
314{
315 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing boolean array\n");
316 push_fixed_array (message, iter, DBUS_TYPE_BOOLEAN, &value, value_count);
317}
318
319void
320GNUNET_DBUS_push_int16_array (
321 DBusMessage *message,
322 DBusMessageIter *iter,
323 const dbus_int16_t *value,
324 size_t value_count)
325{
326 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing int16 array\n");
327 push_fixed_array (message, iter, DBUS_TYPE_INT16, &value, value_count);
328}
329
330void
331GNUNET_DBUS_push_uint16_array (
332 DBusMessage *message,
333 DBusMessageIter *iter,
334 const dbus_uint16_t *value,
335 size_t value_count)
336{
337 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing uint16 array\n");
338 push_fixed_array (message, iter, DBUS_TYPE_UINT16, &value, value_count);
339}
340
341void
342GNUNET_DBUS_push_int32_array (
343 DBusMessage *message,
344 DBusMessageIter *iter,
345 const unsigned char *value,
346 size_t value_count)
347{
348 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing int32 array\n");
349 push_fixed_array (message, iter, DBUS_TYPE_INT32, &value, value_count);
350}
351
352void
353GNUNET_DBUS_push_uint32_array (
354 DBusMessage *message,
355 DBusMessageIter *iter,
356 const unsigned char *value,
357 size_t value_count)
358{
359 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing uint32 array\n");
360 push_fixed_array (message, iter, DBUS_TYPE_UINT32, &value, value_count);
361}
362
363void
364GNUNET_DBUS_push_int64_array (
365 DBusMessage *message,
366 DBusMessageIter *iter,
367 const unsigned char *value,
368 size_t value_count)
369{
370 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing int64 array\n");
371 push_fixed_array (message, iter, DBUS_TYPE_INT64, &value, value_count);
372}
373
374void
375GNUNET_DBUS_push_uint64_array (
376 DBusMessage *message,
377 DBusMessageIter *iter,
378 const unsigned char *value,
379 size_t value_count)
380{
381 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing uint64 array\n");
382 push_fixed_array (message, iter, DBUS_TYPE_UINT64, &value, value_count);
383}
384
385void
386GNUNET_DBUS_push_double_array (
387 DBusMessage *message,
388 DBusMessageIter *iter,
389 const unsigned char *value,
390 size_t value_count)
391{
392 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing double array\n");
393 push_fixed_array (message, iter, DBUS_TYPE_DOUBLE, &value, value_count);
394}
395
396void
397GNUNET_DBUS_push_bitfield (
398 DBusMessage *message,
399 DBusMessageIter *iter,
400 const int *value,
401 const struct GNUNET_DBUS_StringEnumPair *fields)
402{
403 DBusMessageIter iter_sub;
404 if (GNUNET_DBUS_message_get_pretty (message))
405 {
406 DBusMessageIter iter_sub_sub;
407
408 GNUNET_DBUS_push_open_variant (message, iter, &iter_sub, GNUNET_DBUS_SIGNATURE_ARRAY (GNUNET_DBUS_SIGNATURE_STRING));
409 GNUNET_DBUS_push_open_array (message, &iter_sub, &iter_sub_sub, GNUNET_DBUS_SIGNATURE_STRING);
410 const struct GNUNET_DBUS_StringEnumPair *field;
411 for (field = fields; field->name; field++)
412 {
413 if ((*value & field->value) == field->value)
414 GNUNET_DBUS_push_string (message, &iter_sub_sub, &field->name);
415 };
416 GNUNET_DBUS_push_close_array (message, &iter_sub, &iter_sub_sub);
417 GNUNET_DBUS_push_close_variant (message, iter, &iter_sub);
418 }
419 else
420 {
421 uint32_t push_value = (uint32_t)*value;
422 GNUNET_DBUS_push_open_variant (message, iter, &iter_sub, GNUNET_DBUS_SIGNATURE_UINT32);
423 GNUNET_DBUS_push_uint32 (message, &iter_sub, &push_value);
424 GNUNET_DBUS_push_close_variant (message, iter, &iter_sub);
425 };
426};
427
428void
429GNUNET_DBUS_push_enum (
430 DBusMessage *message,
431 DBusMessageIter *iter,
432 const int *value,
433 const struct GNUNET_DBUS_StringEnumPair *names)
434{
435 DBusMessageIter iter_sub;
436 if (GNUNET_DBUS_message_get_pretty (message))
437 {
438 GNUNET_DBUS_push_open_variant (message, iter, &iter_sub, GNUNET_DBUS_SIGNATURE_STRING);
439 const struct GNUNET_DBUS_StringEnumPair *name;
440 for (name = names; name->name; name++)
441 {
442 if (name->value == *value)
443 {
444 GNUNET_DBUS_push_string (message, &iter_sub, &name->name);
445 break;
446 }
447 }
448 GNUNET_DBUS_push_close_variant (message, iter, &iter_sub);
449 }
450 else
451 {
452 uint32_t push_value = (uint32_t)*value;
453 GNUNET_DBUS_push_open_variant (message, iter, &iter_sub, GNUNET_DBUS_SIGNATURE_UINT32);
454 GNUNET_DBUS_push_uint32 (message, &iter_sub, &push_value);
455 GNUNET_DBUS_push_close_variant (message, iter, &iter_sub);
456 };
457};
458
459void
460GNUNET_DBUS_push_data (
461 DBusMessage *message,
462 DBusMessageIter *iter,
463 const void *value,
464 size_t value_size)
465{
466 DBusMessageIter iter_sub;
467 if (GNUNET_DBUS_message_get_pretty (message))
468 {
469 size_t string_size = (value_size * 8 + 4) / 5 + 1;
470 char *string = GNUNET_malloc (string_size);
471 char *end = GNUNET_STRINGS_data_to_string (value, value_size, string, string_size);
472 *end = '\0';
473 const char *string_const = string;
474
475 GNUNET_DBUS_push_open_variant (message, iter, &iter_sub, GNUNET_DBUS_SIGNATURE_STRING);
476 GNUNET_DBUS_push_string (message, &iter_sub, &string_const);
477 GNUNET_DBUS_push_close_variant (message, iter, &iter_sub);
478 GNUNET_free (string);
479 }
480 else
481 {
482 GNUNET_DBUS_push_open_variant (message, iter, &iter_sub, GNUNET_DBUS_SIGNATURE_ARRAY (GNUNET_DBUS_SIGNATURE_BYTE));
483 GNUNET_DBUS_push_byte_array (message, &iter_sub, value, value_size);
484 GNUNET_DBUS_push_close_variant (message, iter, &iter_sub);
485 };
486}
487
488void
489GNUNET_DBUS_push_hashcode (
490 DBusMessage *message,
491 DBusMessageIter *iter,
492 const struct GNUNET_HashCode *value)
493{
494 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing GNUNET_HashCode\n");
495 GNUNET_DBUS_push_data (message, iter, value->bits, sizeof (value->bits));
496}
497
498void
499GNUNET_DBUS_push_peer_identity (
500 DBusMessage *message,
501 DBusMessageIter *iter,
502 const struct GNUNET_PeerIdentity *value)
503{
504 LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing GNUNET_PeerIdentity\n");
505 DBusMessageIter iter_sub;
506 GNUNET_DBUS_push_open_struct (message, iter, &iter_sub);
507 GNUNET_CRYPTO_DBUS_push_eddsa_public_key (message, &iter_sub, &value->public_key);
508 GNUNET_DBUS_push_close_struct (message, iter, &iter_sub);
509}
510