summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--json.c15
-rw-r--r--json.h1
-rw-r--r--libgps_json.c3
3 files changed, 15 insertions, 4 deletions
diff --git a/json.c b/json.c
index 462c0c23..111c2e74 100644
--- a/json.c
+++ b/json.c
@@ -70,6 +70,8 @@ PERMISSIONS
#ifdef SOCKET_EXPORT_ENABLE
#include "json.h"
+#include "gps.h" /* only for timestamp_t prototype */
+
#ifdef CLIENTDEBUG_ENABLE
static int debuglevel = 0;
static FILE *debugfp;
@@ -119,6 +121,7 @@ static /*@null@*/ char *json_target_address(const struct json_attr_t *cursor,
case t_uinteger:
targetaddr = (char *)&cursor->addr.uinteger[offset];
break;
+ case t_timestamp:
case t_real:
targetaddr = (char *)&cursor->addr.real[offset];
break;
@@ -196,6 +199,7 @@ static int json_internal_read_object(const char *cp,
case t_uinteger:
*((unsigned int *)lptr) = cursor->dflt.uinteger;
break;
+ case t_timestamp:
case t_real:
*((double *)lptr) = cursor->dflt.real;
break;
@@ -382,7 +386,7 @@ static int json_internal_read_object(const char *cp,
*/
for (;;) {
int seeking = cursor->type;
- if (value_quoted && cursor->type == t_string)
+ if (value_quoted && (cursor->type == t_string || cursor->type == t_timestamp))
break;
if ((strcmp(valbuf, "true")==0 || strcmp(valbuf, "false")==0)
&& seeking == t_boolean)
@@ -402,14 +406,15 @@ static int json_internal_read_object(const char *cp,
}
if (value_quoted
&& (cursor->type != t_string && cursor->type != t_character
- && cursor->type != t_check && cursor->map == 0)) {
+ && cursor->type != t_check && cursor->type != t_timestamp
+ && cursor->map == 0)) {
json_debug_trace((1,
"Saw quoted value when expecting non-string.\n"));
return JSON_ERR_QNONSTRING;
}
if (!value_quoted
&& (cursor->type == t_string || cursor->type == t_check
- || cursor->map != 0)) {
+ || cursor->type == t_timestamp || cursor->map != 0)) {
json_debug_trace((1,
"Didn't see quoted value when expecting string.\n"));
return JSON_ERR_NONQSTRING;
@@ -434,6 +439,9 @@ static int json_internal_read_object(const char *cp,
case t_uinteger:
*((unsigned int *)lptr) = (unsigned)atoi(valbuf);
break;
+ case t_timestamp:
+ *((double *)lptr) = iso8601_to_unix(valbuf);
+ break;
case t_real:
*((double *)lptr) = atof(valbuf);
break;
@@ -554,6 +562,7 @@ int json_read_array(const char *cp, const struct json_array_t *arr,
break;
case t_integer:
case t_uinteger:
+ case t_timestamp:
case t_real:
case t_boolean:
case t_character:
diff --git a/json.h b/json.h
index eae43c50..a1944433 100644
--- a/json.h
+++ b/json.h
@@ -9,6 +9,7 @@
typedef enum {t_integer, t_uinteger, t_real,
t_string, t_boolean, t_character,
+ t_timestamp,
t_object, t_structobject, t_array,
t_check} json_type;
diff --git a/libgps_json.c b/libgps_json.c
index c8976952..c6202b85 100644
--- a/libgps_json.c
+++ b/libgps_json.c
@@ -299,8 +299,9 @@ static int json_devicelist_read(const char *buf, struct gps_data_t *gpsdata,
{"class", t_check, .dflt.check = "DEVICE"},
{"path", t_string, STRUCTOBJECT(struct devconfig_t, path),
.len = sizeof(gpsdata->devices.list[0].path)},
+ {"activated", t_timestamp, STRUCTOBJECT(struct devconfig_t, activated)},
{"activated", t_real, STRUCTOBJECT(struct devconfig_t, activated)},
- {"flags", t_integer, STRUCTOBJECT(struct devconfig_t, flags)},
+ {"flags", t_integer, STRUCTOBJECT(struct devconfig_t, flags)},
{"driver", t_string, STRUCTOBJECT(struct devconfig_t, driver),
.len = sizeof(gpsdata->devices.list[0].driver)},
{"subtype", t_string, STRUCTOBJECT(struct devconfig_t, subtype),