-BT_HIDDEN
-const char *get_byte_order_string(enum bt_byte_order byte_order)
-{
- const char *string;
-
- switch (byte_order) {
- case BT_BYTE_ORDER_LITTLE_ENDIAN:
- string = "le";
- break;
- case BT_BYTE_ORDER_BIG_ENDIAN:
- string = "be";
- break;
- case BT_BYTE_ORDER_NATIVE:
- string = "native";
- break;
- default:
- abort();
- }
-
- return string;
-}
-
-static
-int append_trace_metadata(struct bt_trace *trace,
- struct metadata_context *context)
-{
- unsigned char *uuid = trace->uuid;
- int ret = 0;
-
- if (trace->native_byte_order == BT_BYTE_ORDER_NATIVE ||
- trace->native_byte_order == BT_BYTE_ORDER_UNSPECIFIED) {
- BT_LOGW("Invalid parameter: trace's byte order cannot be BT_BYTE_ORDER_NATIVE or BT_BYTE_ORDER_UNSPECIFIED at this point; "
- "set it with bt_trace_set_native_byte_order(): "
- "addr=%p, name=\"%s\"",
- trace, bt_trace_get_name(trace));
- ret = -1;
- goto end;
- }
-
- g_string_append(context->string, "trace {\n");
- g_string_append(context->string, "\tmajor = 1;\n");
- g_string_append(context->string, "\tminor = 8;\n");
- assert(trace->native_byte_order == BT_BYTE_ORDER_LITTLE_ENDIAN ||
- trace->native_byte_order == BT_BYTE_ORDER_BIG_ENDIAN ||
- trace->native_byte_order == BT_BYTE_ORDER_NETWORK);
-
- if (trace->uuid_set) {
- g_string_append_printf(context->string,
- "\tuuid = \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\";\n",
- uuid[0], uuid[1], uuid[2], uuid[3],
- uuid[4], uuid[5], uuid[6], uuid[7],
- uuid[8], uuid[9], uuid[10], uuid[11],
- uuid[12], uuid[13], uuid[14], uuid[15]);
- }
-
- g_string_append_printf(context->string, "\tbyte_order = %s;\n",
- get_byte_order_string(trace->native_byte_order));
-
- if (trace->packet_header_type) {
- g_string_append(context->string, "\tpacket.header := ");
- context->current_indentation_level++;
- g_string_assign(context->field_name, "");
- BT_LOGD_STR("Serializing trace's packet header field type's metadata.");
- ret = bt_field_type_serialize(trace->packet_header_type,
- context);
- if (ret) {
- goto end;
- }
- context->current_indentation_level--;
- }
-
- g_string_append(context->string, ";\n};\n\n");
-end:
- return ret;
-}
-
-static
-void append_env_metadata(struct bt_trace *trace,
- struct metadata_context *context)
-{
- int64_t i;
- int64_t env_size;
-
- env_size = bt_attributes_get_count(trace->environment);
- if (env_size <= 0) {
- return;
- }
-
- g_string_append(context->string, "env {\n");
-
- for (i = 0; i < env_size; i++) {
- struct bt_value *env_field_value_obj = NULL;
- const char *entry_name;
-
- entry_name = bt_attributes_get_field_name(
- trace->environment, i);
- env_field_value_obj = bt_attributes_get_field_value(
- trace->environment, i);
-
- assert(entry_name);
- assert(env_field_value_obj);
-
- switch (bt_value_get_type(env_field_value_obj)) {
- case BT_VALUE_TYPE_INTEGER:
- {
- int ret;
- int64_t int_value;
-
- ret = bt_value_integer_get(env_field_value_obj,
- &int_value);
- assert(ret == 0);
- g_string_append_printf(context->string,
- "\t%s = %" PRId64 ";\n", entry_name,
- int_value);
- break;
- }
- case BT_VALUE_TYPE_STRING:
- {
- int ret;
- const char *str_value;
- char *escaped_str = NULL;
-
- ret = bt_value_string_get(env_field_value_obj,
- &str_value);
- assert(ret == 0);
- escaped_str = g_strescape(str_value, NULL);
- if (!escaped_str) {
- BT_LOGE("Cannot escape string: string=\"%s\"",
- str_value);
- goto loop_next;
- }
-
- g_string_append_printf(context->string,
- "\t%s = \"%s\";\n", entry_name, escaped_str);
- free(escaped_str);
- break;
- }
- default:
- goto loop_next;
- }
-
-loop_next:
- BT_PUT(env_field_value_obj);
- }
-
- g_string_append(context->string, "};\n\n");
-}
-
-char *bt_trace_get_metadata_string(struct bt_trace *trace)
-{
- char *metadata = NULL;
- struct metadata_context *context = NULL;
- int err = 0;
- size_t i;
-
- if (!trace) {
- BT_LOGW_STR("Invalid parameter: trace is NULL.");
- goto end;
- }
-
- context = g_new0(struct metadata_context, 1);
- if (!context) {
- BT_LOGE_STR("Failed to allocate one metadata context.");
- goto end;
- }
-
- context->field_name = g_string_sized_new(DEFAULT_IDENTIFIER_SIZE);
- context->string = g_string_sized_new(DEFAULT_METADATA_STRING_SIZE);
- g_string_append(context->string, "/* CTF 1.8 */\n\n");
- if (append_trace_metadata(trace, context)) {
- /* append_trace_metadata() logs errors */
- goto error;
- }
- append_env_metadata(trace, context);
- g_ptr_array_foreach(trace->clocks,
- (GFunc)bt_clock_class_serialize, context);
-
- for (i = 0; i < trace->stream_classes->len; i++) {
- /* bt_stream_class_serialize() logs details */
- err = bt_stream_class_serialize(
- trace->stream_classes->pdata[i], context);
- if (err) {
- /* bt_stream_class_serialize() logs errors */
- goto error;
- }
- }
-
- metadata = context->string->str;
-
-error:
- g_string_free(context->string, err ? TRUE : FALSE);
- g_string_free(context->field_name, TRUE);
- g_free(context);
-
-end:
- return metadata;
-}
-