use NULL value in load_path_suffix to NOT load any files
[oweals/gnunet.git] / src / json / json_generator.c
1 /*
2    This file is part of GNUnet
3    Copyright (C) 2014, 2015, 2016 GNUnet e.V.
4
5    GNUnet is free software: you can redistribute it and/or modify it
6    under the terms of the GNU Affero General Public License as published
7    by the Free Software Foundation, either version 3 of the License,
8    or (at your option) any later version.
9
10    GNUnet is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Affero General Public License for more details.
14
15    You should have received a copy of the GNU Affero General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 /**
21  * @file json/json_generator.c
22  * @brief helper functions for generating JSON from GNUnet data structures
23  * @author Sree Harsha Totakura <sreeharsha@totakura.in>
24  */
25 #include "platform.h"
26 #include "gnunet_util_lib.h"
27 #include "gnunet_json_lib.h"
28
29
30 /**
31  * Convert binary data to a JSON string
32  * with the base32crockford encoding.
33  *
34  * @param data binary data
35  * @param size size of @a data in bytes
36  * @return json string that encodes @a data
37  */
38 json_t *
39 GNUNET_JSON_from_data (const void *data,
40                        size_t size)
41 {
42   char *buf;
43   json_t *json;
44
45   buf = GNUNET_STRINGS_data_to_string_alloc (data, size);
46   json = json_string (buf);
47   GNUNET_free (buf);
48   return json;
49 }
50
51
52 /**
53  * Convert absolute timestamp to a json string.
54  *
55  * @param stamp the time stamp
56  * @return a json string with the timestamp in @a stamp
57  */
58 json_t *
59 GNUNET_JSON_from_time_abs (struct GNUNET_TIME_Absolute stamp)
60 {
61   json_t *j;
62
63   GNUNET_assert (GNUNET_OK ==
64                  GNUNET_TIME_round_abs (&stamp));
65
66   j = json_object ();
67
68   if (stamp.abs_value_us == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us)
69   {
70     json_object_set_new (j,
71                          "t_ms",
72                          json_string ("never"));
73     return j;
74   }
75   json_object_set_new (j,
76                        "t_ms",
77                        json_integer ((json_int_t) (stamp.abs_value_us / 1000LL)));
78   return j;
79 }
80
81
82 /**
83  * Convert absolute timestamp to a json string.
84  *
85  * @param stamp the time stamp
86  * @return a json string with the timestamp in @a stamp
87  */
88 json_t *
89 GNUNET_JSON_from_time_abs_nbo (struct GNUNET_TIME_AbsoluteNBO stamp)
90 {
91   return GNUNET_JSON_from_time_abs (GNUNET_TIME_absolute_ntoh (stamp));
92 }
93
94
95 /**
96  * Convert relative timestamp to a json string.
97  *
98  * @param stamp the time stamp
99  * @return a json string with the timestamp in @a stamp
100  */
101 json_t *
102 GNUNET_JSON_from_time_rel (struct GNUNET_TIME_Relative stamp)
103 {
104   json_t *j;
105
106   GNUNET_assert (GNUNET_OK ==
107                  GNUNET_TIME_round_rel (&stamp));
108
109   j = json_object ();
110
111   if (stamp.rel_value_us == GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us)
112   {
113     json_object_set_new (j,
114                          "d_ms",
115                          json_string ("forever"));
116     return j;
117   }
118   json_object_set_new (j,
119                        "d_ms",
120                        json_integer ((json_int_t) (stamp.rel_value_us / 1000LL)));
121   return j;
122 }
123
124
125 /**
126  * Convert RSA public key to JSON.
127  *
128  * @param pk public key to convert
129  * @return corresponding JSON encoding
130  */
131 json_t *
132 GNUNET_JSON_from_rsa_public_key (const struct GNUNET_CRYPTO_RsaPublicKey *pk)
133 {
134   char *buf;
135   size_t buf_len;
136   json_t *ret;
137
138   buf_len = GNUNET_CRYPTO_rsa_public_key_encode (pk,
139                                                  &buf);
140   ret = GNUNET_JSON_from_data (buf,
141                                buf_len);
142   GNUNET_free (buf);
143   return ret;
144 }
145
146
147 /**
148  * Convert RSA signature to JSON.
149  *
150  * @param sig signature to convert
151  * @return corresponding JSON encoding
152  */
153 json_t *
154 GNUNET_JSON_from_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *sig)
155 {
156   char *buf;
157   size_t buf_len;
158   json_t *ret;
159
160   buf_len = GNUNET_CRYPTO_rsa_signature_encode (sig,
161                                                 &buf);
162   ret = GNUNET_JSON_from_data (buf,
163                                buf_len);
164   GNUNET_free (buf);
165   return ret;
166 }
167
168
169 /**
170  * Convert GNS record to JSON.
171  *
172  * @param rname name of record
173  * @param rd record data
174  * @return corresponding JSON encoding
175  */
176 json_t *
177 GNUNET_JSON_from_gnsrecord (const char*rname,
178                             const struct GNUNET_GNSRECORD_Data *rd,
179                             unsigned int rd_count)
180 {
181   struct GNUNET_TIME_Absolute expiration_time;
182   const char *expiration_time_str;
183   const char *record_type_str;
184   char *value_str;
185   json_t *data;
186   json_t *record;
187   json_t *records;
188
189   data = json_object ();
190   json_object_set_new (data,
191                        "record_name",
192                        json_string (rname));
193   records = json_array ();
194   for (int i = 0; i < rd_count; i++)
195   {
196     value_str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
197                                                   rd[i].data,
198                                                   rd[i].data_size);
199     expiration_time = GNUNET_GNSRECORD_record_get_expiration_time (1, &rd[i]);
200     expiration_time_str = GNUNET_STRINGS_absolute_time_to_string (
201       expiration_time);
202     record_type_str = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
203     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
204                 "Packing %s %s %s %d\n",
205                 value_str, record_type_str, expiration_time_str, rd[i].flags);
206     record = json_pack ("{s:s,s:s,s:s,s:i}",
207                         "value",
208                         value_str,
209                         "record_type",
210                         record_type_str,
211                         "expiration_time",
212                         expiration_time_str,
213                         "flag",
214                         rd[i].flags);
215     GNUNET_assert (NULL != record);
216     GNUNET_free (value_str);
217     json_array_append_new (records, record);
218   }
219   json_object_set_new (data, "data", records);
220   return data;
221 }
222
223
224 /* End of json/json_generator.c */