/*
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 Affero General Public License as published
by the Free Software Foundation, either version 3 of the License,
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
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
* @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"
json_t *
GNUNET_JSON_from_data (const void *data,
size_t size)
{
char *buf;
json_t *json;
if ((size * 8 + 4) / 5 + 1 >=
GNUNET_MAX_MALLOC_CHECKED)
{
GNUNET_break (0);
return NULL;
}
buf = GNUNET_STRINGS_data_to_string_alloc (data,
size);
json = json_string (buf);
GNUNET_free (buf);
GNUNET_break (NULL != json);
return json;
}
json_t *
GNUNET_JSON_from_timestamp (struct GNUNET_TIME_Timestamp stamp)
{
json_t *j;
j = json_object ();
if (NULL == j)
{
GNUNET_break (0);
return NULL;
}
if (GNUNET_TIME_absolute_is_never (stamp.abs_time))
{
if (0 !=
json_object_set_new (j,
"t_s",
json_string ("never")))
{
GNUNET_break (0);
json_decref (j);
return NULL;
}
if (0 !=
json_object_set_new (j,
"t_ms",
json_string ("never")))
{
GNUNET_break (0);
json_decref (j);
return NULL;
}
return j;
}
GNUNET_assert (
0 ==
(stamp.abs_time.abs_value_us
% GNUNET_TIME_UNIT_SECONDS.rel_value_us));
if (0 !=
json_object_set_new (
j,
"t_s",
json_integer (
(json_int_t) (stamp.abs_time.abs_value_us
/ GNUNET_TIME_UNIT_SECONDS.rel_value_us))))
{
GNUNET_break (0);
json_decref (j);
return NULL;
}
if (0 !=
json_object_set_new (
j,
"t_ms",
json_integer (
(json_int_t) (stamp.abs_time.abs_value_us
/ GNUNET_TIME_UNIT_MILLISECONDS.rel_value_us))))
{
GNUNET_break (0);
json_decref (j);
return NULL;
}
return j;
}
json_t *
GNUNET_JSON_from_timestamp_nbo (struct GNUNET_TIME_TimestampNBO stamp)
{
return GNUNET_JSON_from_timestamp (GNUNET_TIME_timestamp_ntoh (stamp));
}
json_t *
GNUNET_JSON_from_time_rel (struct GNUNET_TIME_Relative stamp)
{
json_t *j;
j = json_object ();
if (NULL == j)
{
GNUNET_break (0);
return NULL;
}
if (GNUNET_TIME_relative_is_forever (stamp))
{
if (0 !=
json_object_set_new (j,
"d_us",
json_string ("forever")))
{
GNUNET_break (0);
json_decref (j);
return NULL;
}
if (0 !=
json_object_set_new (j,
"d_ms",
json_string ("forever")))
{
GNUNET_break (0);
json_decref (j);
return NULL;
}
return j;
}
if (stamp.rel_value_us >= (1LLU << 53))
{
/* value is larger than allowed */
GNUNET_break (0);
return NULL;
}
if (0 !=
json_object_set_new (
j,
"d_us",
json_integer ((json_int_t) stamp.rel_value_us)))
{
GNUNET_break (0);
json_decref (j);
return NULL;
}
if (0 !=
json_object_set_new (
j,
"d_ms",
json_integer (((json_int_t) stamp.rel_value_us)/1000LL)))
{
GNUNET_break (0);
json_decref (j);
return NULL;
}
return j;
}
json_t *
GNUNET_JSON_from_rsa_public_key (const struct GNUNET_CRYPTO_RsaPublicKey *pk)
{
void *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;
}
json_t *
GNUNET_JSON_from_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *sig)
{
void *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 */