Internal util functions to handle metadata.
Signed-off-by: Jaeyun <jy1210.jung@samsung.com>
# NNStreamer-Edge library
SET(NNS_EDGE_LIB_NAME nnstreamer-edge)
SET(NNS_EDGE_SRCS
- ${NNS_EDGE_SRC_DIR}/nnstreamer-edge-common.c
+ ${NNS_EDGE_SRC_DIR}/nnstreamer-edge-metadata.c
${NNS_EDGE_SRC_DIR}/nnstreamer-edge-data.c
${NNS_EDGE_SRC_DIR}/nnstreamer-edge-event.c
${NNS_EDGE_SRC_DIR}/nnstreamer-edge-internal.c
#include "nnstreamer-edge-data.h"
#include "nnstreamer-edge-event.h"
-#include "nnstreamer-edge-common.h"
#include "nnstreamer-edge-internal.h"
#include "nnstreamer-edge-util.h"
#include "nnstreamer-edge-log.h"
+++ /dev/null
-/* SPDX-License-Identifier: Apache-2.0 */
-/**
- * Copyright (C) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
- *
- * @file nnstreamer-edge-common.c
- * @date 6 April 2022
- * @brief Common util functions for nnstreamer edge.
- * @see https://github.com/nnstreamer/nnstreamer
- * @author Gichan Jang <gichan2.jang@samsung.com>
- * @bug No known bugs except for NYI items
- */
-
-#include "nnstreamer-edge-common.h"
-#include "nnstreamer-edge-data.h"
-#include "nnstreamer-edge-log.h"
-#include "nnstreamer-edge-util.h"
-
-/**
- * @brief Internal function to find node in the list.
- */
-static nns_edge_metadata_node_s *
-nns_edge_metadata_find (nns_edge_metadata_s * meta, const char *key)
-{
- nns_edge_metadata_node_s *node;
-
- if (!meta)
- return NULL;
-
- if (!STR_IS_VALID (key))
- return NULL;
-
- node = meta->list;
- while (node) {
- if (strcasecmp (key, node->key) == 0)
- return node;
-
- node = node->next;
- }
-
- return NULL;
-}
-
-/**
- * @brief Internal function to initialize metadata structure.
- */
-int
-nns_edge_metadata_init (nns_edge_metadata_s * meta)
-{
- if (!meta)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- memset (meta, 0, sizeof (nns_edge_metadata_s));
- return NNS_EDGE_ERROR_NONE;
-}
-
-/**
- * @brief Internal function to free the list and items in metadata structure.
- */
-int
-nns_edge_metadata_free (nns_edge_metadata_s * meta)
-{
- nns_edge_metadata_node_s *node, *tmp;
-
- if (!meta)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- node = meta->list;
- meta->list_len = 0;
- meta->list = NULL;
-
- while (node) {
- tmp = node->next;
-
- SAFE_FREE (node->key);
- SAFE_FREE (node->value);
- SAFE_FREE (node);
-
- node = tmp;
- }
-
- return NNS_EDGE_ERROR_NONE;
-}
-
-/**
- * @brief Internal function to set the metadata.
- */
-int
-nns_edge_metadata_set (nns_edge_metadata_s * meta,
- const char *key, const char *value)
-{
- nns_edge_metadata_node_s *node;
-
- if (!meta)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- if (!STR_IS_VALID (key))
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- if (!STR_IS_VALID (value))
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- /* Replace old value if key exists in the list. */
- node = nns_edge_metadata_find (meta, key);
- if (node) {
- char *val = nns_edge_strdup (value);
-
- if (!val)
- return NNS_EDGE_ERROR_OUT_OF_MEMORY;
-
- SAFE_FREE (node->value);
- node->value = val;
- return NNS_EDGE_ERROR_NONE;
- }
-
- node = calloc (1, sizeof (nns_edge_metadata_node_s));
- if (!node)
- return NNS_EDGE_ERROR_OUT_OF_MEMORY;
-
- node->key = nns_edge_strdup (key);
- node->value = nns_edge_strdup (value);
-
- if (!node->key || !node->value) {
- SAFE_FREE (node->key);
- SAFE_FREE (node->value);
- SAFE_FREE (node);
- return NNS_EDGE_ERROR_OUT_OF_MEMORY;
- }
-
- /* Prepend new node to the start of the list. */
- meta->list_len++;
- node->next = meta->list;
- meta->list = node;
-
- return NNS_EDGE_ERROR_NONE;
-}
-
-/**
- * @brief Internal function to get the metadata in the list. Caller should release the returned value using free().
- */
-int
-nns_edge_metadata_get (nns_edge_metadata_s * meta,
- const char *key, char **value)
-{
- nns_edge_metadata_node_s *node;
-
- if (!value)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- node = nns_edge_metadata_find (meta, key);
- if (node) {
- *value = nns_edge_strdup (node->value);
- return (*value) ? NNS_EDGE_ERROR_NONE : NNS_EDGE_ERROR_OUT_OF_MEMORY;
- }
-
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-}
-
-/**
- * @brief Internal function to copy the metadata.
- */
-int
-nns_edge_metadata_copy (nns_edge_metadata_s * dest, nns_edge_metadata_s * src)
-{
- nns_edge_metadata_s tmp;
- nns_edge_metadata_node_s *node;
- int ret;
-
- if (!dest || !src)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- nns_edge_metadata_init (&tmp);
-
- node = src->list;
- while (node) {
- ret = nns_edge_metadata_set (&tmp, node->key, node->value);
- if (ret != NNS_EDGE_ERROR_NONE) {
- nns_edge_metadata_free (&tmp);
- return ret;
- }
-
- node = node->next;
- }
-
- /* Replace dest when new metadata is successfully copied. */
- nns_edge_metadata_free (dest);
- *dest = tmp;
-
- return NNS_EDGE_ERROR_NONE;
-}
-
-/**
- * @brief Internal function to serialize the metadata. Caller should release the returned value using free().
- */
-int
-nns_edge_metadata_serialize (nns_edge_metadata_s * meta,
- void **data, size_t *data_len)
-{
- nns_edge_metadata_node_s *node;
- char *serialized, *ptr;
- size_t total, len;
-
- if (!meta)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- if (!data || !data_len)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- *data = NULL;
- *data_len = 0U;
-
- if (meta->list_len == 0)
- return NNS_EDGE_ERROR_NONE;
-
- total = len = sizeof (unsigned int);
-
- node = meta->list;
- while (node) {
- total += (strlen (node->key) + strlen (node->value) + 2);
- node = node->next;
- }
-
- serialized = ptr = (char *) malloc (total);
- if (!serialized)
- return NNS_EDGE_ERROR_OUT_OF_MEMORY;
-
- /* length + list of key-value pair */
- ((unsigned int *) serialized)[0] = meta->list_len;
- ptr += len;
-
- node = meta->list;
- while (node) {
- len = strlen (node->key);
- memcpy (ptr, node->key, len);
- ptr[len] = '\0';
- ptr += (len + 1);
-
- len = strlen (node->value);
- memcpy (ptr, node->value, len);
- ptr[len] = '\0';
- ptr += (len + 1);
-
- node = node->next;
- }
-
- *data = serialized;
- *data_len = total;
-
- return NNS_EDGE_ERROR_NONE;
-}
-
-/**
- * @brief Internal function to deserialize memory into metadata.
- */
-int
-nns_edge_metadata_deserialize (nns_edge_metadata_s * meta,
- void *data, size_t data_len)
-{
- char *key, *value;
- size_t cur;
- unsigned int total;
- int ret;
-
- if (!meta)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- if (!data || data_len <= 0)
- return NNS_EDGE_ERROR_INVALID_PARAMETER;
-
- nns_edge_metadata_free (meta);
-
- /* length + list of key-value pair */
- total = ((unsigned int *) data)[0];
-
- cur = sizeof (unsigned int);
- while (cur < data_len || meta->list_len < total) {
- key = (char *) data + cur;
- cur += (strlen (key) + 1);
-
- value = (char *) data + cur;
- cur += (strlen (value) + 1);
-
- ret = nns_edge_metadata_set (meta, key, value);
- if (ret != NNS_EDGE_ERROR_NONE) {
- nns_edge_metadata_free (meta);
- return ret;
- }
- }
-
- return NNS_EDGE_ERROR_NONE;
-}
+++ /dev/null
-/* SPDX-License-Identifier: Apache-2.0 */
-/**
- * Copyright (C) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
- *
- * @file nnstreamer-edge-common.h
- * @date 6 April 2022
- * @brief Common util functions for nnstreamer edge.
- * @see https://github.com/nnstreamer/nnstreamer
- * @author Gichan Jang <gichan2.jang@samsung.com>
- * @bug No known bugs except for NYI items
- * @note This file is internal header for nnstreamer edge utils. DO NOT export this file.
- * @todo Rename this to nnstreamer-edge-meta after separating util functions.
- */
-
-#ifndef __NNSTREAMER_EDGE_COMMON_H__
-#define __NNSTREAMER_EDGE_COMMON_H__
-
-#include "nnstreamer-edge.h"
-#include "nnstreamer-edge-internal.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/**
- * @brief Internal function to initialize metadata structure.
- */
-int nns_edge_metadata_init (nns_edge_metadata_s *meta);
-
-/**
- * @brief Internal function to free the list and items in metadata structure.
- */
-int nns_edge_metadata_free (nns_edge_metadata_s *meta);
-
-/**
- * @brief Internal function to set the metadata.
- */
-int nns_edge_metadata_set (nns_edge_metadata_s *meta, const char *key, const char *value);
-
-/**
- * @brief Internal function to get the metadata in the list. Caller should release the returned value using free().
- */
-int nns_edge_metadata_get (nns_edge_metadata_s *meta, const char *key, char **value);
-
-/**
- * @brief Internal function to copy the metadata.
- */
-int nns_edge_metadata_copy (nns_edge_metadata_s *dest, nns_edge_metadata_s *src);
-
-/**
- * @brief Internal function to serialize the metadata. Caller should release the returned value using free().
- */
-int nns_edge_metadata_serialize (nns_edge_metadata_s *meta, void **data, size_t *data_len);
-
-/**
- * @brief Internal function to deserialize memory into metadata.
- */
-int nns_edge_metadata_deserialize (nns_edge_metadata_s *meta, void *data, size_t data_len);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* __NNSTREAMER_EDGE_COMMON_H__ */
#include "nnstreamer-edge-data.h"
#include "nnstreamer-edge-log.h"
-#include "nnstreamer-edge-common.h"
#include "nnstreamer-edge-util.h"
/**
nns_edge_lock_init (ed);
ed->magic = NNS_EDGE_MAGIC;
- nns_edge_metadata_init (&ed->metadata);
+ nns_edge_metadata_create (&ed->metadata);
*data_h = ed;
return NNS_EDGE_ERROR_NONE;
ed->data[i].destroy_cb (ed->data[i].data);
}
- nns_edge_metadata_free (&ed->metadata);
+ nns_edge_metadata_destroy (ed->metadata);
nns_edge_unlock (ed);
nns_edge_lock_destroy (ed);
copied->data[i].destroy_cb = nns_edge_free;
}
- ret = nns_edge_metadata_copy (&copied->metadata, &ed->metadata);
+ ret = nns_edge_metadata_copy (copied->metadata, ed->metadata);
done:
if (ret != NNS_EDGE_ERROR_NONE) {
return NNS_EDGE_ERROR_INVALID_PARAMETER;
}
- ret = nns_edge_metadata_set (&ed->metadata, key, value);
+ ret = nns_edge_metadata_set (ed->metadata, key, value);
nns_edge_unlock (ed);
return ret;
return NNS_EDGE_ERROR_INVALID_PARAMETER;
}
- ret = nns_edge_metadata_get (&ed->metadata, key, value);
+ ret = nns_edge_metadata_get (ed->metadata, key, value);
nns_edge_unlock (ed);
return ret;
return NNS_EDGE_ERROR_INVALID_PARAMETER;
}
- ret = nns_edge_metadata_serialize (&ed->metadata, data, data_len);
+ ret = nns_edge_metadata_serialize (ed->metadata, data, data_len);
nns_edge_unlock (ed);
return ret;
return NNS_EDGE_ERROR_INVALID_PARAMETER;
}
- ret = nns_edge_metadata_deserialize (&ed->metadata, data, data_len);
+ ret = nns_edge_metadata_deserialize (ed->metadata, data, data_len);
nns_edge_unlock (ed);
return ret;
data_len += ed->data[n].data_len;
}
- ret = nns_edge_metadata_serialize (&ed->metadata, &meta_serialized,
+ ret = nns_edge_metadata_serialize (ed->metadata, &meta_serialized,
&edata_header.meta_len);
if (NNS_EDGE_ERROR_NONE != ret) {
goto done;
ptr += ed->data[n].data_len;
}
- ret = nns_edge_metadata_deserialize (&ed->metadata, ptr, meta_len);
+ ret = nns_edge_metadata_deserialize (ed->metadata, ptr, meta_len);
nns_edge_unlock (ed);
return ret;
#include "nnstreamer-edge.h"
#include "nnstreamer-edge-internal.h"
+#include "nnstreamer-edge-metadata.h"
#ifdef __cplusplus
extern "C" {
pthread_mutex_t lock;
unsigned int num;
nns_edge_raw_data_s data[NNS_EDGE_DATA_LIMIT];
- nns_edge_metadata_s metadata;
+ nns_edge_metadata_h metadata;
} nns_edge_data_s;
/**
#include "nnstreamer-edge-data.h"
#include "nnstreamer-edge-event.h"
#include "nnstreamer-edge-log.h"
-#include "nnstreamer-edge-common.h"
#include "nnstreamer-edge-util.h"
#include "nnstreamer-edge-internal.h"
eh->node_type = node_type;
eh->broker_h = NULL;
eh->connections = NULL;
- nns_edge_metadata_init (&eh->meta);
eh->listening = false;
eh->listener_fd = -1;
+ nns_edge_metadata_create (&eh->metadata);
nns_edge_queue_create (&eh->send_queue);
*edge_h = eh;
_nns_edge_remove_all_connection (eh);
- nns_edge_metadata_free (&eh->meta);
+ nns_edge_metadata_destroy (eh->metadata);
+ eh->metadata = NULL;
SAFE_FREE (eh->id);
SAFE_FREE (eh->topic);
SAFE_FREE (eh->host);
nns_edge_loge ("Cannot update %s.", key);
ret = NNS_EDGE_ERROR_INVALID_PARAMETER;
} else {
- ret = nns_edge_metadata_set (&eh->meta, key, value);
+ ret = nns_edge_metadata_set (eh->metadata, key, value);
}
nns_edge_unlock (eh);
*value = nns_edge_strdup_printf ("%lld", (long long) eh->client_id);
}
} else {
- ret = nns_edge_metadata_get (&eh->meta, key, value);
+ ret = nns_edge_metadata_get (eh->metadata, key, value);
}
nns_edge_unlock (eh);
#endif /* __cplusplus */
#include "nnstreamer-edge.h"
+#include "nnstreamer-edge-metadata.h"
#include "nnstreamer-edge-queue.h"
typedef void *nns_edge_broker_h;
nns_edge_data_destroy_cb destroy_cb;
} nns_edge_raw_data_s;
-/**
- * @brief Internal data structure for metadata.
- */
-typedef struct _nns_edge_metadata_node_s nns_edge_metadata_node_s;
-
-/**
- * @brief Internal data structure for metadata.
- */
-struct _nns_edge_metadata_node_s {
- char *key;
- char *value;
- nns_edge_metadata_node_s *next;
-};
-
-/**
- * @brief Internal data structure to handle metadata. This struct should be managed in the handle.
- */
-typedef struct {
- unsigned int list_len;
- nns_edge_metadata_node_s *list;
-} nns_edge_metadata_s;
-
/**
* @brief Internal data structure for edge event.
*/
char *dest_host; /**< destination IP address (broker or target device) */
int dest_port; /**< destination port number (broker or target device) */
nns_edge_node_type_e node_type;
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h metadata;
/* Edge event callback and user data */
nns_edge_event_cb event_cb;
--- /dev/null
+/* SPDX-License-Identifier: Apache-2.0 */
+/**
+ * Copyright (C) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
+ *
+ * @file nnstreamer-edge-metadata.c
+ * @date 6 April 2022
+ * @brief Util functions for metadata.
+ * @see https://github.com/nnstreamer/nnstreamer
+ * @author Gichan Jang <gichan2.jang@samsung.com>
+ * @bug No known bugs except for NYI items
+ */
+
+#include "nnstreamer-edge-metadata.h"
+#include "nnstreamer-edge-util.h"
+
+/**
+ * @brief Internal data structure for metadata.
+ */
+typedef struct _nns_edge_metadata_node_s nns_edge_metadata_node_s;
+
+/**
+ * @brief Internal data structure for metadata.
+ */
+struct _nns_edge_metadata_node_s
+{
+ char *key;
+ char *value;
+ nns_edge_metadata_node_s *next;
+};
+
+/**
+ * @brief Internal data structure to handle metadata. This struct should be managed in the handle.
+ */
+typedef struct
+{
+ unsigned int list_len;
+ nns_edge_metadata_node_s *list;
+} nns_edge_metadata_s;
+
+/**
+ * @brief Internal function to find node in the list.
+ */
+static nns_edge_metadata_node_s *
+nns_edge_metadata_find (nns_edge_metadata_s * meta, const char *key)
+{
+ nns_edge_metadata_node_s *node;
+
+ if (!meta)
+ return NULL;
+
+ if (!STR_IS_VALID (key))
+ return NULL;
+
+ node = meta->list;
+ while (node) {
+ if (strcasecmp (key, node->key) == 0)
+ return node;
+
+ node = node->next;
+ }
+
+ return NULL;
+}
+
+/**
+ * @brief Internal function to initialize metadata structure.
+ */
+static int
+nns_edge_metadata_init (nns_edge_metadata_s * meta)
+{
+ if (!meta)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ memset (meta, 0, sizeof (nns_edge_metadata_s));
+ return NNS_EDGE_ERROR_NONE;
+}
+
+/**
+ * @brief Internal function to free the list and items in metadata structure.
+ */
+static int
+nns_edge_metadata_free (nns_edge_metadata_s * meta)
+{
+ nns_edge_metadata_node_s *node, *tmp;
+
+ if (!meta)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ node = meta->list;
+ meta->list_len = 0;
+ meta->list = NULL;
+
+ while (node) {
+ tmp = node->next;
+
+ SAFE_FREE (node->key);
+ SAFE_FREE (node->value);
+ SAFE_FREE (node);
+
+ node = tmp;
+ }
+
+ return NNS_EDGE_ERROR_NONE;
+}
+
+/**
+ * @brief Internal function to create metadata.
+ */
+int
+nns_edge_metadata_create (nns_edge_metadata_h * metadata_h)
+{
+ nns_edge_metadata_s *meta;
+
+ if (!metadata_h)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ meta = calloc (1, sizeof (nns_edge_metadata_s));
+ if (!meta)
+ return NNS_EDGE_ERROR_OUT_OF_MEMORY;
+
+ nns_edge_metadata_init (meta);
+
+ *metadata_h = meta;
+ return NNS_EDGE_ERROR_NONE;
+}
+
+/**
+ * @brief Internal function to destroy metadata.
+ */
+int
+nns_edge_metadata_destroy (nns_edge_metadata_h metadata_h)
+{
+ nns_edge_metadata_s *meta;
+
+ meta = (nns_edge_metadata_s *) metadata_h;
+
+ if (!meta)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ nns_edge_metadata_free (meta);
+ free (meta);
+
+ return NNS_EDGE_ERROR_NONE;
+}
+
+/**
+ * @brief Internal function to set the metadata.
+ */
+int
+nns_edge_metadata_set (nns_edge_metadata_h metadata_h,
+ const char *key, const char *value)
+{
+ nns_edge_metadata_s *meta;
+ nns_edge_metadata_node_s *node;
+
+ meta = (nns_edge_metadata_s *) metadata_h;
+
+ if (!meta)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ if (!STR_IS_VALID (key))
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ if (!STR_IS_VALID (value))
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ /* Replace old value if key exists in the list. */
+ node = nns_edge_metadata_find (meta, key);
+ if (node) {
+ char *val = nns_edge_strdup (value);
+
+ if (!val)
+ return NNS_EDGE_ERROR_OUT_OF_MEMORY;
+
+ SAFE_FREE (node->value);
+ node->value = val;
+ return NNS_EDGE_ERROR_NONE;
+ }
+
+ node = calloc (1, sizeof (nns_edge_metadata_node_s));
+ if (!node)
+ return NNS_EDGE_ERROR_OUT_OF_MEMORY;
+
+ node->key = nns_edge_strdup (key);
+ node->value = nns_edge_strdup (value);
+
+ if (!node->key || !node->value) {
+ SAFE_FREE (node->key);
+ SAFE_FREE (node->value);
+ SAFE_FREE (node);
+ return NNS_EDGE_ERROR_OUT_OF_MEMORY;
+ }
+
+ /* Prepend new node to the start of the list. */
+ meta->list_len++;
+ node->next = meta->list;
+ meta->list = node;
+
+ return NNS_EDGE_ERROR_NONE;
+}
+
+/**
+ * @brief Internal function to get the metadata in the list. Caller should release the returned value using free().
+ */
+int
+nns_edge_metadata_get (nns_edge_metadata_h metadata_h,
+ const char *key, char **value)
+{
+ nns_edge_metadata_s *meta;
+ nns_edge_metadata_node_s *node;
+
+ meta = (nns_edge_metadata_s *) metadata_h;
+
+ if (!value)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ node = nns_edge_metadata_find (meta, key);
+ if (node) {
+ *value = nns_edge_strdup (node->value);
+ return (*value) ? NNS_EDGE_ERROR_NONE : NNS_EDGE_ERROR_OUT_OF_MEMORY;
+ }
+
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+}
+
+/**
+ * @brief Internal function to copy the metadata.
+ */
+int
+nns_edge_metadata_copy (nns_edge_metadata_h dest_h, nns_edge_metadata_h src_h)
+{
+ nns_edge_metadata_s *dest, *src;
+ nns_edge_metadata_s tmp;
+ nns_edge_metadata_node_s *node;
+ int ret;
+
+ dest = (nns_edge_metadata_s *) dest_h;
+ src = (nns_edge_metadata_s *) src_h;
+
+ if (!dest || !src)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ nns_edge_metadata_init (&tmp);
+
+ node = src->list;
+ while (node) {
+ ret = nns_edge_metadata_set (&tmp, node->key, node->value);
+ if (ret != NNS_EDGE_ERROR_NONE) {
+ nns_edge_metadata_free (&tmp);
+ return ret;
+ }
+
+ node = node->next;
+ }
+
+ /* Replace dest when new metadata is successfully copied. */
+ nns_edge_metadata_free (dest);
+ *dest = tmp;
+
+ return NNS_EDGE_ERROR_NONE;
+}
+
+/**
+ * @brief Internal function to serialize the metadata. Caller should release the returned value using free().
+ */
+int
+nns_edge_metadata_serialize (nns_edge_metadata_h metadata_h,
+ void **data, size_t *data_len)
+{
+ nns_edge_metadata_s *meta;
+ nns_edge_metadata_node_s *node;
+ char *serialized, *ptr;
+ size_t total, len;
+
+ meta = (nns_edge_metadata_s *) metadata_h;
+
+ if (!meta)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ if (!data || !data_len)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ *data = NULL;
+ *data_len = 0U;
+
+ if (meta->list_len == 0)
+ return NNS_EDGE_ERROR_NONE;
+
+ total = len = sizeof (unsigned int);
+
+ node = meta->list;
+ while (node) {
+ total += (strlen (node->key) + strlen (node->value) + 2);
+ node = node->next;
+ }
+
+ serialized = ptr = (char *) malloc (total);
+ if (!serialized)
+ return NNS_EDGE_ERROR_OUT_OF_MEMORY;
+
+ /* length + list of key-value pair */
+ ((unsigned int *) serialized)[0] = meta->list_len;
+ ptr += len;
+
+ node = meta->list;
+ while (node) {
+ len = strlen (node->key);
+ memcpy (ptr, node->key, len);
+ ptr[len] = '\0';
+ ptr += (len + 1);
+
+ len = strlen (node->value);
+ memcpy (ptr, node->value, len);
+ ptr[len] = '\0';
+ ptr += (len + 1);
+
+ node = node->next;
+ }
+
+ *data = serialized;
+ *data_len = total;
+
+ return NNS_EDGE_ERROR_NONE;
+}
+
+/**
+ * @brief Internal function to deserialize memory into metadata.
+ */
+int
+nns_edge_metadata_deserialize (nns_edge_metadata_h metadata_h,
+ void *data, size_t data_len)
+{
+ nns_edge_metadata_s *meta;
+ char *key, *value;
+ size_t cur;
+ unsigned int total;
+ int ret;
+
+ meta = (nns_edge_metadata_s *) metadata_h;
+
+ if (!meta)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ if (!data || data_len <= 0)
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+
+ nns_edge_metadata_free (meta);
+
+ /* length + list of key-value pair */
+ total = ((unsigned int *) data)[0];
+
+ cur = sizeof (unsigned int);
+ while (cur < data_len || meta->list_len < total) {
+ key = (char *) data + cur;
+ cur += (strlen (key) + 1);
+
+ value = (char *) data + cur;
+ cur += (strlen (value) + 1);
+
+ ret = nns_edge_metadata_set (meta, key, value);
+ if (ret != NNS_EDGE_ERROR_NONE) {
+ nns_edge_metadata_free (meta);
+ return ret;
+ }
+ }
+
+ return NNS_EDGE_ERROR_NONE;
+}
--- /dev/null
+/* SPDX-License-Identifier: Apache-2.0 */
+/**
+ * Copyright (C) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
+ *
+ * @file nnstreamer-edge-metadata.h
+ * @date 6 April 2022
+ * @brief Util functions for metadata.
+ * @see https://github.com/nnstreamer/nnstreamer
+ * @author Gichan Jang <gichan2.jang@samsung.com>
+ * @bug No known bugs except for NYI items
+ * @note This file is internal header to handle metadata. DO NOT export this file.
+ */
+
+#ifndef __NNSTREAMER_EDGE_METADATA_H__
+#define __NNSTREAMER_EDGE_METADATA_H__
+
+#include "nnstreamer-edge.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+typedef void *nns_edge_metadata_h;
+
+/**
+ * @brief Internal function to create metadata.
+ */
+int nns_edge_metadata_create (nns_edge_metadata_h *metadata_h);
+
+/**
+ * @brief Internal function to destroy metadata.
+ */
+int nns_edge_metadata_destroy (nns_edge_metadata_h metadata_h);
+
+/**
+ * @brief Internal function to set the metadata.
+ */
+int nns_edge_metadata_set (nns_edge_metadata_h metadata_h, const char *key, const char *value);
+
+/**
+ * @brief Internal function to get the metadata in the list. Caller should release the returned value using free().
+ */
+int nns_edge_metadata_get (nns_edge_metadata_h metadata_h, const char *key, char **value);
+
+/**
+ * @brief Internal function to copy the metadata.
+ */
+int nns_edge_metadata_copy (nns_edge_metadata_h dest_h, nns_edge_metadata_h src_h);
+
+/**
+ * @brief Internal function to serialize the metadata. Caller should release the returned value using free().
+ */
+int nns_edge_metadata_serialize (nns_edge_metadata_h metadata_h, void **data, size_t *data_len);
+
+/**
+ * @brief Internal function to deserialize memory into metadata.
+ */
+int nns_edge_metadata_deserialize (nns_edge_metadata_h metadata_h, void *data, size_t data_len);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __NNSTREAMER_EDGE_METADATA_H__ */
#include <gtest/gtest.h>
#include "nnstreamer-edge.h"
-#include "nnstreamer-edge-common.h"
#include "nnstreamer-edge-internal.h"
#include "nnstreamer-edge-log.h"
#include "nnstreamer-edge-util.h"
#include "nnstreamer-edge.h"
#include "nnstreamer-edge-data.h"
#include "nnstreamer-edge-event.h"
-#include "nnstreamer-edge-common.h"
+#include "nnstreamer-edge-metadata.h"
#include "nnstreamer-edge-internal.h"
#include "nnstreamer-edge-log.h"
#include "nnstreamer-edge-util.h"
}
/**
- * @brief Initialize edge metadata - invalid param.
+ * @brief Create edge metadata - invalid param.
*/
-TEST(edgeMeta, initInvalidParam01_n)
+TEST(edgeMeta, createInvalidParam01_n)
{
int ret;
- ret = nns_edge_metadata_init (NULL);
+ ret = nns_edge_metadata_create (NULL);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
}
/**
- * @brief Release resources of edge metadata - invalid param.
+ * @brief Destroy edge metadata - invalid param.
*/
-TEST(edgeMeta, freeInvalidParam01_n)
+TEST(edgeMeta, destroyInvalidParam01_n)
{
int ret;
- ret = nns_edge_metadata_free (NULL);
+ ret = nns_edge_metadata_destroy (NULL);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, setInvalidParam02_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&meta, NULL, "temp-value");
+ ret = nns_edge_metadata_set (meta, NULL, "temp-value");
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, setInvalidParam03_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&meta, "", "temp-value");
+ ret = nns_edge_metadata_set (meta, "", "temp-value");
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, setInvalidParam04_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&meta, "temp-key", NULL);
+ ret = nns_edge_metadata_set (meta, "temp-key", NULL);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, setInvalidParam05_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&meta, "temp-key", "");
+ ret = nns_edge_metadata_set (meta, "temp-key", "");
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, getInvalidParam02_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
char *value = NULL;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_get (&meta, NULL, &value);
+ ret = nns_edge_metadata_get (meta, NULL, &value);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, getInvalidParam03_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
char *value = NULL;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_get (&meta, "", &value);
+ ret = nns_edge_metadata_get (meta, "", &value);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, getInvalidParam04_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_get (&meta, "temp-key", NULL);
+ ret = nns_edge_metadata_get (meta, "temp-key", NULL);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, copy)
{
- nns_edge_metadata_s src, desc;
+ nns_edge_metadata_h src, desc;
char *value = NULL;
int ret;
- ret = nns_edge_metadata_init (&src);
+ ret = nns_edge_metadata_create (&src);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_init (&desc);
+ ret = nns_edge_metadata_create (&desc);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&src, "temp-key1", "temp-value1");
+ ret = nns_edge_metadata_set (src, "temp-key1", "temp-value1");
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&src, "temp-key2", "temp-value2");
+ ret = nns_edge_metadata_set (src, "temp-key2", "temp-value2");
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
/* Replace old value */
- ret = nns_edge_metadata_set (&src, "temp-key2", "temp-value2-replaced");
+ ret = nns_edge_metadata_set (src, "temp-key2", "temp-value2-replaced");
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_copy (&desc, &src);
+ ret = nns_edge_metadata_copy (desc, src);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_get (&desc, "temp-key1", &value);
+ ret = nns_edge_metadata_get (desc, "temp-key1", &value);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
EXPECT_STREQ (value, "temp-value1");
nns_edge_free (value);
- ret = nns_edge_metadata_get (&desc, "temp-key2", &value);
+ ret = nns_edge_metadata_get (desc, "temp-key2", &value);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
EXPECT_STREQ (value, "temp-value2-replaced");
nns_edge_free (value);
- ret = nns_edge_metadata_free (&src);
+ ret = nns_edge_metadata_destroy (src);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&desc);
+ ret = nns_edge_metadata_destroy (desc);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, copyInvalidParam01_n)
{
- nns_edge_metadata_s src;
+ nns_edge_metadata_h src;
int ret;
- ret = nns_edge_metadata_init (&src);
+ ret = nns_edge_metadata_create (&src);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_copy (NULL, &src);
+ ret = nns_edge_metadata_copy (NULL, src);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&src);
+ ret = nns_edge_metadata_destroy (src);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, copyInvalidParam02_n)
{
- nns_edge_metadata_s desc;
+ nns_edge_metadata_h desc;
int ret;
- ret = nns_edge_metadata_init (&desc);
+ ret = nns_edge_metadata_create (&desc);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_copy (&desc, NULL);
+ ret = nns_edge_metadata_copy (desc, NULL);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&desc);
+ ret = nns_edge_metadata_destroy (desc);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, serialize)
{
- nns_edge_metadata_s src, desc;
+ nns_edge_metadata_h src, desc;
char *value;
void *data;
size_t data_len;
int ret;
- ret = nns_edge_metadata_init (&src);
+ ret = nns_edge_metadata_create (&src);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_init (&desc);
+ ret = nns_edge_metadata_create (&desc);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&src, "temp-key1", "temp-value1");
+ ret = nns_edge_metadata_set (src, "temp-key1", "temp-value1");
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&src, "temp-key2", "temp-value2");
+ ret = nns_edge_metadata_set (src, "temp-key2", "temp-value2");
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_set (&src, "temp-key3", "temp-value3");
+ ret = nns_edge_metadata_set (src, "temp-key3", "temp-value3");
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- EXPECT_EQ (src.list_len, 3U);
- EXPECT_EQ (desc.list_len, 0U);
-
- ret = nns_edge_metadata_serialize (&src, &data, &data_len);
+ ret = nns_edge_metadata_serialize (src, &data, &data_len);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_deserialize (&desc, data, data_len);
+ ret = nns_edge_metadata_deserialize (desc, data, data_len);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- EXPECT_EQ (desc.list_len, 3U);
- ret = nns_edge_metadata_get (&desc, "temp-key1", &value);
+ ret = nns_edge_metadata_get (desc, "temp-key1", &value);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
EXPECT_STREQ (value, "temp-value1");
nns_edge_free (value);
- ret = nns_edge_metadata_get (&desc, "temp-key2", &value);
+ ret = nns_edge_metadata_get (desc, "temp-key2", &value);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
EXPECT_STREQ (value, "temp-value2");
nns_edge_free (value);
- ret = nns_edge_metadata_get (&desc, "temp-key3", &value);
+ ret = nns_edge_metadata_get (desc, "temp-key3", &value);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
EXPECT_STREQ (value, "temp-value3");
nns_edge_free (value);
- ret = nns_edge_metadata_free (&src);
+ ret = nns_edge_metadata_destroy (src);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&desc);
+ ret = nns_edge_metadata_destroy (desc);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
free (data);
*/
TEST(edgeMeta, serializeInvalidParam02_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
size_t data_len;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_serialize (&meta, NULL, &data_len);
+ ret = nns_edge_metadata_serialize (meta, NULL, &data_len);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, serializeInvalidParam03_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
void *data;
int ret;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_serialize (&meta, &data, NULL);
+ ret = nns_edge_metadata_serialize (meta, &data, NULL);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, deserializeInvalidParam02_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
size_t data_len;
int ret;
data_len = 10U + sizeof (unsigned int);
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_deserialize (&meta, NULL, data_len);
+ ret = nns_edge_metadata_deserialize (meta, NULL, data_len);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
}
*/
TEST(edgeMeta, deserializeInvalidParam03_n)
{
- nns_edge_metadata_s meta;
+ nns_edge_metadata_h meta;
void *data;
size_t data_len;
int ret;
ASSERT_TRUE (data != NULL);
((unsigned int *) data)[0] = 0U;
- ret = nns_edge_metadata_init (&meta);
+ ret = nns_edge_metadata_create (&meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_deserialize (&meta, data, 0);
+ ret = nns_edge_metadata_deserialize (meta, data, 0);
EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);
- ret = nns_edge_metadata_free (&meta);
+ ret = nns_edge_metadata_destroy (meta);
EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);
free (data);