diff options
Diffstat (limited to 'src/lib/common/gnunet_dbus_lib_push.c')
-rw-r--r-- | src/lib/common/gnunet_dbus_lib_push.c | 510 |
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 | |||
14 | static void | ||
15 | push_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 | |||
30 | void | ||
31 | GNUNET_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 | |||
40 | void | ||
41 | GNUNET_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 | |||
50 | void | ||
51 | GNUNET_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 | |||
60 | void | ||
61 | GNUNET_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 | |||
70 | void | ||
71 | GNUNET_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 | |||
80 | void | ||
81 | GNUNET_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 | |||
90 | void | ||
91 | GNUNET_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 | |||
100 | void | ||
101 | GNUNET_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 | |||
110 | void | ||
111 | GNUNET_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 | |||
120 | void | ||
121 | GNUNET_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 | |||
130 | void | ||
131 | GNUNET_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 | |||
142 | void | ||
143 | GNUNET_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 | |||
152 | void | ||
153 | GNUNET_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 | |||
162 | static void | ||
163 | push_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 | |||
179 | void | ||
180 | GNUNET_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 | |||
190 | void | ||
191 | GNUNET_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 | |||
200 | void | ||
201 | GNUNET_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 | |||
211 | void | ||
212 | GNUNET_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 | |||
221 | static void | ||
222 | push_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 | |||
236 | void | ||
237 | GNUNET_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 | |||
246 | void | ||
247 | GNUNET_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 | |||
256 | void | ||
257 | GNUNET_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 | |||
266 | void | ||
267 | GNUNET_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 | |||
276 | static void | ||
277 | push_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 | |||
297 | void | ||
298 | GNUNET_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 | |||
308 | void | ||
309 | GNUNET_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 | |||
319 | void | ||
320 | GNUNET_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 | |||
330 | void | ||
331 | GNUNET_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 | |||
341 | void | ||
342 | GNUNET_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 | |||
352 | void | ||
353 | GNUNET_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 | |||
363 | void | ||
364 | GNUNET_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 | |||
374 | void | ||
375 | GNUNET_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 | |||
385 | void | ||
386 | GNUNET_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 | |||
396 | void | ||
397 | GNUNET_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 | |||
428 | void | ||
429 | GNUNET_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 | |||
459 | void | ||
460 | GNUNET_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 | |||
488 | void | ||
489 | GNUNET_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 | |||
498 | void | ||
499 | GNUNET_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 | |||