GNUnet  0.10.x
gnunet_json_lib.h
Go to the documentation of this file.
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 */
27 #ifndef GNUNET_JSON_LIB_H
28 #define GNUNET_JSON_LIB_H
29 
30 #include "gnunet_util_lib.h"
31 #include "gnunet_gnsrecord_lib.h"
32 #include <jansson.h>
33 #include <microhttpd.h>
34 
35 /* ****************** Generic parser interface ******************* */
36 
41 
42 
52 typedef int (*GNUNET_JSON_Parser) (void *cls,
53  json_t *root,
54  struct GNUNET_JSON_Specification *spec);
55 
56 
63 typedef void (*GNUNET_JSON_Cleaner) (void *cls,
64  struct GNUNET_JSON_Specification *spec);
65 
66 
71 {
76 
81 
85  void *cls;
86 
91  const char *field;
92 
96  void *ptr;
97 
101  size_t ptr_size;
102 
106  size_t *size_ptr;
107 };
108 
109 
123 int
124 GNUNET_JSON_parse (const json_t *root,
125  struct GNUNET_JSON_Specification *spec,
126  const char **error_json_name,
127  unsigned int *error_line);
128 
129 
136 void
138 
139 
140 /* ****************** Canonical parser specifications ******************* */
141 
142 
147 GNUNET_JSON_spec_end (void);
148 
149 
159 GNUNET_JSON_spec_fixed (const char *name, void *obj, size_t size);
160 
161 
169 #define GNUNET_JSON_spec_fixed_auto(name, obj) \
170  GNUNET_JSON_spec_fixed (name, obj, sizeof (*obj))
171 
172 
182 GNUNET_JSON_spec_varsize (const char *name, void **obj, size_t *size);
183 
184 
192 GNUNET_JSON_spec_string (const char *name, const char **strptr);
193 
201 GNUNET_JSON_spec_json (const char *name, json_t **jsonp);
202 
203 
211 GNUNET_JSON_spec_uint8 (const char *name, uint8_t *u8);
212 
213 
221 GNUNET_JSON_spec_uint16 (const char *name, uint16_t *u16);
222 
223 
231 GNUNET_JSON_spec_uint32 (const char *name, uint32_t *u32);
232 
233 
241 GNUNET_JSON_spec_uint64 (const char *name, uint64_t *u64);
242 
250 GNUNET_JSON_spec_boolean (const char *name, int *boolean);
251 
252 
253 /* ************ GNUnet-specific parser specifications ******************* */
254 
263  struct GNUNET_TIME_Absolute *at);
264 
265 
274  struct GNUNET_TIME_AbsoluteNBO *at);
275 
276 
285  struct GNUNET_TIME_Relative *rt);
286 
287 
296  struct GNUNET_CRYPTO_RsaPublicKey **pk);
297 
298 
307  struct GNUNET_CRYPTO_RsaSignature **sig);
308 
309 
318  unsigned int *rd_count,
319  char **name);
320 
321 
322 /* ****************** Generic generator interface ******************* */
323 
324 
333 json_t *
334 GNUNET_JSON_from_data (const void *data, size_t size);
335 
336 
344 #define GNUNET_JSON_from_data_auto(ptr) \
345  GNUNET_JSON_from_data (ptr, sizeof (*ptr))
346 
347 
354 json_t *
356 
357 
364 json_t *
366 
367 
374 json_t *
376 
377 
384 json_t *
386 
387 
394 json_t *
396 
404 json_t *
405 GNUNET_JSON_from_gnsrecord (const char *rname,
406  const struct GNUNET_GNSRECORD_Data *rd,
407  unsigned int rd_count);
408 
409 /* ******************* Helpers for MHD upload handling ******************* */
410 
415 {
420 
425 
430 
435 
440 };
441 
442 
459 GNUNET_JSON_post_parser (size_t buffer_max,
460  struct MHD_Connection *connection,
461  void **con_cls,
462  const char *upload_data,
463  size_t *upload_data_size,
464  json_t **json);
465 
466 
474 void
475 GNUNET_JSON_post_parser_cleanup (void *con_cls);
476 
477 
478 /* ****************** GETOPT JSON helper ******************* */
479 
480 
492  const char *name,
493  const char *argumentHelp,
494  const char *description,
495  json_t **json);
496 
497 #endif
498 
499 /* end of gnunet_json_lib.h */
void * cls
Closure for parser and cleaner.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_uint8(const char *name, uint8_t *u8)
8-bit integer.
Definition: json_helper.c:363
json_t * GNUNET_JSON_from_data(const void *data, size_t size)
Convert binary data to a JSON string with the base32crockford encoding.
JSON parsing failed.
static struct GNUNET_CRYPTO_EddsaPrivateKey * pk
Private key of this peer.
const char * argumentHelp
Name of the argument for the user in help text.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_rsa_signature(const char *name, struct GNUNET_CRYPTO_RsaSignature **sig)
Specification for parsing an RSA signature.
Definition: json_helper.c:933
an RSA signature
Definition: crypto_rsa.c:63
const char * field
Name of the field to parse, use NULL to get the JSON of the main object instead of the JSON of an ind...
json_t * GNUNET_JSON_from_rsa_signature(const struct GNUNET_CRYPTO_RsaSignature *sig)
Convert RSA signature to JSON.
json_t * GNUNET_JSON_from_time_abs_nbo(struct GNUNET_TIME_AbsoluteNBO stamp)
Convert absolute timestamp to a json string.
json_t * GNUNET_JSON_from_time_rel(struct GNUNET_TIME_Relative stamp)
Convert relative timestamp to a json string.
const char * description
Help text for the option (description)
struct GNUNET_JSON_Specification GNUNET_JSON_spec_fixed(const char *name, void *obj, size_t size)
Variable size object (in network byte order, encoded using Crockford Base32hex encoding).
Definition: json_helper.c:95
void GNUNET_JSON_parse_free(struct GNUNET_JSON_Specification *spec)
Frees all elements allocated during a GNUNET_JSON_parse() operation.
Definition: json.c:87
Entry in parser specification for GNUNET_JSON_parse().
struct GNUNET_JSON_Specification GNUNET_JSON_spec_rsa_public_key(const char *name, struct GNUNET_CRYPTO_RsaPublicKey **pk)
Specification for parsing an RSA public key.
Definition: json_helper.c:840
Definition of a command line option.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_absolute_time_nbo(const char *name, struct GNUNET_TIME_AbsoluteNBO *at)
Absolute time in network byte order.
Definition: json_helper.c:677
const char shortName
Short name of the option.
Time for absolute time used by GNUnet, in microseconds and in network byte order. ...
The public information of an RSA key pair.
Definition: crypto_rsa.c:51
struct GNUNET_JSON_Specification GNUNET_JSON_spec_absolute_time(const char *name, struct GNUNET_TIME_Absolute *at)
Absolute time.
Definition: json_helper.c:600
struct GNUNET_JSON_Specification GNUNET_JSON_spec_json(const char *name, json_t **jsonp)
JSON object.
Definition: json_helper.c:307
struct GNUNET_JSON_Specification GNUNET_JSON_spec_uint16(const char *name, uint16_t *u16)
16-bit integer.
Definition: json_helper.c:418
Parsing successful, JSON result is in *json.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_string(const char *name, const char **strptr)
The expected field stores a string.
Definition: json_helper.c:239
json_t * GNUNET_JSON_from_time_abs(struct GNUNET_TIME_Absolute stamp)
Convert absolute timestamp to a json string.
int GNUNET_JSON_parse(const json_t *root, struct GNUNET_JSON_Specification *spec, const char **error_json_name, unsigned int *error_line)
Navigate and parse data in a JSON tree.
Definition: json.c:45
struct GNUNET_JSON_Specification GNUNET_JSON_spec_boolean(const char *name, int *boolean)
Boolean (true mapped to GNUNET_YES, false mapped to GNUNET_NO).
Definition: json_helper.c:982
struct GNUNET_JSON_Specification GNUNET_JSON_spec_uint32(const char *name, uint32_t *u32)
32-bit integer.
Definition: json_helper.c:473
void(* GNUNET_JSON_Cleaner)(void *cls, struct GNUNET_JSON_Specification *spec)
Function called to clean up data from earlier parsing.
Sorry, memory allocation (malloc()) failed.
GNUNET_JSON_Parser parser
Function for how to parse this type of entry.
json_t * GNUNET_JSON_from_gnsrecord(const char *rname, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Convert Gns record to JSON.
Request size exceeded buffer_max argument.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_relative_time(const char *name, struct GNUNET_TIME_Relative *rt)
Relative time.
Definition: json_helper.c:748
struct GNUNET_GETOPT_CommandLineOption GNUNET_JSON_getopt(char shortName, const char *name, const char *argumentHelp, const char *description, json_t **json)
Allow user to specify a JSON input value.
Definition: json.c:143
static unsigned int size
Size of the "table".
Definition: peer.c:67
struct GNUNET_JSON_Specification GNUNET_JSON_spec_gnsrecord(struct GNUNET_GNSRECORD_Data **rd, unsigned int *rd_count, char **name)
JSON Specification for GNS Records.
const char * name
void * ptr
Pointer, details specific to the parser.
int(* GNUNET_JSON_Parser)(void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
Function called to parse JSON argument.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_varsize(const char *name, void **obj, size_t *size)
Variable size object (in network byte order, encoded using Crockford Base32hex encoding).
Definition: json_helper.c:187
GNUNET_JSON_PostResult
Return codes from GNUNET_JSON_post_parser().
enum GNUNET_JSON_PostResult GNUNET_JSON_post_parser(size_t buffer_max, struct MHD_Connection *connection, void **con_cls, const char *upload_data, size_t *upload_data_size, json_t **json)
Process a POST request containing a JSON object.
Definition: json_mhd.c:258
GNUNET_JSON_Cleaner cleaner
Function for how to clean up this type of entry.
void GNUNET_JSON_post_parser_cleanup(void *con_cls)
Function called whenever we are done with a request to clean up our state.
Definition: json_mhd.c:351
Parsing continues, call again soon!
size_t ptr_size
Number of bytes available in ptr.
size_t * size_ptr
Where should we store the final size of ptr.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_uint64(const char *name, uint64_t *u64)
64-bit integer.
Definition: json_helper.c:523
json_t * GNUNET_JSON_from_rsa_public_key(const struct GNUNET_CRYPTO_RsaPublicKey *pk)
Convert RSA public key to JSON.
Time for absolute times used by GNUnet, in microseconds.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_end(void)
End of a parser specification.
Definition: json_helper.c:35
uint32_t data
The data value.
Time for relative time used by GNUnet, in microseconds.