From 91bb5623de1586912d323bf4dfd19c02d2a376d6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 26 Jul 2021 17:25:53 +0200 Subject: [PATCH] JSON: implement taler-specific json pack functions --- src/include/taler_json_lib.h | 111 ++++++++++++++++++++++++++++++++++ src/json/Makefile.am | 1 + src/json/json_pack.c | 113 +++++++++++++++++++++++++++++++++++ 3 files changed, 225 insertions(+) create mode 100644 src/json/json_pack.c diff --git a/src/include/taler_json_lib.h b/src/include/taler_json_lib.h index 1089f5bdf..4ed259b21 100644 --- a/src/include/taler_json_lib.h +++ b/src/include/taler_json_lib.h @@ -37,6 +37,117 @@ "JSON parsing failed at %s:%u: %s (%s)\n", \ __FILE__, __LINE__, error.text, error.source) + +/** + * Generate packer instruction for a JSON field of type + * absolute time. + * The absolute time value is expected to be already rounded. + * + * @param name name of the field to add to the object + * @param at absolute time to pack + * @return json pack specification + */ +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_time_abs (const char *name, + struct GNUNET_TIME_Absolute at); + + +/** + * Generate packer instruction for a JSON field of type + * absolute time in network byte order. + * The absolute time value is expected to be already rounded. + * + * @param name name of the field to add to the object + * @param at absolute time to pack + * @return json pack specification + */ +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_time_abs_nbo (const char *name, + struct GNUNET_TIME_AbsoluteNBO at); + + +/** + * Generate packer instruction for a JSON field of type + * relative time. + * The relative time value is expected to be already rounded. + * + * @param name name of the field to add to the object + * @param rt relative time to pack + * @return json pack specification + */ +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_time_rel (const char *name, + struct GNUNET_TIME_Relative rt); + + +/** + * Generate packer instruction for a JSON field of type + * relative time in network byte order. + * The relative time value is expected to be already rounded. + * + * @param name name of the field to add to the object + * @param rt relative time to pack + * @return json pack specification + */ +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_time_rel_nbo (const char *name, + struct GNUNET_TIME_RelativeNBO rt); + + +/** + * Generate packer instruction for a JSON field of type + * denomination public key. + * + * @param name name of the field to add to the object + * @param pk public key + * @return json pack specification + */ +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_denomination_public_key (const char *name, + const struct + TALER_DenominationPublicKey *pk); + + +/** + * Generate packer instruction for a JSON field of type + * denomination signature. + * + * @param name name of the field to add to the object + * @param sig signature + * @return json pack specification + */ +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_denomination_signature (const char *name, + const struct + TALER_DenominationSignature *sig); + + +/** + * Generate packer instruction for a JSON field of type + * amount. + * + * @param name name of the field to add to the object + * @param amount valid amount to pack + * @return json pack specification + */ +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_amount (const char *name, + const struct TALER_Amount *amount); + + +/** + * Generate packer instruction for a JSON field of type + * amount. + * + * @param name name of the field to add to the object + * @param amount valid amount to pack + * @return json pack specification + */ +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_amount_nbo (const char *name, + const struct TALER_AmountNBO *amount); + + /** * Convert a TALER amount to a JSON object. * diff --git a/src/json/Makefile.am b/src/json/Makefile.am index 71175b2b3..cad3b2486 100644 --- a/src/json/Makefile.am +++ b/src/json/Makefile.am @@ -13,6 +13,7 @@ libtalerjson_la_SOURCES = \ i18n.c \ json.c \ json_helper.c \ + json_pack.c \ json_wire.c libtalerjson_la_LDFLAGS = \ -version-info 1:0:1 \ diff --git a/src/json/json_pack.c b/src/json/json_pack.c new file mode 100644 index 000000000..836f03911 --- /dev/null +++ b/src/json/json_pack.c @@ -0,0 +1,113 @@ +/* + This file is part of TALER + Copyright (C) 2021 Taler Systems SA + + TALER 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. + + TALER 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 + TALER; see the file COPYING. If not, see +*/ +/** + * @file json/json_pack.c + * @brief helper functions for JSON object packing + * @author Christian Grothoff + */ +#include "platform.h" +#include +#include "taler_util.h" +#include "taler_json_lib.h" + + +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_time_abs (const char *name, + struct GNUNET_TIME_Absolute at) +{ + GNUNET_assert (GNUNET_OK == + GNUNET_TIME_round_abs (&at)); + return GNUNET_JSON_pack_time_abs (name, + at); +} + + +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_time_abs_nbo (const char *name, + struct GNUNET_TIME_AbsoluteNBO at) +{ + return TALER_JSON_pack_time_abs (name, + GNUNET_TIME_absolute_ntoh (at)); +} + + +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_time_rel (const char *name, + struct GNUNET_TIME_Relative rt) +{ + GNUNET_assert (GNUNET_OK == + GNUNET_TIME_round_rel (&rt)); + return GNUNET_JSON_pack_time_rel (name, + rt); +} + + +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_time_rel_nbo (const char *name, + struct GNUNET_TIME_RelativeNBO rt) +{ + return TALER_JSON_pack_time_rel (name, + GNUNET_TIME_relative_ntoh (rt)); +} + + +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_denomination_public_key (const char *name, + const struct + TALER_DenominationPublicKey *pk) +{ + return GNUNET_JSON_pack_rsa_public_key (name, + pk->rsa_public_key); +} + + +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_denomination_signature (const char *name, + const struct + TALER_DenominationSignature *sig) +{ + return GNUNET_JSON_pack_rsa_signature (name, + sig->rsa_signature); +} + + +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_amount (const char *name, + const struct TALER_Amount *amount) +{ + json_t *json; + + json = TALER_JSON_from_amount (amount); + GNUNET_assert (NULL != json); + return GNUNET_JSON_pack_object_steal (name, + json); +} + + +struct GNUNET_JSON_PackSpec +TALER_JSON_pack_amount_nbo (const char *name, + const struct TALER_AmountNBO *amount) +{ + json_t *json; + + json = TALER_JSON_from_amount_nbo (amount); + GNUNET_assert (NULL != json); + return GNUNET_JSON_pack_object_steal (name, + json); +} + + +/* End of json/json_pack.c */