Set notification iterator methods to the component class
[babeltrace.git] / lib / component / component-class.c
index 22551f88c54c60d55a3da428adab72b71937e30b..1f6e680aa7efb01d2115764f6c8befffa52e3320 100644 (file)
@@ -29,6 +29,7 @@
 #include <babeltrace/compiler.h>
 #include <babeltrace/component/component-class-internal.h>
 #include <babeltrace/ref.h>
+#include <stdbool.h>
 #include <glib.h>
 
 static
@@ -98,12 +99,14 @@ end:
 }
 
 struct bt_component_class *bt_component_class_source_create(const char *name,
-               bt_component_class_source_init_iterator_method init_iterator_method)
+               bt_component_class_notification_iterator_get_method notification_iterator_get_method,
+               bt_component_class_notification_iterator_next_method notification_iterator_next_method)
 {
        struct bt_component_class_source *source_class = NULL;
        int ret;
 
-       if (!name || !init_iterator_method) {
+       if (!name || !notification_iterator_get_method ||
+                       !notification_iterator_next_method) {
                goto end;
        }
 
@@ -124,19 +127,22 @@ struct bt_component_class *bt_component_class_source_create(const char *name,
                goto end;
        }
 
-       source_class->methods.init_iterator = init_iterator_method;
+       source_class->methods.iterator.get = notification_iterator_get_method;
+       source_class->methods.iterator.next = notification_iterator_next_method;
 
 end:
        return &source_class->parent;
 }
 
 struct bt_component_class *bt_component_class_filter_create(const char *name,
-               bt_component_class_filter_init_iterator_method init_iterator_method)
+               bt_component_class_notification_iterator_get_method notification_iterator_get_method,
+               bt_component_class_notification_iterator_next_method notification_iterator_next_method)
 {
        struct bt_component_class_filter *filter_class = NULL;
        int ret;
 
-       if (!name || !init_iterator_method) {
+       if (!name || !notification_iterator_get_method ||
+                       !notification_iterator_next_method) {
                goto end;
        }
 
@@ -157,7 +163,8 @@ struct bt_component_class *bt_component_class_filter_create(const char *name,
                goto end;
        }
 
-       filter_class->methods.init_iterator = init_iterator_method;
+       filter_class->methods.iterator.get = notification_iterator_get_method;
+       filter_class->methods.iterator.next = notification_iterator_next_method;
 
 end:
        return &filter_class->parent;
@@ -202,7 +209,7 @@ int bt_component_class_set_init_method(
 {
        int ret = 0;
 
-       if (!component_class || !init_method) {
+       if (!component_class || component_class->frozen || !init_method) {
                ret = -1;
                goto end;
        }
@@ -219,7 +226,7 @@ int bt_component_class_set_destroy_method(
 {
        int ret = 0;
 
-       if (!component_class || !destroy_method) {
+       if (!component_class || component_class->frozen || !destroy_method) {
                ret = -1;
                goto end;
        }
@@ -230,13 +237,149 @@ end:
        return ret;
 }
 
-extern int bt_component_class_set_description(
+int bt_component_class_source_set_notification_iterator_init_method(
+               struct bt_component_class *component_class,
+               bt_component_class_notification_iterator_init_method notification_iterator_init_method)
+{
+       struct bt_component_class_source *source_class;
+       int ret = 0;
+
+       if (!component_class || component_class->frozen ||
+                       !notification_iterator_init_method ||
+                       component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) {
+               ret = -1;
+               goto end;
+       }
+
+       source_class = container_of(component_class,
+               struct bt_component_class_source, parent);
+       source_class->methods.iterator.init = notification_iterator_init_method;
+
+end:
+       return ret;
+}
+
+int bt_component_class_source_set_notification_iterator_destroy_method(
+               struct bt_component_class *component_class,
+               bt_component_class_notification_iterator_destroy_method notification_iterator_destroy_method)
+{
+       struct bt_component_class_source *source_class;
+       int ret = 0;
+
+       if (!component_class || component_class->frozen ||
+                       !notification_iterator_destroy_method ||
+                       component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) {
+               ret = -1;
+               goto end;
+       }
+
+       source_class = container_of(component_class,
+               struct bt_component_class_source, parent);
+       source_class->methods.iterator.destroy =
+               notification_iterator_destroy_method;
+
+end:
+       return ret;
+}
+
+int bt_component_class_source_set_notification_iterator_seek_time_method(
+               struct bt_component_class *component_class,
+               bt_component_class_notification_iterator_seek_time_method notification_iterator_seek_time_method)
+{
+       struct bt_component_class_source *source_class;
+       int ret = 0;
+
+       if (!component_class || component_class->frozen ||
+                       !notification_iterator_seek_time_method ||
+                       component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) {
+               ret = -1;
+               goto end;
+       }
+
+       source_class = container_of(component_class,
+               struct bt_component_class_source, parent);
+       source_class->methods.iterator.seek_time =
+               notification_iterator_seek_time_method;
+
+end:
+       return ret;
+}
+
+int bt_component_class_filter_set_notification_iterator_init_method(
+               struct bt_component_class *component_class,
+               bt_component_class_notification_iterator_init_method notification_iterator_init_method)
+{
+       struct bt_component_class_filter *filter_class;
+       int ret = 0;
+
+       if (!component_class || component_class->frozen ||
+                       !notification_iterator_init_method ||
+                       component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
+               ret = -1;
+               goto end;
+       }
+
+       filter_class = container_of(component_class,
+               struct bt_component_class_filter, parent);
+       filter_class->methods.iterator.init = notification_iterator_init_method;
+
+end:
+       return ret;
+}
+
+int bt_component_class_filter_set_notification_iterator_destroy_method(
+               struct bt_component_class *component_class,
+               bt_component_class_notification_iterator_destroy_method notification_iterator_destroy_method)
+{
+       struct bt_component_class_filter *filter_class;
+       int ret = 0;
+
+       if (!component_class || component_class->frozen ||
+                       !notification_iterator_destroy_method ||
+                       component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
+               ret = -1;
+               goto end;
+       }
+
+       filter_class = container_of(component_class,
+               struct bt_component_class_filter, parent);
+       filter_class->methods.iterator.destroy =
+               notification_iterator_destroy_method;
+
+end:
+       return ret;
+}
+
+int bt_component_class_filter_set_notification_iterator_seek_time_method(
+               struct bt_component_class *component_class,
+               bt_component_class_notification_iterator_seek_time_method notification_iterator_seek_time_method)
+{
+       struct bt_component_class_filter *filter_class;
+       int ret = 0;
+
+       if (!component_class || component_class->frozen ||
+                       !notification_iterator_seek_time_method ||
+                       component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
+               ret = -1;
+               goto end;
+       }
+
+       filter_class = container_of(component_class,
+               struct bt_component_class_filter, parent);
+       filter_class->methods.iterator.seek_time =
+               notification_iterator_seek_time_method;
+
+end:
+       return ret;
+}
+
+int bt_component_class_set_description(
                struct bt_component_class *component_class,
                const char *description)
 {
        int ret = 0;
 
-       if (!component_class || !description) {
+       if (!component_class || component_class->frozen || !description) {
                ret = -1;
                goto end;
        }
@@ -274,7 +417,7 @@ int bt_component_class_add_destroy_listener(struct bt_component_class *class,
        int ret = 0;
        struct bt_component_class_destroy_listener listener;
 
-       if (!class || !func) {
+       if (!class || class->frozen || !func) {
                ret = -1;
                goto end;
        }
@@ -294,7 +437,8 @@ extern int bt_component_class_sink_set_add_iterator_method(
        struct bt_component_class_sink *sink_class;
        int ret = 0;
 
-       if (!component_class || !add_iterator_method ||
+       if (!component_class || component_class->frozen ||
+                       !add_iterator_method ||
                        component_class->type != BT_COMPONENT_CLASS_TYPE_SINK) {
                ret = -1;
                goto end;
@@ -315,7 +459,8 @@ extern int bt_component_class_filter_set_add_iterator_method(
        struct bt_component_class_filter *filter_class;
        int ret = 0;
 
-       if (!component_class || !add_iterator_method ||
+       if (!component_class || component_class->frozen ||
+                       !add_iterator_method ||
                        component_class->type !=
                        BT_COMPONENT_CLASS_TYPE_FILTER) {
                ret = -1;
@@ -329,3 +474,19 @@ extern int bt_component_class_filter_set_add_iterator_method(
 end:
        return ret;
 }
+
+int bt_component_class_freeze(
+               struct bt_component_class *component_class)
+{
+       int ret = 0;
+
+       if (!component_class) {
+               ret = -1;
+               goto end;
+       }
+
+       component_class->frozen = true;
+
+end:
+       return ret;
+}
This page took 0.027255 seconds and 4 git commands to generate.