Add bt_component_class_query_info() API
[babeltrace.git] / lib / component / component-class.c
index 22551f88c54c60d55a3da428adab72b71937e30b..4e337e030876fd5accb698f7a405817d873e64f3 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
@@ -56,6 +57,9 @@ void bt_component_class_destroy(struct bt_object *obj)
        if (class->description) {
                g_string_free(class->description, TRUE);
        }
+       if (class->help) {
+               g_string_free(class->help, TRUE);
+       }
        if (class->destroy_listeners) {
                g_array_free(class->destroy_listeners, TRUE);
        }
@@ -81,6 +85,11 @@ int bt_component_class_init(struct bt_component_class *class,
                goto error;
        }
 
+       class->help = g_string_new(NULL);
+       if (!class->help) {
+               goto error;
+       }
+
        class->destroy_listeners = g_array_new(FALSE, TRUE,
                sizeof(struct bt_component_class_destroy_listener));
        if (!class->destroy_listeners) {
@@ -98,12 +107,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 +135,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 +171,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 +217,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;
        }
@@ -213,13 +228,30 @@ end:
        return ret;
 }
 
+int bt_component_class_set_query_info_method(
+               struct bt_component_class *component_class,
+               bt_component_class_query_info_method query_info_method)
+{
+       int ret = 0;
+
+       if (!component_class || component_class->frozen || !query_info_method) {
+               ret = -1;
+               goto end;
+       }
+
+       component_class->methods.query_info = query_info_method;
+
+end:
+       return ret;
+}
+
 int bt_component_class_set_destroy_method(
                struct bt_component_class *component_class,
                bt_component_class_destroy_method destroy_method)
 {
        int ret = 0;
 
-       if (!component_class || !destroy_method) {
+       if (!component_class || component_class->frozen || !destroy_method) {
                ret = -1;
                goto end;
        }
@@ -230,13 +262,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;
        }
@@ -247,6 +415,23 @@ end:
        return ret;
 }
 
+int bt_component_class_set_help(
+               struct bt_component_class *component_class,
+               const char *help)
+{
+       int ret = 0;
+
+       if (!component_class || component_class->frozen || !help) {
+               ret = -1;
+               goto end;
+       }
+
+       g_string_assign(component_class->help, help);
+
+end:
+       return ret;
+}
+
 const char *bt_component_class_get_name(
                struct bt_component_class *component_class)
 {
@@ -263,10 +448,19 @@ enum bt_component_class_type bt_component_class_get_type(
 const char *bt_component_class_get_description(
                struct bt_component_class *component_class)
 {
-       return component_class && component_class->description ?
+       return component_class && component_class->description &&
+               component_class->description->str[0] != '\0' ?
                component_class->description->str : NULL;
 }
 
+const char *bt_component_class_get_help(
+               struct bt_component_class *component_class)
+{
+       return component_class && component_class->help &&
+               component_class->help->str[0] != '\0' ?
+               component_class->help->str : NULL;
+}
+
 BT_HIDDEN
 int bt_component_class_add_destroy_listener(struct bt_component_class *class,
                bt_component_class_destroy_listener_func func, void *data)
@@ -274,7 +468,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 +488,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 +510,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 +525,37 @@ 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;
+}
+
+struct bt_value *bt_component_class_query_info(
+               struct bt_component_class *component_class,
+               const char *action, struct bt_value *params)
+{
+       struct bt_value *results = NULL;
+
+       if (!component_class || !action || !params ||
+                       !component_class->methods.query_info) {
+               goto end;
+       }
+
+       results = component_class->methods.query_info(component_class,
+               action, params);
+
+end:
+       return results;
+}
This page took 0.028924 seconds and 4 git commands to generate.