aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/image-msgpack.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel/src/image-msgpack.c')
-rw-r--r--libcrystfel/src/image-msgpack.c67
1 files changed, 25 insertions, 42 deletions
diff --git a/libcrystfel/src/image-msgpack.c b/libcrystfel/src/image-msgpack.c
index 0f5ab746..6785fd5f 100644
--- a/libcrystfel/src/image-msgpack.c
+++ b/libcrystfel/src/image-msgpack.c
@@ -242,93 +242,76 @@ static char *terminate_str(const char *ptr, size_t len)
}
-double image_msgpack_get_value(const char *name,
- void *data_block,
- size_t data_block_size,
- char *ptype)
+int image_msgpack_read_header_to_cache(struct image *image,
+ const char *name)
{
msgpack_unpacked unpacked;
msgpack_object *value_obj;
msgpack_object *obj;
int r;
- float val = NAN;
char *str;
- *ptype = 'x';
-
- if ( data_block == NULL ) {
+ if ( image->data_block == NULL ) {
ERROR("No MsgPack data!\n");
- goto out;
+ return 1;
}
msgpack_unpacked_init(&unpacked);
- r = msgpack_unpack_next(&unpacked, data_block, data_block_size, NULL);
+ r = msgpack_unpack_next(&unpacked, image->data_block,
+ image->data_block_size, NULL);
if ( r != MSGPACK_UNPACK_SUCCESS ) {
ERROR("MessagePack unpack failed: %i\n", r);
- goto out;
+ return 1;
}
obj = find_main_object(&unpacked);
if ( obj == NULL ) {
ERROR("Failed to find main MsgPack object.\n");
msgpack_unpacked_destroy(&unpacked);
- goto out;
+ return 1;
}
value_obj = find_msgpack_kv(obj, name);
if ( value_obj == NULL ) {
ERROR("Couldn't find '%s' in MessagePack object\n", name);
msgpack_unpacked_destroy(&unpacked);
- goto out;
+ return 1;
}
switch ( value_obj->type ) {
case MSGPACK_OBJECT_FLOAT64:
case MSGPACK_OBJECT_FLOAT32:
- //case MSGPACK_OBJECT_FLOAT:
- *ptype = 'f';
- val = value_obj->via.f64;
- break;
+ image_cache_header_float(image, name, value_obj->via.f64);
+ msgpack_unpacked_destroy(&unpacked);
+ return 0;
case MSGPACK_OBJECT_POSITIVE_INTEGER:
case MSGPACK_OBJECT_NEGATIVE_INTEGER:
- *ptype = 'i';
- val = value_obj->via.i64;
- break;
+ image_cache_header_int(image, name, value_obj->via.i64);
+ msgpack_unpacked_destroy(&unpacked);
+ return 0;
case MSGPACK_OBJECT_STR:
str = terminate_str(value_obj->via.str.ptr,
value_obj->via.str.size);
- if ( str != NULL ) {
- int ival;
- if ( convert_int(str, &ival) == 0 ) {
- *ptype = 'i';
- val = ival;
- } else {
- ERROR("MsgPack header %s has a string type (%s)"
- "(need a number, and can't convert).\n",
- name, str);
- val = NAN;
- }
- free(str);
- } else {
- ERROR("Failed to read MsgPack string (%s)\n", name);
- val = NAN;
+ if ( str == NULL ) {
+ msgpack_unpacked_destroy(&unpacked);
+ return 1;
}
- break;
+
+ image_cache_header_str(image, name, str);
+ free(str);
+ msgpack_unpacked_destroy(&unpacked);
+ return 0;
default:
ERROR("Unrecognised MsgPack type %i (%s)\n",
value_obj->type, name);
- break;
+ msgpack_unpacked_destroy(&unpacked);
+ return 1;
}
-
- msgpack_unpacked_destroy(&unpacked);
-
-out:
- return val;
}