aboutsummaryrefslogtreecommitdiff
path: root/src/json
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-04-17 14:25:55 +0200
committerChristian Grothoff <christian@grothoff.org>2017-04-17 14:26:13 +0200
commit50d0ee6161da036cf7e8761f945793f09227fa10 (patch)
tree013104e94562079d2c790d6253faa99726c40c45 /src/json
parenta58d36b8da7afa42410bac54f57d5f3b6b6c4391 (diff)
add GNUNET_JSON_spec_absolute_time_nbo
Diffstat (limited to 'src/json')
-rw-r--r--src/json/json_helper.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/json/json_helper.c b/src/json/json_helper.c
index dca2106aae..194ec5c76a 100644
--- a/src/json/json_helper.c
+++ b/src/json/json_helper.c
@@ -610,6 +610,83 @@ GNUNET_JSON_spec_absolute_time (const char *name,
/**
+ * Parse given JSON object to absolute 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_abs_time_nbo (void *cls,
+ json_t *root,
+ struct GNUNET_JSON_Specification *spec)
+{
+ struct GNUNET_TIME_AbsoluteNBO *abs = spec->ptr;
+ const char *val;
+ unsigned long long int tval;
+ struct GNUNET_TIME_Absolute a;
+
+ val = json_string_value (root);
+ if (NULL == val)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ if ( (0 == strcasecmp (val,
+ "/forever/")) ||
+ (0 == strcasecmp (val,
+ "/end of time/")) ||
+ (0 == strcasecmp (val,
+ "/never/")) )
+ {
+ *abs = GNUNET_TIME_absolute_hton (GNUNET_TIME_UNIT_FOREVER_ABS);
+ return GNUNET_OK;
+ }
+ if (1 != sscanf (val,
+ "/Date(%llu)/",
+ &tval))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ /* Time is in seconds in JSON, but in microseconds in GNUNET_TIME_Absolute */
+ a.abs_value_us = tval * 1000LL * 1000LL;
+ if ( (a.abs_value_us) / 1000LL / 1000LL != tval)
+ {
+ /* Integer overflow */
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ *abs = GNUNET_TIME_absolute_hton (a);
+ return GNUNET_OK;
+}
+
+
+/**
+ * Absolute time in network byte order.
+ *
+ * @param name name of the JSON field
+ * @param[out] at where to store the absolute time found under @a name
+ */
+struct GNUNET_JSON_Specification
+GNUNET_JSON_spec_absolute_time_nbo (const char *name,
+ struct GNUNET_TIME_AbsoluteNBO *at)
+{
+ struct GNUNET_JSON_Specification ret = {
+ .parser = &parse_abs_time_nbo,
+ .cleaner = NULL,
+ .cls = NULL,
+ .field = name,
+ .ptr = at,
+ .ptr_size = sizeof (uint64_t),
+ .size_ptr = NULL
+ };
+ return ret;
+}
+
+
+/**
* Parse given JSON object to relative time.
*
* @param cls closure, NULL