diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/ndpi_api.h | 7 | ||||
-rw-r--r-- | src/include/ndpi_typedefs.h | 1 | ||||
-rw-r--r-- | src/lib/ndpi_utils.c | 44 |
3 files changed, 46 insertions, 6 deletions
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h index dcfb12ae4..f2b03774f 100644 --- a/src/include/ndpi_api.h +++ b/src/include/ndpi_api.h @@ -831,8 +831,9 @@ extern "C" { char *key, u_int64_t value); int ndpi_serialize_string_string(ndpi_serializer *serializer, char *key, char *value); - /* **** */ - + int ndpi_serialize_end_of_record(ndpi_serializer *serializer); + + /* Deserializer */ int ndpi_init_deserializer(ndpi_deserializer *deserializer, ndpi_serializer *serializer); int ndpi_init_deserializer_buf(ndpi_deserializer *deserializer, @@ -853,7 +854,7 @@ extern "C" { ndpi_string *key, u_int64_t *value); int ndpi_deserialize_string_string(ndpi_deserializer *deserializer, ndpi_string *key, ndpi_string *value); - + int ndpi_deserialize_end_of_record(ndpi_deserializer *deserializer); #ifdef __cplusplus } diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index 3d2e798fc..6419d6658 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -1267,6 +1267,7 @@ typedef enum { typedef enum { ndpi_serialization_unknown = 0, + ndpi_serialization_end_of_record, ndpi_serialization_uint32_uint32, ndpi_serialization_uint32_uint64, ndpi_serialization_uint32_string, diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c index 76a91e0e3..02876d6f1 100644 --- a/src/lib/ndpi_utils.c +++ b/src/lib/ndpi_utils.c @@ -839,6 +839,25 @@ static void ndpi_deserialize_single_string(ndpi_serializer *serializer, /* ********************************** */ +int ndpi_serialize_end_of_record(ndpi_serializer *serializer) { + u_int32_t buff_diff = serializer->buffer_size - serializer->size_used; + + if(buff_diff < 1) { + ndpi_extend_serializer_buffer(serializer); + if(serializer->size_used < 10) return(-1); + } + + if(serializer->fmt == ndpi_serialization_format_json) { + // TODO do we need to handle arrays? + } else { + serializer->buffer[serializer->size_used++] = ndpi_serialization_end_of_record; + } + + return(0); +} + +/* ********************************** */ + int ndpi_serialize_uint32_uint32(ndpi_serializer *serializer, u_int32_t key, u_int32_t value) { u_int32_t buff_diff = serializer->buffer_size - serializer->size_used; @@ -1022,16 +1041,35 @@ int ndpi_init_deserializer(ndpi_deserializer *deserializer, ndpi_serializer *serializer) { return(ndpi_init_deserializer_buf(deserializer, serializer->buffer, - serializer->buffer_size)); + serializer->size_used)); } /* ********************************** */ ndpi_serialization_element_type ndpi_deserialize_get_nextitem_type(ndpi_deserializer *deserializer) { + ndpi_serialization_element_type et; + if(deserializer->size_used >= deserializer->buffer_size) return(ndpi_serialization_unknown); - else - return((ndpi_serialization_element_type)deserializer->buffer[deserializer->size_used]); + + et = (ndpi_serialization_element_type) deserializer->buffer[deserializer->size_used]; + + return et; +} + +/* ********************************** */ + +int ndpi_deserialize_end_of_record(ndpi_deserializer *deserializer) { + if(ndpi_deserialize_get_nextitem_type(deserializer) == ndpi_serialization_end_of_record) { + u_int32_t buff_diff = deserializer->buffer_size - deserializer->size_used; + + if(buff_diff < 1) return(-2); + + deserializer->size_used++; /* Skip element type */ + + return(0); + } else + return(-1); } /* ********************************** */ |