From a5361231e36224607d8c2c1376757c0b99f34f59 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 17 Mar 2016 19:24:35 +0000 Subject: adding library for basic JSON conversions --- src/json/json_generator.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 src/json/json_generator.c (limited to 'src/json/json_generator.c') diff --git a/src/json/json_generator.c b/src/json/json_generator.c new file mode 100644 index 000000000..4b1ac31b1 --- /dev/null +++ b/src/json/json_generator.c @@ -0,0 +1,146 @@ +/* + This file is part of GNUnet + Copyright (C) 2014, 2015, 2016 GNUnet e.V. + + GNUnet is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNUnet; see the file COPYING. If not, If not, see +*/ +/** + * @file json/json_generator.c + * @brief helper functions for generating JSON from GNUnet data structures + * @author Sree Harsha Totakura + */ +#include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_json_lib.h" + + +/** + * Convert binary data to a JSON string + * with the base32crockford encoding. + * + * @param data binary data + * @param size size of @a data in bytes + * @return json string that encodes @a data + */ +json_t * +GNUNET_JSON_from_data (const void *data, + size_t size) +{ + char *buf; + json_t *json; + + buf = GNUNET_STRINGS_data_to_string_alloc (data, size); + json = json_string (buf); + GNUNET_free (buf); + return json; +} + + +/** + * Convert absolute timestamp to a json string. + * + * @param stamp the time stamp + * @return a json string with the timestamp in @a stamp + */ +json_t * +GNUNET_JSON_from_time_abs (struct GNUNET_TIME_Absolute stamp) +{ + json_t *j; + char *mystr; + int ret; + + GNUNET_assert (GNUNET_OK == + GNUNET_TIME_round_abs (&stamp)); + if (stamp.abs_value_us == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us) + return json_string ("/never/"); + ret = GNUNET_asprintf (&mystr, + "/Date(%llu)/", + (unsigned long long) (stamp.abs_value_us / (1000LL * 1000LL))); + GNUNET_assert (ret > 0); + j = json_string (mystr); + GNUNET_free (mystr); + return j; +} + + +/** + * Convert relative timestamp to a json string. + * + * @param stamp the time stamp + * @return a json string with the timestamp in @a stamp + */ +json_t * +GNUNET_JSON_from_time_rel (struct GNUNET_TIME_Relative stamp) +{ + json_t *j; + char *mystr; + int ret; + + GNUNET_assert (GNUNET_OK == + GNUNET_TIME_round_rel (&stamp)); + if (stamp.rel_value_us == GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us) + return json_string ("/forever/"); + ret = GNUNET_asprintf (&mystr, + "/Delay(%llu)/", + (unsigned long long) (stamp.rel_value_us / (1000LL * 1000LL))); + GNUNET_assert (ret > 0); + j = json_string (mystr); + GNUNET_free (mystr); + return j; +} + + +/** + * Convert RSA public key to JSON. + * + * @param pk public key to convert + * @return corresponding JSON encoding + */ +json_t * +GNUNET_JSON_from_rsa_public_key (const struct GNUNET_CRYPTO_rsa_PublicKey *pk) +{ + char *buf; + size_t buf_len; + json_t *ret; + + buf_len = GNUNET_CRYPTO_rsa_public_key_encode (pk, + &buf); + ret = GNUNET_JSON_from_data (buf, + buf_len); + GNUNET_free (buf); + return ret; +} + + +/** + * Convert RSA signature to JSON. + * + * @param sig signature to convert + * @return corresponding JSON encoding + */ +json_t * +GNUNET_JSON_from_rsa_signature (const struct GNUNET_CRYPTO_rsa_Signature *sig) +{ + char *buf; + size_t buf_len; + json_t *ret; + + buf_len = GNUNET_CRYPTO_rsa_signature_encode (sig, + &buf); + ret = GNUNET_JSON_from_data (buf, + buf_len); + GNUNET_free (buf); + return ret; +} + + +/* End of json/json_generator.c */ -- cgit v1.2.3