ir: add bt_ctf_event_get_payload_field()
[babeltrace.git] / formats / ctf / ir / event.c
index 6fbfb4467a3420a92964c98f9542b494191ab132..d5c66c4d87de50bdd13302c07228413993734b03 100644 (file)
@@ -36,6 +36,7 @@
 #include <babeltrace/ctf-ir/stream-class-internal.h>
 #include <babeltrace/ctf-ir/trace-internal.h>
 #include <babeltrace/ctf-ir/utils.h>
+#include <babeltrace/ctf-ir/attributes-internal.h>
 #include <babeltrace/compiler.h>
 
 static
@@ -137,7 +138,7 @@ end:
 int64_t bt_ctf_event_class_get_id(struct bt_ctf_event_class *event_class)
 {
        struct bt_object *obj = NULL;
-       int64_t ret;
+       int64_t ret = 0;
 
        if (!event_class) {
                ret = -1;
@@ -525,10 +526,31 @@ void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class)
        bt_ctf_ref_put(&event_class->ref_count, bt_ctf_event_class_destroy);
 }
 
+BT_HIDDEN
+int bt_ctf_event_class_set_stream_id(struct bt_ctf_event_class *event_class,
+               uint32_t stream_id)
+{
+       int ret = 0;
+       struct bt_object *obj;
+
+       obj = bt_object_integer_create_init(stream_id);
+
+       if (!obj) {
+               ret = -1;
+               goto end;
+       }
+
+       ret = bt_ctf_attributes_set_field_value(event_class->attributes,
+               "stream_id", obj);
+
+end:
+       BT_OBJECT_PUT(obj);
+
+       return ret;
+}
+
 struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class)
 {
-       int ret;
-       struct bt_object *obj = NULL;
        struct bt_ctf_event *event = NULL;
 
        if (!event_class) {
@@ -545,21 +567,6 @@ struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class)
                goto end;
        }
        assert(event_class->stream_class->event_header_type);
-
-       /* set "stream_id" attribute now that we know its value */
-       obj = bt_object_integer_create_init(event_class->stream_class->id);
-       if (!obj) {
-               goto end;
-       }
-
-       ret = bt_ctf_attributes_set_field_value(event_class->attributes,
-               "stream_id", obj);
-       BT_OBJECT_PUT(obj);
-
-       if (ret) {
-               goto end;
-       }
-
        event = g_new0(struct bt_ctf_event, 1);
        if (!event) {
                goto end;
@@ -616,6 +623,22 @@ end:
        return event_class;
 }
 
+struct bt_ctf_stream *bt_ctf_event_get_stream(struct bt_ctf_event *event)
+{
+       struct bt_ctf_stream *stream = NULL;
+
+       if (!event) {
+               goto end;
+       }
+
+       stream = event->stream;
+       if (stream) {
+               bt_ctf_stream_get(stream);
+       }
+end:
+       return stream;
+}
+
 struct bt_ctf_clock *bt_ctf_event_get_clock(struct bt_ctf_event *event)
 {
        struct bt_ctf_clock *clock = NULL;
@@ -681,6 +704,19 @@ end:
        return ret;
 }
 
+struct bt_ctf_field *bt_ctf_event_get_payload_field(struct bt_ctf_event *event)
+{
+       struct bt_ctf_field *payload = NULL;
+
+       if (!event || !event->fields_payload) {
+               goto end;
+       }
+
+       payload = event->fields_payload;
+       bt_ctf_field_get(payload);
+end:
+       return payload;
+}
 
 struct bt_ctf_field *bt_ctf_event_get_payload(struct bt_ctf_event *event,
                const char *name)
@@ -1207,3 +1243,71 @@ int bt_ctf_event_set_stream(struct bt_ctf_event *event,
 end:
        return ret;
 }
+
+struct bt_ctf_event *bt_ctf_event_copy(struct bt_ctf_event *event)
+{
+       struct bt_ctf_event *copy = NULL;
+
+       if (!event) {
+               goto error;
+       }
+
+       copy = g_new0(struct bt_ctf_event, 1);
+       if (!copy) {
+               goto error;
+       }
+
+       bt_ctf_ref_init(&copy->ref_count);
+       copy->event_class = event->event_class;
+       bt_ctf_event_class_get(copy->event_class);
+       copy->stream = event->stream;
+
+       if (event->event_header) {
+               copy->event_header = bt_ctf_field_copy(event->event_header);
+
+               if (!copy->event_header) {
+                       goto error;
+               }
+       }
+
+       if (event->context_payload) {
+               copy->context_payload = bt_ctf_field_copy(
+                       event->context_payload);
+
+               if (!copy->context_payload) {
+                       goto error;
+               }
+       }
+
+       if (event->fields_payload) {
+               copy->fields_payload = bt_ctf_field_copy(event->fields_payload);
+
+               if (!copy->fields_payload) {
+                       goto error;
+               }
+       }
+
+       return copy;
+
+error:
+       if (copy) {
+               if (copy->event_class) {
+                       bt_ctf_event_class_put(copy->event_class);
+               }
+
+               if (copy->event_header) {
+                       bt_ctf_field_put(copy->event_header);
+               }
+
+               if (copy->context_payload) {
+                       bt_ctf_field_put(copy->context_payload);
+               }
+
+               if (copy->fields_payload) {
+                       bt_ctf_field_put(copy->fields_payload);
+               }
+       }
+
+       g_free(copy);
+       return NULL;
+}
This page took 0.024922 seconds and 4 git commands to generate.