return nns_edge_metadata_get (&ed->metadata, key, value);
}
+
+/**
+ * @brief Serialize metadata in edge data.
+ * @note This is internal function, DO NOT export this. Caller should release the returned value using free().
+ */
+int
+nns_edge_data_serialize_meta (nns_edge_data_h data_h, void **data,
+ size_t *data_len)
+{
+ nns_edge_data_s *ed;
+
+ ed = (nns_edge_data_s *) data_h;
+
+ if (!NNS_EDGE_MAGIC_IS_VALID (ed)) {
+ nns_edge_loge ("Invalid param, given edge data is invalid.");
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+ }
+
+ return nns_edge_metadata_serialize (&ed->metadata, data, data_len);
+}
+
+/**
+ * @brief Deserialize metadata in edge data.
+ * @note This is internal function, DO NOT export this. Caller should release the returned value using free().
+ */
+int
+nns_edge_data_deserialize_meta (nns_edge_data_h data_h, void *data,
+ size_t data_len)
+{
+ nns_edge_data_s *ed;
+
+ ed = (nns_edge_data_s *) data_h;
+
+ if (!NNS_EDGE_MAGIC_IS_VALID (ed)) {
+ nns_edge_loge ("Invalid param, given edge data is invalid.");
+ return NNS_EDGE_ERROR_INVALID_PARAMETER;
+ }
+
+ return nns_edge_metadata_deserialize (&ed->metadata, data, data_len);
+}
*/
int nns_edge_data_is_valid (nns_edge_data_h data_h);
+/**
+ * @brief Serialize metadata in edge data.
+ * @note This is internal function, DO NOT export this. Caller should release the returned value using free().
+ */
+int nns_edge_data_serialize_meta (nns_edge_data_h data_h, void **data, size_t *data_len);
+
+/**
+ * @brief Deserialize metadata in edge data.
+ * @note This is internal function, DO NOT export this. Caller should release the returned value using free().
+ */
+int nns_edge_data_deserialize_meta (nns_edge_data_h data_h, void *data, size_t data_len);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
/* memory info */
uint32_t num;
size_t mem_size[NNS_EDGE_DATA_LIMIT];
+ size_t meta_size;
} nns_edge_cmd_info_s;
/**
{
nns_edge_cmd_info_s info;
void *mem[NNS_EDGE_DATA_LIMIT];
+ void *meta;
} nns_edge_cmd_s;
/**
for (i = 0; i < cmd->info.num; i++) {
SAFE_FREE (cmd->mem[i]);
+ cmd->info.mem_size[i] = 0U;
}
+
+ SAFE_FREE (cmd->meta);
+
+ cmd->info.num = 0U;
+ cmd->info.meta_size = 0U;
}
/**
}
}
+ if (cmd->info.meta_size > 0) {
+ if (!_send_raw_data (conn->socket, cmd->meta, cmd->info.meta_size)) {
+ nns_edge_loge ("Failed to send metadata to socket.");
+ return NNS_EDGE_ERROR_IO;
+ }
+ }
+
return NNS_EDGE_ERROR_NONE;
}
/**
* @brief Receive edge command from connected device.
+ * @note Before calling this function, you should initialize edge-cmd by using _nns_edge_cmd_init().
*/
static int
_nns_edge_cmd_receive (nns_edge_conn_s * conn, nns_edge_cmd_s * cmd)
{
- unsigned int i, n;
+ unsigned int n;
int ret = NNS_EDGE_ERROR_NONE;
if (!conn || !cmd)
if (!cmd->mem[n]) {
nns_edge_loge ("Failed to allocate memory to receive data from socket.");
ret = NNS_EDGE_ERROR_OUT_OF_MEMORY;
- break;
+ goto error;
}
if (!_receive_raw_data (conn->socket, cmd->mem[n], cmd->info.mem_size[n])) {
nns_edge_loge ("Failed to receive %uth memory from socket.", n++);
ret = NNS_EDGE_ERROR_IO;
- break;
+ goto error;
}
}
- if (ret != NNS_EDGE_ERROR_NONE) {
- for (i = 0; i < n; i++) {
- SAFE_FREE (cmd->mem[i]);
+ if (cmd->info.meta_size > 0) {
+ cmd->meta = malloc (cmd->info.meta_size);
+ if (!cmd->meta) {
+ nns_edge_loge ("Failed to allocate memory to receive meta from socket.");
+ ret = NNS_EDGE_ERROR_OUT_OF_MEMORY;
+ goto error;
+ }
+
+ if (!_receive_raw_data (conn->socket, cmd->meta, cmd->info.meta_size)) {
+ nns_edge_loge ("Failed to receive metadata from socket.");
+ ret = NNS_EDGE_ERROR_IO;
+ goto error;
}
}
+ return NNS_EDGE_ERROR_NONE;
+
+error:
+ _nns_edge_cmd_clear (cmd);
return ret;
}
for (i = 0; i < cmd.info.num; i++)
nns_edge_data_get (data_h, i, &cmd.mem[i], &cmd.info.mem_size[i]);
+ nns_edge_data_serialize_meta (data_h, &cmd.meta, &cmd.info.meta_size);
+
ret = _nns_edge_cmd_send (conn, &cmd);
+ SAFE_FREE (cmd.meta);
return ret;
}
for (i = 0; i < cmd.info.num; i++)
nns_edge_data_add (data_h, cmd.mem[i], cmd.info.mem_size[i], NULL);
+ if (cmd.info.meta_size > 0)
+ nns_edge_data_deserialize_meta (data_h, cmd.meta, cmd.info.meta_size);
+
/* Set client ID in edge data */
val = nns_edge_strdup_printf ("%ld", (long int) client_id);
nns_edge_data_set_info (data_h, "client_id", val);