ref.h: doc: fix typo
[babeltrace.git] / lib / plugin-system / sink.c
index 4f705a00134c11d68850e515ef1d3a9984c47a48..f49f93cce36a5399669a1ad0f28d1228bc0b2fb7 100644 (file)
@@ -27,6 +27,7 @@
  */
 
 #include <babeltrace/compiler.h>
+#include <babeltrace/values.h>
 #include <babeltrace/plugin/sink-internal.h>
 #include <babeltrace/plugin/component-internal.h>
 #include <babeltrace/plugin/notification/notification.h>
@@ -38,25 +39,45 @@ enum bt_component_status bt_component_sink_validate(
        enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
        struct bt_component_sink *sink;
 
-       sink = container_of(component, struct bt_component_sink, parent);
-       if (sink->registered_notifications_mask == 0) {
-               /*
-                * A sink must be registered to at least one notification type.
-                */
-               printf_error("Invalid sink component; not registered to any notification");
+       if (!component) {
                ret = BT_COMPONENT_STATUS_INVALID;
                goto end;
        }
 
-       if (!sink->handle_notification) {
-               printf_error("Invalid sink component; no notification handling callback defined.");
+       if (!component->class) {
                ret = BT_COMPONENT_STATUS_INVALID;
                goto end;
        }
+
+       if (component->class->type != BT_COMPONENT_TYPE_SINK) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       sink = container_of(component, struct bt_component_sink, parent);
+       if (!sink->consume) {
+               printf_error("Invalid sink component; no notification consumption callback defined.");
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       ret = component_input_validate(&sink->input);
+       if (ret) {
+               goto end;
+       }
 end:
        return ret;
 }
 
+static
+void bt_component_sink_destroy(struct bt_component *component)
+{
+       struct bt_component_sink *sink = container_of(component,
+                       struct bt_component_sink, parent);
+
+       component_input_fini(&sink->input);
+}
+
 BT_HIDDEN
 struct bt_component *bt_component_sink_create(
                struct bt_component_class *class, struct bt_value *params)
@@ -69,23 +90,49 @@ struct bt_component *bt_component_sink_create(
                goto end;
        }
 
+       sink->parent.class = bt_get(class);
        ret = bt_component_init(&sink->parent, bt_component_sink_destroy);
        if (ret != BT_COMPONENT_STATUS_OK) {
-               BT_PUT(sink);
-               goto end;
+               goto error;
+       }
+
+/*
+       ret = bt_component_sink_register_notification_type(&sink->parent,
+               BT_NOTIFICATION_TYPE_EVENT);
+       if (ret != BT_COMPONENT_STATUS_OK) {
+               goto error;
+       }
+*/
+       if (component_input_init(&sink->input)) {
+               goto error;
        }
 end:
        return sink ? &sink->parent : NULL;
+error:
+       BT_PUT(sink);
+       return NULL;
 }
 
-enum bt_component_status bt_component_sink_handle_notification(
-               struct bt_component *component,
-               struct bt_notification *notification)
+static
+enum bt_component_status validate_inputs(struct bt_component_sink *sink)
+{
+       size_t array_size = sink->input.iterators->len;
+
+       if (array_size < sink->input.min_count ||
+                       array_size > sink->input.max_count) {
+               return BT_COMPONENT_STATUS_INVALID;
+       }
+
+       return BT_COMPONENT_STATUS_OK;
+}
+
+enum bt_component_status bt_component_sink_consume(
+               struct bt_component *component)
 {
        enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
        struct bt_component_sink *sink = NULL;
 
-       if (!component || !notification) {
+       if (!component) {
                ret = BT_COMPONENT_STATUS_INVALID;
                goto end;
        }
@@ -96,12 +143,21 @@ enum bt_component_status bt_component_sink_handle_notification(
        }
 
        sink = container_of(component, struct bt_component_sink, parent);
-       assert(sink->handle_notification);
-       ret = sink->handle_notification(component, notification);
+       if (!sink->input.validated) {
+               ret = validate_inputs(sink);
+               if (ret != BT_COMPONENT_STATUS_OK) {
+                       goto end;
+               }
+               sink->input.validated = true;
+       }
+
+       assert(sink->consume);
+       ret = sink->consume(component);
 end:
        return ret;
 }
-
+/*
+static
 enum bt_component_status bt_component_sink_register_notification_type(
                struct bt_component *component, enum bt_notification_type type)
 {
@@ -133,3 +189,201 @@ enum bt_component_status bt_component_sink_register_notification_type(
 end:
        return ret;
 }
+*/
+enum bt_component_status bt_component_sink_set_consume_cb(
+               struct bt_component *component,
+               bt_component_sink_consume_cb consume)
+{
+       struct bt_component_sink *sink;
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+       if (!component) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) {
+               ret = BT_COMPONENT_STATUS_UNSUPPORTED;
+               goto end;
+       }
+
+       if (!component->initializing) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       sink = container_of(component, struct bt_component_sink, parent);
+       sink->consume = consume;
+end:
+       return ret;
+}
+
+enum bt_component_status bt_component_sink_set_add_iterator_cb(
+               struct bt_component *component,
+               bt_component_sink_add_iterator_cb add_iterator)
+{
+       struct bt_component_sink *sink;
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+       if (!component) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) {
+               ret = BT_COMPONENT_STATUS_UNSUPPORTED;
+               goto end;
+       }
+
+       if (!component->initializing) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       sink = container_of(component, struct bt_component_sink, parent);
+       sink->add_iterator = add_iterator;
+end:
+       return ret;
+}
+
+enum bt_component_status bt_component_sink_set_minimum_input_count(
+               struct bt_component *component,
+               unsigned int minimum)
+{
+       struct bt_component_sink *sink;
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+       if (!component) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) {
+               ret = BT_COMPONENT_STATUS_UNSUPPORTED;
+               goto end;
+       }
+
+       if (!component->initializing) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       sink = container_of(component, struct bt_component_sink, parent);
+       sink->input.min_count = minimum;
+end:
+       return ret;
+}
+
+enum bt_component_status bt_component_sink_set_maximum_input_count(
+               struct bt_component *component,
+               unsigned int maximum)
+{
+       struct bt_component_sink *sink;
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+       if (!component) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) {
+               ret = BT_COMPONENT_STATUS_UNSUPPORTED;
+               goto end;
+       }
+
+       if (!component->initializing) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       sink = container_of(component, struct bt_component_sink, parent);
+       sink->input.max_count = maximum;
+end:
+       return ret;
+}
+
+enum bt_component_status
+bt_component_sink_get_input_count(struct bt_component *component,
+               unsigned int *count)
+{
+       struct bt_component_sink *sink;
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+       if (!component || !count) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) {
+               ret = BT_COMPONENT_STATUS_UNSUPPORTED;
+               goto end;
+       }
+
+       sink = container_of(component, struct bt_component_sink, parent);
+       *count = (unsigned int) sink->input.iterators->len;
+end:
+       return ret;
+}
+
+enum bt_component_status
+bt_component_sink_get_input_iterator(struct bt_component *component,
+               unsigned int input, struct bt_notification_iterator **iterator)
+{
+       struct bt_component_sink *sink;
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+       if (!component || !iterator) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) {
+               ret = BT_COMPONENT_STATUS_UNSUPPORTED;
+               goto end;
+       }
+
+       sink = container_of(component, struct bt_component_sink, parent);
+       if (input >= (unsigned int) sink->input.iterators->len) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       *iterator = bt_get(g_ptr_array_index(sink->input.iterators, input));
+end:
+       return ret;
+}
+
+enum bt_component_status
+bt_component_sink_add_iterator(struct bt_component *component,
+               struct bt_notification_iterator *iterator)
+{
+       struct bt_component_sink *sink;
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+       if (!component || !iterator) {
+               ret = BT_COMPONENT_STATUS_INVALID;
+               goto end;
+       }
+
+       if (bt_component_get_type(component) != BT_COMPONENT_TYPE_SINK) {
+               ret = BT_COMPONENT_STATUS_UNSUPPORTED;
+               goto end;
+       }
+
+       sink = container_of(component, struct bt_component_sink, parent);
+       if (sink->input.iterators->len == sink->input.max_count) {
+               ret = BT_COMPONENT_STATUS_UNSUPPORTED;
+               goto end;
+       }
+
+       if (sink->add_iterator) {
+               ret = sink->add_iterator(component, iterator);
+               if (ret != BT_COMPONENT_STATUS_OK) {
+                       goto end;
+               }
+       }
+
+       g_ptr_array_add(sink->input.iterators, bt_get(iterator));
+end:
+       return ret;
+}
This page took 0.02748 seconds and 4 git commands to generate.