also offer API for receiving rounded relative time via JSON
This commit is contained in:
parent
54e63f01df
commit
575c10027b
@ -105,6 +105,18 @@ TALER_JSON_spec_absolute_time_nbo (const char *name,
|
||||
struct GNUNET_TIME_AbsoluteNBO *r_time);
|
||||
|
||||
|
||||
/**
|
||||
* Provide specification to parse given JSON object to a relative time.
|
||||
* The absolute time value is expected to be already rounded.
|
||||
*
|
||||
* @param name name of the time field in the JSON
|
||||
* @param[out] r_time where the time has to be written
|
||||
*/
|
||||
struct GNUNET_JSON_Specification
|
||||
TALER_JSON_spec_relative_time (const char *name,
|
||||
struct GNUNET_TIME_Relative *r_time);
|
||||
|
||||
|
||||
/**
|
||||
* Generate line in parser specification for denomination public key.
|
||||
*
|
||||
|
@ -251,7 +251,7 @@ TALER_JSON_spec_absolute_time (const char *name,
|
||||
.cls = NULL,
|
||||
.field = name,
|
||||
.ptr = r_time,
|
||||
.ptr_size = sizeof(uint64_t),
|
||||
.ptr_size = sizeof(struct GNUNET_TIME_Absolute),
|
||||
.size_ptr = NULL
|
||||
};
|
||||
|
||||
@ -307,7 +307,92 @@ TALER_JSON_spec_absolute_time_nbo (const char *name,
|
||||
.cls = NULL,
|
||||
.field = name,
|
||||
.ptr = r_time,
|
||||
.ptr_size = sizeof(uint64_t),
|
||||
.ptr_size = sizeof(struct GNUNET_TIME_AbsoluteNBO),
|
||||
.size_ptr = NULL
|
||||
};
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse given JSON object to relative time.
|
||||
*
|
||||
* @param cls closure, NULL
|
||||
* @param root the json object representing data
|
||||
* @param[out] spec where to write the data
|
||||
* @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
|
||||
*/
|
||||
static int
|
||||
parse_rel_time (void *cls,
|
||||
json_t *root,
|
||||
struct GNUNET_JSON_Specification *spec)
|
||||
{
|
||||
struct GNUNET_TIME_Relative *rel = spec->ptr;
|
||||
json_t *json_d_ms;
|
||||
unsigned long long int tval;
|
||||
|
||||
if (! json_is_object (root))
|
||||
{
|
||||
GNUNET_break_op (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
json_d_ms = json_object_get (root, "d_ms");
|
||||
if (json_is_integer (json_d_ms))
|
||||
{
|
||||
tval = json_integer_value (json_d_ms);
|
||||
/* Time is in milliseconds in JSON, but in microseconds in GNUNET_TIME_Absolute */
|
||||
rel->rel_value_us = tval * 1000LL;
|
||||
if ((rel->rel_value_us) / 1000LL != tval)
|
||||
{
|
||||
/* Integer overflow */
|
||||
GNUNET_break_op (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_TIME_round_rel (rel))
|
||||
{
|
||||
/* time not rounded */
|
||||
GNUNET_break_op (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
return GNUNET_OK;
|
||||
}
|
||||
if (json_is_string (json_d_ms))
|
||||
{
|
||||
const char *val;
|
||||
val = json_string_value (json_d_ms);
|
||||
if ((0 == strcasecmp (val, "forever")))
|
||||
{
|
||||
*rel = GNUNET_TIME_UNIT_FOREVER_REL;
|
||||
return GNUNET_OK;
|
||||
}
|
||||
GNUNET_break_op (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
GNUNET_break_op (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Provide specification to parse given JSON object to a relative time.
|
||||
* The absolute time value is expected to be already rounded.
|
||||
*
|
||||
* @param name name of the time field in the JSON
|
||||
* @param[out] r_time where the time has to be written
|
||||
*/
|
||||
struct GNUNET_JSON_Specification
|
||||
TALER_JSON_spec_relative_time (const char *name,
|
||||
struct GNUNET_TIME_Relative *r_time)
|
||||
{
|
||||
struct GNUNET_JSON_Specification ret = {
|
||||
.parser = &parse_rel_time,
|
||||
.cleaner = NULL,
|
||||
.cls = NULL,
|
||||
.field = name,
|
||||
.ptr = r_time,
|
||||
.ptr_size = sizeof(struct GNUNET_TIME_Relative),
|
||||
.size_ptr = NULL
|
||||
};
|
||||
|
||||
|
@ -827,8 +827,8 @@ decode_keys_json (const json_t *resp_obj,
|
||||
&key_data->master_pub),
|
||||
TALER_JSON_spec_absolute_time ("list_issue_date",
|
||||
&key_data->list_issue_date),
|
||||
GNUNET_JSON_spec_relative_time ("reserve_closing_delay",
|
||||
&key_data->reserve_closing_delay),
|
||||
TALER_JSON_spec_relative_time ("reserve_closing_delay",
|
||||
&key_data->reserve_closing_delay),
|
||||
GNUNET_JSON_spec_end ()
|
||||
};
|
||||
|
||||
@ -887,8 +887,6 @@ decode_keys_json (const json_t *resp_obj,
|
||||
GNUNET_JSON_parse (resp_obj,
|
||||
(check_sig) ? mspec : &mspec[2],
|
||||
NULL, NULL));
|
||||
EXITIF (GNUNET_OK !=
|
||||
GNUNET_TIME_round_rel (&key_data->reserve_closing_delay));
|
||||
/* parse the master public key and issue date of the response */
|
||||
if (check_sig)
|
||||
hash_context = GNUNET_CRYPTO_hash_context_start ();
|
||||
|
Loading…
Reference in New Issue
Block a user