aboutsummaryrefslogtreecommitdiff
path: root/src/lib/gnsrecord/gnunet_gnsrecord_dbus_lib_push.c
blob: 00dddc0630afa16623cca0d89aa2bffef862b882 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "config.h"

#include <gnunet/platform.h>

#include "gnunet_gnsrecord_dbus_lib.h"
#include "gnunet_time_dbus_lib.h"

#define LOG(kind, ...) GNUNET_log_from(kind, "gnsrecord-dbus-push", __VA_ARGS__)

void
GNUNET_GNSRECORD_DBUS_push_type (
    DBusMessage *message,
    DBusMessageIter *iter,
    const uint32_t *value)
{
  LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing GNSRECORD type\n");
  DBusMessageIter iter_sub;
  if (GNUNET_DBUS_message_get_pretty (message))
  {
    GNUNET_DBUS_push_open_variant (message, iter, &iter_sub, GNUNET_DBUS_SIGNATURE_STRING);
    const char *stringified = GNUNET_GNSRECORD_number_to_typename (*value);
    GNUNET_DBUS_push_string (message, &iter_sub, &stringified);
    GNUNET_DBUS_push_close_variant (message, iter, &iter_sub);
  }
  else
  {
    GNUNET_DBUS_push_open_variant (message, iter, &iter_sub, GNUNET_DBUS_SIGNATURE_UINT32);
    GNUNET_DBUS_push_uint32 (message, &iter_sub, value);
    GNUNET_DBUS_push_close_variant (message, iter, &iter_sub);
  }
};

void
GNUNET_GNSRECORD_DBUS_push_flags (
    DBusMessage *message,
    DBusMessageIter *iter,
    const enum GNUNET_GNSRECORD_Flags *value)
{
  LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing GNUNET_GNSRECORD_Flags\n");
  GNUNET_DBUS_push_bitfield (message, iter, (const int *)value, GNUNET_GNSRECORD_DBUS_describe_flags ());
};

void
GNUNET_GNSRECORD_DBUS_push_data (
    DBusMessage *message,
    DBusMessageIter *iter,
    const struct GNUNET_GNSRECORD_Data *value)
{
  LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing GNUNET_GNSRECORD_Data\n");
  DBusMessageIter iter_sub;
  DBusMessageIter iter_sub_sub;

  GNUNET_DBUS_push_open_struct (message, iter, &iter_sub);
  GNUNET_GNSRECORD_DBUS_push_type (message, &iter_sub, &value->record_type);
  GNUNET_GNSRECORD_DBUS_push_flags (message, &iter_sub, &value->flags);

  if (GNUNET_DBUS_message_get_pretty (message))
  {
    GNUNET_DBUS_push_open_variant (message, &iter_sub, &iter_sub_sub, GNUNET_DBUS_SIGNATURE_STRING);
    char *stringified = GNUNET_GNSRECORD_value_to_string (value->record_type, value->data, value->data_size);
    const char *stringified_const = stringified;
    GNUNET_DBUS_push_string (message, &iter_sub_sub, &stringified_const);
    GNUNET_free (stringified);
    GNUNET_DBUS_push_close_variant (message, &iter_sub, &iter_sub_sub);
  }
  else
  {
    GNUNET_DBUS_push_open_variant (message, &iter_sub, &iter_sub_sub, GNUNET_DBUS_SIGNATURE_ARRAY (GNUNET_DBUS_SIGNATURE_BYTE));
    GNUNET_DBUS_push_byte_array (message, &iter_sub_sub, (const unsigned char *)value->data, value->data_size);
    GNUNET_DBUS_push_close_variant (message, &iter_sub, &iter_sub_sub);
  };
  
  if (value->flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)
  {
    struct GNUNET_TIME_Relative expiration_time;
    expiration_time.rel_value_us = value->expiration_time;
    GNUNET_TIME_DBUS_push_relative (message, &iter_sub, &expiration_time);
  }
  else
  {
    struct GNUNET_TIME_Absolute expiration_time;
    expiration_time.abs_value_us = value->expiration_time;
    GNUNET_TIME_DBUS_push_absolute (message, &iter_sub, &expiration_time);
  };
  GNUNET_DBUS_push_close_struct (message, iter, &iter_sub);
}